Automattic\WooCommerce\Admin\API\Reports\Orders\Stats
DataStore::update │ public static │ WC 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() 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 );
}