WC_API_Reports::get_sales_report()publicWC 2.1

Get the sales report

Method of the class: WC_API_Reports{}

Hooks from the method

Return

Array|WP_Error.

Usage

$WC_API_Reports = new WC_API_Reports();
$WC_API_Reports->get_sales_report( $fields, $filter );
$fields(string)
fields to include in response
Default: null
$filter(array)
date filtering
Default: array()

Changelog

Since 2.1 Introduced.

WC_API_Reports::get_sales_report() code WC 8.9.0

public function get_sales_report( $fields = null, $filter = array() ) {

	// check user permissions
	$check = $this->validate_request();

	// check for WP_Error
	if ( is_wp_error( $check ) ) {
		return $check;
	}

	// set date filtering
	$this->setup_report( $filter );

	// new customers
	$users_query = new WP_User_Query(
		array(
			'fields' => array( 'user_registered' ),
			'role'   => 'customer',
		)
	);

	$customers = $users_query->get_results();

	foreach ( $customers as $key => $customer ) {
		if ( strtotime( $customer->user_registered ) < $this->report->start_date || strtotime( $customer->user_registered ) > $this->report->end_date ) {
			unset( $customers[ $key ] );
		}
	}

	$total_customers = count( $customers );
	$report_data     = $this->report->get_report_data();
	$period_totals   = array();

	// setup period totals by ensuring each period in the interval has data
	for ( $i = 0; $i <= $this->report->chart_interval; $i ++ ) {

		switch ( $this->report->chart_groupby ) {
			case 'day' :
				$time = date( 'Y-m-d', strtotime( "+{$i} DAY", $this->report->start_date ) );
				break;
			default :
				$time = date( 'Y-m', strtotime( "+{$i} MONTH", $this->report->start_date ) );
				break;
		}

		// set the customer signups for each period
		$customer_count = 0;
		foreach ( $customers as $customer ) {
			if ( date( ( 'day' == $this->report->chart_groupby ) ? 'Y-m-d' : 'Y-m', strtotime( $customer->user_registered ) ) == $time ) {
				$customer_count++;
			}
 			}

		$period_totals[ $time ] = array(
			'sales'     => wc_format_decimal( 0.00, 2 ),
			'orders'    => 0,
			'items'     => 0,
			'tax'       => wc_format_decimal( 0.00, 2 ),
			'shipping'  => wc_format_decimal( 0.00, 2 ),
			'discount'  => wc_format_decimal( 0.00, 2 ),
			'customers' => $customer_count,
		);
	}

	// add total sales, total order count, total tax and total shipping for each period
	foreach ( $report_data->orders as $order ) {
		$time = ( 'day' === $this->report->chart_groupby ) ? date( 'Y-m-d', strtotime( $order->post_date ) ) : date( 'Y-m', strtotime( $order->post_date ) );

		if ( ! isset( $period_totals[ $time ] ) ) {
			continue;
		}

		$period_totals[ $time ]['sales']    = wc_format_decimal( $order->total_sales, 2 );
		$period_totals[ $time ]['tax']      = wc_format_decimal( $order->total_tax + $order->total_shipping_tax, 2 );
		$period_totals[ $time ]['shipping'] = wc_format_decimal( $order->total_shipping, 2 );
	}

	foreach ( $report_data->order_counts as $order ) {
		$time = ( 'day' === $this->report->chart_groupby ) ? date( 'Y-m-d', strtotime( $order->post_date ) ) : date( 'Y-m', strtotime( $order->post_date ) );

		if ( ! isset( $period_totals[ $time ] ) ) {
			continue;
		}

		$period_totals[ $time ]['orders']   = (int) $order->count;
	}

	// add total order items for each period
	foreach ( $report_data->order_items as $order_item ) {
		$time = ( 'day' === $this->report->chart_groupby ) ? date( 'Y-m-d', strtotime( $order_item->post_date ) ) : date( 'Y-m', strtotime( $order_item->post_date ) );

		if ( ! isset( $period_totals[ $time ] ) ) {
			continue;
		}

		$period_totals[ $time ]['items'] = (int) $order_item->order_item_count;
	}

	// add total discount for each period
	foreach ( $report_data->coupons as $discount ) {
		$time = ( 'day' === $this->report->chart_groupby ) ? date( 'Y-m-d', strtotime( $discount->post_date ) ) : date( 'Y-m', strtotime( $discount->post_date ) );

		if ( ! isset( $period_totals[ $time ] ) ) {
			continue;
		}

		$period_totals[ $time ]['discount'] = wc_format_decimal( $discount->discount_amount, 2 );
	}

	$sales_data  = array(
		'total_sales'       => $report_data->total_sales,
		'net_sales'         => $report_data->net_sales,
		'average_sales'     => $report_data->average_sales,
		'total_orders'      => $report_data->total_orders,
		'total_items'       => $report_data->total_items,
		'total_tax'         => wc_format_decimal( $report_data->total_tax + $report_data->total_shipping_tax, 2 ),
		'total_shipping'    => $report_data->total_shipping,
		'total_refunds'     => $report_data->total_refunds,
		'total_discount'    => $report_data->total_coupons,
		'totals_grouped_by' => $this->report->chart_groupby,
		'totals'            => $period_totals,
		'total_customers'   => $total_customers,
	);

	return array( 'sales' => apply_filters( 'woocommerce_api_report_response', $sales_data, $this->report, $fields, $this->server ) );
}