Automattic\WooCommerce\Admin\API\Reports\Orders\Stats

DataStore::updatepublic staticWC 1.0

Update the database with stats data.

Method of the class: DataStore{}

Returns

Int|true|false. Returns -1 if order won't be processed, or a boolean indicating processing success.

Usage

$result = DataStore::update( $order );
$order(Order|OrderRefund) (required)
Order or refund to update row for.

DataStore::update() code WC 10.8.1

public static function update( $order ) {
	global $wpdb;
	$table_name = self::get_db_table_name();

	if ( ! $order->get_id() || ! $order->get_date_created() ) {
		return -1;
	}

	// Exclude test orders (e.g., WCPay test mode) from analytics stats.
	// Defense-in-depth: also checked in OrdersScheduler::import(), but
	// update() can be called directly outside of the import flow.
	if ( OrdersScheduler::is_test_order( $order ) ) {
		return -1;
	}

	$format = array(
		'%d',
		'%d',
		'%s',
		'%s',
		'%s',
		'%s',
		'%d',
		'%f',
		'%f',
		'%f',
		'%f',
		'%s',
		'%d',
		'%d',
	);

	$data = array(
		'order_id'           => $order->get_id(),
		'parent_id'          => $order->get_parent_id(),
		'date_created'       => $order->get_date_created()->date( 'Y-m-d H:i:s' ),
		'date_paid'          => $order->get_date_paid() ? $order->get_date_paid()->date( 'Y-m-d H:i:s' ) : null,
		'date_completed'     => $order->get_date_completed() ? $order->get_date_completed()->date( 'Y-m-d H:i:s' ) : null,
		'date_created_gmt'   => gmdate( 'Y-m-d H:i:s', $order->get_date_created()->getTimestamp() ),
		'num_items_sold'     => self::get_num_items_sold( $order ),
		'total_sales'        => $order->get_total(),
		'tax_total'          => $order->get_total_tax(),
		'shipping_total'     => $order->get_shipping_total(),
		'net_total'          => self::get_net_total( $order ),
		'status'             => self::normalize_order_status( $order->get_status() ),
		'customer_id'        => $order->get_report_customer_id(),
		'returning_customer' => $order->is_returning_customer(),
	);

	$order_fulfillment_status = '';
	if ( FeaturesUtil::feature_is_enabled( 'fulfillments' ) && true === self::has_fulfillment_status_column() && $order instanceof WC_Order ) {
		$order_fulfillment_status   = FulfillmentUtils::get_order_fulfillment_status( $order );
		$data['fulfillment_status'] = ( 'no_fulfillments' !== $order_fulfillment_status ) ? $order_fulfillment_status : null;
		$format[]                   = '%s';
	}

	/**
	 * Filters order stats data.
	 *
	 * @param array $data Data written to order stats lookup table.
	 * @param Order|OrderRefund $order  Order object.
	 *
	 * @since 4.0.0
	 */
	$data = apply_filters( 'woocommerce_analytics_update_order_stats_data', $data, $order );

	if ( 'shop_order_refund' === $order->get_type() ) {
		$parent_order = wc_get_order( $order->get_parent_id() );
		if ( $parent_order ) {
			$data['parent_id'] = $parent_order->get_id();
			$data['status']    = self::normalize_order_status( $parent_order->get_status() );

			$refund_type               = $order->get_meta( '_refund_type' );
			$uses_new_full_refund_data = OrderUtil::uses_new_full_refund_data();
			if ( 'full' === $refund_type && $uses_new_full_refund_data ) {
				$data['num_items_sold'] = -1 * self::get_num_items_sold( $parent_order );
				$data['tax_total']      = -1 * $parent_order->get_total_tax();
				$data['net_total']      = -1 * self::get_net_total( $parent_order );
				$data['shipping_total'] = -1 * $parent_order->get_shipping_total();
			}
		}
		/**
		 * Set date_completed and date_paid the same as date_created to avoid problems
		 * when they are being used to sort the data, as refunds don't have them filled
		*/
		$data['date_completed'] = $data['date_created'];
		$data['date_paid']      = $data['date_created'];
	}

	// Update or add the information to the DB.
	$result = $wpdb->replace( $table_name, $data, $format );

	/**
	 * Fires when order's stats reports are updated.
	 *
	 * @param int $order_id Order ID.
	 *
	 * @since 4.0.0.
	 */
	do_action( 'woocommerce_analytics_update_order_stats', $order->get_id() );

	// Check the rows affected for success. Using REPLACE can affect 2 rows if the row already exists.
	return ( 1 === $result || 2 === $result );
}