array( 'title' => __( 'Sales', 'woocommerce' ), 'charts' => array( array( 'title' => __('Overview', 'woocommerce'), 'description' => '', 'hide_title' => true, 'function' => 'woocommerce_sales_overview' ), array( 'title' => __('Sales by day', 'woocommerce'), 'description' => '', 'function' => 'woocommerce_daily_sales' ), array( 'title' => __('Sales by month', 'woocommerce'), 'description' => '', 'function' => 'woocommerce_monthly_sales' ), array( 'title' => __('Taxes by month', 'woocommerce'), 'description' => '', 'function' => 'woocommerce_monthly_taxes' ), array( 'title' => __('Product Sales', 'woocommerce'), 'description' => '', 'function' => 'woocommerce_product_sales' ), array( 'title' => __('Top sellers', 'woocommerce'), 'description' => '', 'function' => 'woocommerce_top_sellers' ), array( 'title' => __('Top earners', 'woocommerce'), 'description' => '', 'function' => 'woocommerce_top_earners' ), array( 'title' => __('Sales by category', 'woocommerce'), 'description' => '', 'function' => 'woocommerce_category_sales' ), array( 'title' => __('Sales by coupon', 'woocommerce'), 'description' => '', 'function' => 'woocommerce_coupon_sales' ) ) ), 'customers' => array( 'title' => __( 'Customers', 'woocommerce' ), 'charts' => array( array( 'title' => __('Overview', 'woocommerce'), 'description' => '', 'hide_title' => true, 'function' => 'woocommerce_customer_overview' ), ) ), 'stock' => array( 'title' => __( 'Stock', 'woocommerce' ), 'charts' => array( array( 'title' => __('Overview', 'woocommerce'), 'description' => '', 'hide_title' => true, 'function' => 'woocommerce_stock_overview' ), ) ) ) ); ?>

1 ) { ?>
' . $chart['title'] . ''; if ( $chart['description'] ) echo '

' . $chart['description'] . '

'; $func = $chart['function']; if ( $func && function_exists( $func ) ) $func(); } ?>
function weekendAreas(axes) { var markings = []; var d = new Date(axes.xaxis.min); // go to the first Saturday d.setUTCDate(d.getUTCDate() - ((d.getUTCDay() + 1) % 7)) d.setUTCSeconds(0); d.setUTCMinutes(0); d.setUTCHours(0); var i = d.getTime(); do { markings.push({ xaxis: { from: i, to: i + 2 * 24 * 60 * 60 * 1000 } }); i += 7 * 24 * 60 * 60 * 1000; } while (i < axes.xaxis.max); return markings; } function showTooltip(x, y, contents) { jQuery('
' + contents + '
').css( { position: 'absolute', display: 'none', top: y + 5, left: x + 5, padding: '5px 10px', border: '3px solid #3da5d5', background: '#288ab7' }).appendTo("body").fadeIn(200); } var previousPoint = null; jQuery("#placeholder").bind("plothover", function (event, pos, item) { if (item) { if (previousPoint != item.dataIndex) { previousPoint = item.dataIndex; jQuery("#tooltip").remove(); if (item.series.label=="") { var y = item.datapoint[1].toFixed(2); showTooltip(item.pageX, item.pageY, item.series.label + " - " + "" + y); } else if (item.series.label=="") { var y = item.datapoint[1]; showTooltip(item.pageX, item.pageY, item.series.label + " - " + y); } else { var y = item.datapoint[1]; showTooltip(item.pageX, item.pageY, y); } } } else { jQuery("#tooltip").remove(); previousPoint = null; } }); var dates = jQuery( "#from, #to" ).datepicker({ defaultDate: "", dateFormat: "yy-mm-dd", //changeMonth: true, //changeYear: true, numberOfMonths: 1, minDate: "-12M", maxDate: "+0D", showButtonPanel: true, showOn: "button", buttonImage: "plugin_url(); ?>/assets/images/calendar.png", buttonImageOnly: true, onSelect: function( selectedDate ) { var option = this.id == "from" ? "minDate" : "maxDate", instance = jQuery( this ).data( "datepicker" ), date = jQuery.datepicker.parseDate( instance.settings.dateFormat || jQuery.datepicker._defaults.dateFormat, selectedDate, instance.settings ); dates.not( this ).datepicker( "option", option, date ); } }); get_row(" SELECT SUM(meta.meta_value) AS total_sales, COUNT(posts.ID) AS total_orders FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_total' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') "); $total_sales = $order_totals->total_sales; $total_orders = $order_totals->total_orders; $discount_total = $wpdb->get_var(" SELECT SUM(meta.meta_value) AS total_sales FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key IN ('_order_discount', '_cart_discount') AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') "); $shipping_total = $wpdb->get_var(" SELECT SUM(meta.meta_value) AS total_sales FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_shipping' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') "); $order_items_serialized = $wpdb->get_col(" SELECT meta.meta_value AS items FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_items' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') "); if ( $order_items_serialized ) { foreach ( $order_items_serialized as $order_items_array ) { $order_items_array = maybe_unserialize( $order_items_array ); if ( is_array( $order_items_array ) ) foreach ( $order_items_array as $item ) $order_items += absint( $item['qty'] ); } } ?>

0) echo woocommerce_price($total_sales); else _e('n/a', 'woocommerce'); ?>

0 ) echo $total_orders . ' (' . $order_items . ' ' . __( 'items', 'woocommerce' ) . ')'; else _e('n/a', 'woocommerce'); ?>

0) echo woocommerce_price($total_sales/$total_orders); else _e('n/a', 'woocommerce'); ?>

0) echo number_format($order_items/$total_orders, 2); else _e('n/a', 'woocommerce'); ?>

0) echo woocommerce_price($discount_total); else _e('n/a', 'woocommerce'); ?>

0) echo woocommerce_price($shipping_total); else _e('n/a', 'woocommerce'); ?>

get_results(" SELECT posts.ID, posts.post_date FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID = rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND post_date > '" . date('Y-m-d', $start_date ) . "' AND post_date < '" . date('Y-m-d', strtotime('+1 day', $end_date ) ) . "' ORDER BY post_date ASC "); if ( $orders ) { foreach ( $orders as $order ) { $order_total = get_post_meta( $order->ID, '_order_total', true ); $time = strtotime( date( 'Ymd', strtotime( $order->post_date ) ) ) . '000'; if ( isset( $order_counts[ $time ] ) ) $order_counts[ $time ]++; else $order_counts[ $time ] = 1; if ( isset( $order_amounts[ $time ] ) ) $order_amounts[ $time ] = $order_amounts[ $time ] + $order_total; else $order_amounts[ $time ] = floatval( $order_total ); } } $order_counts_array = $order_amounts_array = array(); foreach ( $order_counts as $key => $count ) $order_counts_array[] = array( $key, $count ); foreach ( $order_amounts as $key => $amount ) $order_amounts_array[] = array( $key, $amount ); $order_data = array( 'order_counts' => $order_counts_array, 'order_amounts' => $order_amounts_array ); $chart_data = json_encode( $order_data ); ?> get_results(" SELECT posts.ID, posts.post_date FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID = rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND post_date > '" . date('Y-m-d', $start_date ) . "' AND post_date < '" . date('Y-m-d', strtotime('+1 day', $end_date ) ) . "' ORDER BY post_date ASC "); if ( $orders ) { foreach ( $orders as $order ) { $order_total = get_post_meta($order->ID, '_order_total', true); $time = strtotime( date( 'Ymd', strtotime( $order->post_date ) ) ) . '000'; $order_items_array = (array) get_post_meta( $order->ID, '_order_items', true ); foreach ( $order_items_array as $item ) $order_items += absint( $item['qty'] ); $total_sales += $order_total; $total_orders++; if ( isset( $order_counts[ $time ] ) ) $order_counts[ $time ]++; else $order_counts[ $time ] = 1; if ( isset( $order_amounts[ $time ] ) ) $order_amounts[ $time ] = $order_amounts[ $time ] + $order_total; else $order_amounts[ $time ] = floatval( $order_total ); } } ?>

0) echo woocommerce_price($total_sales); else _e('n/a', 'woocommerce'); ?>

0 ) echo $total_orders . ' (' . $order_items . ' ' . __( 'items', 'woocommerce' ) . ')'; else _e('n/a', 'woocommerce'); ?>

0) echo woocommerce_price($total_sales/$total_orders); else _e('n/a', 'woocommerce'); ?>

0) echo number_format($order_items/$total_orders, 2); else _e('n/a', 'woocommerce'); ?>

$count ) $order_counts_array[] = array($key, $count); foreach ( $order_amounts as $key => $amount ) $order_amounts_array[] = array($key, $amount); $order_data = array( 'order_counts' => $order_counts_array, 'order_amounts' => $order_amounts_array ); $chart_data = json_encode($order_data); ?> get_var( "SELECT post_date FROM $wpdb->posts WHERE post_date != 0 ORDER BY post_date ASC LIMIT 1;" ); $first_year = $first_year ? date( 'Y', strtotime( $first_year ) ) : date('Y'); $current_year = isset( $_POST['show_year'] ) ? $_POST['show_year'] : date( 'Y', current_time( 'timestamp' ) ); $start_date = strtotime( $current_year . '0101' ); $total_sales = $total_orders = $order_items = 0; $order_counts = $order_amounts = array(); for ( $count = 0; $count < 12; $count++ ) { $time = strtotime( date('Ym', strtotime( '+ ' . $count . ' MONTH', $start_date ) ) . '01' ) . '000'; if ( $time > current_time( 'timestamp' ) . '000' ) continue; $month = date( 'Ym', strtotime(date('Ym', strtotime('+ '.$count.' MONTH', $start_date)).'01') ); $months_orders = $wpdb->get_row(" SELECT SUM(meta.meta_value) AS total_sales, COUNT(posts.ID) AS total_orders FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_total' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND '{$month}' = date_format(posts.post_date,'%Y%m') "); $order_counts[ $time ] = (int) $months_orders->total_orders; $order_amounts[ $time ] = (float) $months_orders->total_sales; $total_orders += (int) $months_orders->total_orders; $total_sales += (float) $months_orders->total_sales; // Count order items $order_items_serialized = $wpdb->get_col(" SELECT meta.meta_value AS items FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_items' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND '{$month}' = date_format(posts.post_date,'%Y%m') "); if ($order_items_serialized) { foreach ( $order_items_serialized as $order_items_array ) { $order_items_array = maybe_unserialize($order_items_array); if ( is_array( $order_items_array ) ) foreach ( $order_items_array as $item ) $order_items += (int) $item['qty']; } } } ?>

0) echo woocommerce_price($total_sales); else _e('n/a', 'woocommerce'); ?>

0 ) echo $total_orders . ' (' . $order_items . ' ' . __( 'items', 'woocommerce' ) . ')'; else _e('n/a', 'woocommerce'); ?>

0) echo woocommerce_price($total_sales/$total_orders); else _e('n/a', 'woocommerce'); ?>

0) echo number_format($order_items/$total_orders, 2); else _e('n/a', 'woocommerce'); ?>

$count ) $order_counts_array[] = array( $key, $count ); foreach ( $order_amounts as $key => $amount ) $order_amounts_array[] = array( $key, $amount ); $order_data = array( 'order_counts' => $order_counts_array, 'order_amounts' => $order_amounts_array ); $chart_data = json_encode( $order_data ); ?> get_results(" SELECT posts.ID, posts.post_date FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID = rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND post_date > '" . date('Y-m-d', $start_date ) . "' AND post_date < '" . date('Y-m-d', strtotime('+1 day', $end_date ) ) . "' ORDER BY post_date ASC "); $found_products = array(); if ( $orders ) { foreach ($orders as $order) { $order_items = (array) get_post_meta( $order->ID, '_order_items', true ); foreach ( $order_items as $item ) $found_products[ $item['id'] ] = isset( $found_products[ $item['id'] ] ) ? $found_products[ $item['id'] ] + $item['qty'] : $item['qty']; } } asort( $found_products ); $found_products = array_reverse( $found_products, true ); $found_products = array_slice( $found_products, 0, 25, true ); reset( $found_products ); ?>

$sales ) { $width = $sales > 0 ? ( $sales / $max_sales ) * 100 : 0; $product_title = get_the_title( $product_id ); if ( $product_title ) { $product_name = ''. __( $product_title ) .''; $orders_link = admin_url( 'edit.php?s&post_status=all&post_type=shop_order&action=-1&s=' . urlencode( $product_title ) . '&shop_order_status=completed,processing,on-hold' ); } else { $product_name = __( 'Product does not exist', 'woocommerce' ); $orders_link = admin_url( 'edit.php?s&post_status=all&post_type=shop_order&action=-1&s=&shop_order_status=completed,processing,on-hold' ); } echo ''; } ?>
' . $product_name . '' . $sales . ' 
get_results(" SELECT posts.ID, posts.post_date FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID = rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND post_date > '" . date('Y-m-d', $start_date ) . "' AND post_date < '" . date('Y-m-d', strtotime('+1 day', $end_date ) ) . "' ORDER BY post_date ASC "); $found_products = array(); if ( $orders ) { foreach ($orders as $order) { $order_items = (array) get_post_meta( $order->ID, '_order_items', true ); foreach ( $order_items as $item ) { if ( isset( $item['line_total'] ) ) $row_cost = $item['line_total']; else $row_cost = $item['cost'] * $item['qty']; $found_products[ $item['id'] ] = isset( $found_products[ $item['id'] ] ) ? $found_products[ $item['id'] ] + $row_cost : $row_cost; } } } asort( $found_products ); $found_products = array_reverse( $found_products, true ); $found_products = array_slice( $found_products, 0, 25, true ); reset( $found_products ); ?>

$sales ) { $width = $sales > 0 ? ( round( $sales ) / round( $max_sales ) ) * 100 : 0; $product_title = get_the_title( $product_id ); if ( $product_title ) { $product_name = ''. __( $product_title ) .''; $orders_link = admin_url( 'edit.php?s&post_status=all&post_type=shop_order&action=-1&s=' . urlencode( $product_title ) . '&shop_order_status=completed,processing,on-hold' ); } else { $product_name = __( 'Product no longer exists', 'woocommerce' ); $orders_link = admin_url( 'edit.php?s&post_status=all&post_type=shop_order&action=-1&s=&shop_order_status=completed,processing,on-hold' ); } echo ''; } ?>
' . $product_name . '' . woocommerce_price( $sales ) . ' 
get_results(" SELECT meta.meta_value AS items, posts.post_date FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_items' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND posts.post_date > date_sub( NOW(), INTERVAL 1 YEAR ) ORDER BY posts.post_date ASC "); if ( $order_items ) { foreach ( $order_items as $order_item ) { $date = date( 'Ym', strtotime( $order_item->post_date ) ); $items = maybe_unserialize( $order_item->items ); foreach ( $items as $item ) { if ( ! in_array( $item['id'], $chosen_product_ids ) && ! in_array( $item['id'], $children_ids ) ) continue; if ( isset( $item['line_total'] ) ) $row_cost = $item['line_total']; else $row_cost = $item['cost'] * $item['qty']; if ( ! $row_cost ) continue; $product_sales[ $date ] = isset( $product_sales[ $date ] ) ? $product_sales[$date] + $item['qty'] : $item['qty']; $product_totals[ $date ] = isset( $product_totals[ $date ] ) ? $product_totals[ $date ] + $row_cost : $row_cost; if ( $product_sales[ $date ] > $max_sales ) $max_sales = $product_sales[ $date ]; if ( $product_totals[ $date ] > $max_totals ) $max_totals = $product_totals[ $date ]; } } } ?>

0) foreach ($product_sales as $date => $sales) : $width = ($sales>0) ? (round($sales) / round($max_sales)) * 100 : 0; $width2 = ($product_totals[$date]>0) ? (round($product_totals[$date]) / round($max_totals)) * 100 : 0; $orders_link = admin_url('edit.php?s&post_status=all&post_type=shop_order&action=-1&s=' . urlencode( implode( ' ', $chosen_product_titles ) ) . '&m=' . date('Ym', strtotime($date.'01')) . '&shop_order_status=completed,processing,on-hold'); echo ''; endforeach; else echo ''; ?>
'.date_i18n('F', strtotime($date.'01')).' '.$sales.''.woocommerce_price($product_totals[$date]).'    
'.__('No sales :(', 'woocommerce').'

array('user_registered'), 'role' => 'customer' ) ); $customers = $users_query->get_results(); $total_customers = (int) sizeof($customers); $customer_orders = $wpdb->get_row(" SELECT SUM(meta.meta_value) AS total_sales, COUNT(posts.ID) AS total_orders FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_total' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND posts.ID IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_customer_user' AND meta_value > 0 ) "); $total_customer_sales = $customer_orders->total_sales; $total_customer_orders = $customer_orders->total_orders; $guest_orders = $wpdb->get_row(" SELECT SUM(meta.meta_value) AS total_sales, COUNT(posts.ID) AS total_orders FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_total' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND posts.ID IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_customer_user' AND meta_value = 0 ) "); $total_guest_sales = $guest_orders->total_sales; $total_guest_orders = $guest_orders->total_orders; ?>

0) echo $total_customers; else _e('n/a', 'woocommerce'); ?>

0) echo woocommerce_price($total_customer_sales); else _e('n/a', 'woocommerce'); ?>

0) echo woocommerce_price($total_guest_sales); else _e('n/a', 'woocommerce'); ?>

0) echo $total_customer_orders; else _e('n/a', 'woocommerce'); ?>

0) echo $total_guest_orders; else _e('n/a', 'woocommerce'); ?>

0 && $total_customers>0) echo number_format($total_customer_orders/$total_customers, 2); else _e('n/a', 'woocommerce'); ?>

user_registered) > $start_date) : $time = strtotime(date('Ymd', strtotime($customer->user_registered))).'000'; if (isset($signups[ $time ])) : $signups[ $time ]++; else : $signups[ $time ] = 1; endif; endif; endforeach; $signups_array = array(); foreach ($signups as $key => $count) : $signups_array[] = array($key, $count); endforeach; $chart_data = json_encode($signups_array); ?> 'product', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => '_manage_stock', 'value' => 'yes' ), array( 'key' => '_stock', 'value' => $lowstockamount, 'compare' => '<=', 'type' => 'NUMERIC' ) ), 'tax_query' => array( array( 'taxonomy' => 'product_type', 'field' => 'slug', 'terms' => array('simple'), 'operator' => 'IN' ) ) ); $low_stock_products = (array) get_posts($args); // Get low stock product variations $args = array( 'post_type' => 'product_variation', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => '_stock', 'value' => $lowstockamount, 'compare' => '<=', 'type' => 'NUMERIC' ), array( 'key' => '_stock', 'value' => array('', false, null), 'compare' => 'NOT IN' ) ) ); $low_stock_variations = (array) get_posts($args); // Finally, get low stock variable products (where stock is set for the parent) $args = array( 'post_type' => array('product'), 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array( 'relation' => 'AND', array( 'key' => '_manage_stock', 'value' => 'yes' ), array( 'key' => '_stock', 'value' => $lowstockamount, 'compare' => '<=', 'type' => 'NUMERIC' ) ), 'tax_query' => array( array( 'taxonomy' => 'product_type', 'field' => 'slug', 'terms' => array('variable'), 'operator' => 'IN' ) ) ); $low_stock_variable_products = (array) get_posts($args); // Merge results $low_in_stock = array_merge($low_stock_products, $low_stock_variations, $low_stock_variable_products); ?>

'; foreach ( $low_in_stock as $product ) { $stock = (int) get_post_meta( $product->ID, '_stock', true ); $sku = get_post_meta( $product->ID, '_sku', true ); if ( $stock <= $nostockamount ) continue; $title = __( $product->post_title ); if ( $sku ) $title .= ' (' . __('SKU', 'woocommerce') . ': ' . $sku . ')'; if ( $product->post_type=='product' ) $product_url = admin_url( 'post.php?post=' . $product->ID . '&action=edit' ); else $product_url = admin_url( 'post.php?post=' . $product->post_parent . '&action=edit' ); printf( '
  • ' . _n('%d in stock', '%d in stock', $stock, 'woocommerce') . ' %s
  • ', $product_url, $stock, $title ); } echo ''; } else { echo '

    '.__('No products are low in stock.', 'woocommerce').'

    '; } ?>

    '; foreach ( $low_in_stock as $product ) { $stock = (int) get_post_meta( $product->ID, '_stock', true ); $sku = get_post_meta( $product->ID, '_sku', true ); if ( $stock > $nostockamount ) continue; $title = __( $product->post_title ); if ( $sku ) $title .= ' (' . __('SKU', 'woocommerce') . ': ' . $sku . ')'; if ( $product->post_type=='product' ) $product_url = admin_url( 'post.php?post=' . $product->ID . '&action=edit' ); else $product_url = admin_url( 'post.php?post=' . $product->post_parent . '&action=edit' ); printf( '
  • ' . _n('%d in stock', '%d in stock', $stock, 'woocommerce') . ' %s
  • ', $product_url, $stock, $title ); } echo ''; } else { echo '

    '.__('No products are out in stock.', 'woocommerce').'

    '; } ?>
    get_var( "SELECT post_date FROM $wpdb->posts WHERE post_date != 0 ORDER BY post_date ASC LIMIT 1;" ); if ( $first_year ) $first_year = date( 'Y', strtotime( $first_year ) ); else $first_year = date( 'Y' ); $current_year = isset( $_POST['show_year'] ) ? $_POST['show_year'] : date( 'Y', current_time( 'timestamp' ) ); $start_date = strtotime( $current_year . '0101' ); $total_tax = $total_sales_tax = $total_shipping_tax = $count = 0; $taxes = $tax_rows = $tax_row_labels = array(); for ( $count = 0; $count < 12; $count++ ) { $time = strtotime( date('Ym', strtotime( '+ ' . $count . ' MONTH', $start_date ) ) . '01' ); if ( $time > current_time( 'timestamp' ) ) continue; $month = date( 'Ym', strtotime( date( 'Ym', strtotime( '+ ' . $count . ' MONTH', $start_date ) ) . '01' ) ); $gross = $wpdb->get_var(" SELECT SUM( meta.meta_value ) AS order_tax FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_total' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND '{$month}' = date_format(posts.post_date,'%Y%m') "); $shipping = $wpdb->get_var(" SELECT SUM( meta.meta_value ) AS order_tax FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_shipping' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND '{$month}' = date_format(posts.post_date,'%Y%m') "); $order_tax = $wpdb->get_var(" SELECT SUM( meta.meta_value ) AS order_tax FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_tax' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND '{$month}' = date_format(posts.post_date,'%Y%m') "); $shipping_tax = $wpdb->get_var(" SELECT SUM( meta.meta_value ) AS order_tax FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_shipping_tax' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND '{$month}' = date_format(posts.post_date,'%Y%m') "); $order_taxes = $wpdb->get_col(" SELECT meta.meta_value AS order_tax FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_taxes' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND '{$month}' = date_format(posts.post_date,'%Y%m') "); $tax_rows = array(); if ( $order_taxes ) { foreach ( $order_taxes as $order_tax_rows ) { $order_tax_rows = maybe_unserialize( $order_tax_rows ); if ( $order_tax_rows ) foreach ( $order_tax_rows as $tax_row ) if ( isset( $tax_row['cart_tax'] ) ) { $tax_row_labels[] = $tax_row['label']; $tax_rows[ $tax_row['label'] ] = isset( $tax_rows[ $tax_row['label'] ] ) ? $tax_rows[ $tax_row['label'] ] + $tax_row['cart_tax'] + $tax_row['shipping_tax'] : $tax_row['cart_tax'] + $tax_row['shipping_tax']; } } } $taxes[ date( 'M', strtotime( $month . '01' ) ) ] = array( 'gross' => $gross, 'shipping' => $shipping, 'order_tax' => $order_tax, 'shipping_tax' => $shipping_tax, 'total_tax' => $shipping_tax + $order_tax, 'tax_rows' => $tax_rows ); $total_sales_tax += $order_tax; $total_shipping_tax += $shipping_tax; } $total_tax = $total_sales_tax + $total_shipping_tax; ?>

    0 ) echo woocommerce_price( $total_tax ); else _e( 'n/a', 'woocommerce' ); ?>

    0 ) echo woocommerce_price( $total_sales_tax ); else _e( 'n/a', 'woocommerce' ); ?>

    0 ) echo woocommerce_price( $total_shipping_tax ); else _e( 'n/a', 'woocommerce' ); ?>

    ' . $label . ''; ?> $tax ) { $total['gross'] = isset( $total['gross'] ) ? $total['gross'] + $tax['gross'] : $tax['gross']; $total['shipping'] = isset( $total['shipping'] ) ? $total['shipping'] + $tax['shipping'] : $tax['shipping']; $total['order_tax'] = isset( $total['order_tax'] ) ? $total['order_tax'] + $tax['order_tax'] : $tax['order_tax']; $total['shipping_tax'] = isset( $total['shipping_tax'] ) ? $total['shipping_tax'] + $tax['shipping_tax'] : $tax['shipping_tax']; $total['total_tax'] = isset( $total['total_tax'] ) ? $total['total_tax'] + $tax['total_tax'] : $tax['total_tax']; foreach ( $tax_row_labels as $label ) if ( isset( $tax['tax_rows'][ $label ] ) ) $total['tax_rows'][ $label ] = isset( $total['tax_rows'][ $label ] ) ? $total['tax_rows'][ $label ] + $tax['tax_rows'][ $label ] : $tax['tax_rows'][ $label ]; } echo ' '; foreach ( $tax_row_labels as $label ) if ( isset( $total['tax_rows'][ $label ] ) ) echo ''; else echo ''; ?> $tax ) { $alt = ( isset( $alt ) && $alt == 'alt' ) ? '' : 'alt'; echo ''; foreach ( $tax_row_labels as $label ) if ( isset( $tax['tax_rows'][ $label ] ) ) echo ''; else echo ''; echo ''; } ?>
    " href="#">[?] " href="#">[?] " href="#">[?] " href="#">[?] " href="#">[?] " href="#">[?]
    ' . __('Total', 'woocommerce') . ' ' . woocommerce_price( $total['gross'] ) . ' ' . woocommerce_price( $total['shipping'] ) . ' ' . woocommerce_price( $total['order_tax'] ) . ' ' . woocommerce_price( $total['shipping_tax'] ) . ' ' . woocommerce_price( $total['total_tax'] ) . ' ' . woocommerce_price( $total['gross'] - $total['shipping'] - $total['total_tax'] ) . '' . woocommerce_price( $total['tax_rows'][ $label ] ) . '' . woocommerce_price( 0 ) . '
    ' . $month . ' ' . woocommerce_price( $tax['gross'] ) . ' ' . woocommerce_price( $tax['shipping'] ) . ' ' . woocommerce_price( $tax['order_tax'] ) . ' ' . woocommerce_price( $tax['shipping_tax'] ) . ' ' . woocommerce_price( $tax['total_tax'] ) . ' ' . woocommerce_price( $tax['gross'] - $tax['shipping'] - $tax['total_tax'] ) . '' . woocommerce_price( $tax['tax_rows'][ $label ] ) . '' . woocommerce_price( 0 ) . '
    get_var( "SELECT post_date FROM $wpdb->posts WHERE post_date != 0 ORDER BY post_date ASC LIMIT 1;" ); $first_year = ( $first_year ) ? date( 'Y', strtotime( $first_year ) ) : date( 'Y' ); $current_year = isset( $_POST['show_year'] ) ? $_POST['show_year'] : date( 'Y', current_time( 'timestamp' ) ); $start_date = strtotime( $current_year . '0101' ); $categories = get_terms( 'product_cat', array( 'parent' => 0 ) ); ?>

    current_time( 'timestamp' ) . '000' ) continue; $month = date( 'Ym', strtotime( date( 'Ym', strtotime( '+ '. $count . ' MONTH', $start_date ) ) . '01' ) ); // Get order items $order_items_serialized = $wpdb->get_col(" SELECT meta.meta_value AS items FROM {$wpdb->posts} AS posts LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = '_order_items' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "') AND '{$month}' = date_format(posts.post_date,'%Y%m') "); if ( $order_items_serialized ) { foreach ( $order_items_serialized as $order_items_array ) { $order_items_array = maybe_unserialize( $order_items_array ); if ( is_array( $order_items_array ) ) foreach ( $order_items_array as $item ) { if ( ! isset( $item_sales[ $count ][ $item['id'] ] ) ) $item_sales[ $count ][ $item['id'] ] = 0; if ( ! empty( $item['line_total'] ) ) $item_sales[ $count ][ $item['id'] ] += $item['line_total']; } } } } if ( ! empty( $_POST['show_categories'] ) && sizeof( $_POST['show_categories'] ) > 0 ) { $show_categories = $include_categories = array_map( 'absint', $_POST['show_categories'] ); foreach( $show_categories as $cat ) $include_categories = array_merge( $include_categories, get_term_children( $cat, 'product_cat' ) ); $categories = get_terms( 'product_cat', array( 'include' => array_unique( $include_categories ) ) ); ?>
    = date ( 'm' ) && $current_year == date( 'Y' ) ) continue; $column_count++; ?> = date( 'm' ) && $current_year == date( 'Y' ) ) break; else $month_totals[ $count ] = 0; foreach ( $categories as $category ) { $cat_total = 0; $category_chart_data = $term_ids = array(); $term_ids = get_term_children( $category->term_id, 'product_cat' ); $term_ids[] = $category->term_id; $product_ids = get_objects_in_term( $term_ids, 'product_cat' ); if ( $category->parent > 0 ) $prepend = '— '; else $prepend = ''; $category_sales_html = ''; for ( $count = 0; $count < 12; $count++ ) { if ( $count >= date( 'm' ) && $current_year == date( 'Y' ) ) continue; if ( ! empty( $item_sales[ $count ] ) ) { $matches = array_intersect_key( $item_sales[ $count ], array_flip( $product_ids ) ); $total = array_sum( $matches ); $cat_total += $total; } else { $total = 0; } $month_totals[ $count ] += $total; $category_sales_html .= ''; $category_chart_data[] = array( strtotime( date( 'Ymd', strtotime( '2012-' . ( $count + 1 ) . '-01' ) ) ) . '000', $total ); } if ( $cat_total == 0 ) continue; $category_totals[] = $cat_total; $category_sales_html .= ''; $category_sales_html .= ''; echo $category_sales_html; $chart_data[ $category->name ] = $category_chart_data; if ( $cat_total > $top_cat ) { $top_cat = $cat_total; $top_cat_name = $category->name; } if ( $cat_total < $bottom_cat || $bottom_cat === '' ) { $bottom_cat = $cat_total; $bottom_cat_name = $category->name; } } sort( $category_totals ); echo ''; for ( $count = 0; $count < 12; $count++ ) if ( $count >= date( 'm' ) && $current_year == date( 'Y' ) ) break; else echo ''; echo ''; ?>
    ' . $prepend . $category->name . '' . woocommerce_price( $total ) . '' . woocommerce_price( $cat_total ) . '
    ' . __( 'Total', 'woocommerce' ) . '' . woocommerce_price( $month_totals[ $count ] ) . '' . woocommerce_price( array_sum( $month_totals ) ) . '

    1 ) : ?>

    0 ) echo woocommerce_price( array_sum( $category_totals ) / sizeof( $category_totals ) ); else echo __( 'N/A', 'woocommerce' ); ?>

    get_var( "SELECT post_date FROM $wpdb->posts WHERE post_date != 0 AND post_type='shop_order' ORDER BY post_date ASC LIMIT 1;" ); $first_year = ( $first_year ) ? date( 'Y', strtotime( $first_year ) ) : date( 'Y' ); $current_year = isset( $_POST['show_year'] ) ? $_POST['show_year'] : date( 'Y', current_time( 'timestamp' ) ); $start_date = strtotime( $current_year . '0101' ); $order_statuses = implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ); $coupons = $wpdb->get_col( " SELECT DISTINCT meta.meta_value FROM {$wpdb->postmeta} AS meta LEFT JOIN {$wpdb->posts} AS posts ON posts.ID = meta.post_id LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) LEFT JOIN {$wpdb->terms} AS term USING( term_id ) WHERE meta.meta_key = 'coupons' AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('{$order_statuses}') "); ?>

    0 ) : $coupons = $_POST['show_coupons']; $coupon_sales = $monthly_totals = array(); foreach( $coupons as $coupon ) : $monthly_sales = $wpdb->get_results($wpdb->prepare(" SELECT SUM(postmeta.meta_value) AS order_total, date_format(posts.post_date, '%%Y%%m') as month FROM {$wpdb->posts} AS posts INNER JOIN {$wpdb->postmeta} AS postmeta ON posts.ID=postmeta.post_ID INNER JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID INNER JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id ) INNER JOIN {$wpdb->terms} AS term USING( term_id ) WHERE postmeta.meta_key = '_order_total' AND tax.taxonomy = 'shop_order_status' AND term.slug IN ('{$order_statuses}') AND posts.post_type = 'shop_order' AND posts.post_status = 'publish' AND '{$current_year}' = date_format(posts.post_date,'%%Y') AND posts.ID IN ( SELECT post_id FROM {$wpdb->postmeta} AS meta WHERE meta.meta_key = 'coupons' AND meta.meta_value = '%s' ) GROUP BY month", $coupon ), OBJECT ); foreach( $monthly_sales as $sales ) { $month = $sales->month; $coupon_sales[$coupon][$month] = $sales->order_total; } endforeach; ?>
    = date ( 'm' ) && $current_year == date( 'Y' ) ) continue; $month = date( 'Ym', strtotime( date( 'Ym', strtotime( '+ '. $count . ' MONTH', $start_date ) ) . '01' ) ); // set elements before += them below $monthly_totals[$month] = 0; $column_count++; ?> $sales ) : echo ''; for( $count = 0; $count < 12; $count++ ) : if ( $count >= date ( 'm' ) && $current_year == date( 'Y' ) ) continue; $month = date( 'Ym', strtotime( date( 'Ym', strtotime( '+ '. $count . ' MONTH', $start_date ) ) . '01' ) ); $amount = isset( $sales[$month] ) ? $sales[$month] : 0; echo ''; $monthly_totals[$month] += $amount; $chart_data[$coupon_code][] = array( strtotime( date( 'Ymd', strtotime( $month . '01' ) ) ) . '000', $amount ); endfor; echo ''; // total sales across all months $coupon_totals[$coupon_code] = array_sum( $sales ); echo ''; endforeach; $top_coupon_name = current( array_keys( $coupon_totals, max( $coupon_totals ) ) ); $top_coupon_sales = $coupon_totals[$top_coupon_name]; $worst_coupon_name = current( array_keys( $coupon_totals, min( $coupon_totals ) ) ); $worst_coupon_sales = $coupon_totals[$worst_coupon_name]; $median_coupon_sales = array_values( $coupon_totals ); sort($median_coupon_sales); echo ''; foreach( $monthly_totals as $month => $totals ) echo ''; echo ''; ?>
    ' . $coupon_code . '' . woocommerce_price( $amount ) . '' . woocommerce_price( array_sum( $sales ) ) . '
    ' . __( 'Total', 'woocommerce' ) . '' . woocommerce_price( $totals ) . '' . woocommerce_price( array_sum( $monthly_totals ) ) . '

    1 ) : ?>