WC_Tracker::get_orders_by_gateway()
Get order details by gateway.
Method of the class: WC_Tracker{}
No Hooks.
Return
Array
.
Usage
$result = WC_Tracker::get_orders_by_gateway();
WC_Tracker::get_orders_by_gateway() WC Tracker::get orders by gateway code WC 8.7.0
private static function get_orders_by_gateway() { global $wpdb; if ( OrderUtil::custom_orders_table_usage_is_enabled() ) { $orders_table = OrdersTableDataStore::get_orders_table_name(); // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared $orders_and_gateway_details = $wpdb->get_results( " SELECT payment_method AS gateway, currency AS currency, SUM( total_amount ) AS totals, count( id ) AS counts FROM $orders_table WHERE status IN ( 'wc-completed', 'wc-processing', 'wc-refunded' ) GROUP BY gateway, currency; " ); // phpcs:enable } else { $orders_and_gateway_details = $wpdb->get_results( " SELECT gateway, currency, SUM(total) AS totals, COUNT(order_id) AS counts FROM ( SELECT orders.id AS order_id, MAX(CASE WHEN meta_key = '_payment_method' THEN meta_value END) gateway, MAX(CASE WHEN meta_key = '_order_total' THEN meta_value END) total, MAX(CASE WHEN meta_key = '_order_currency' THEN meta_value END) currency FROM {$wpdb->prefix}posts orders LEFT JOIN {$wpdb->prefix}postmeta order_meta ON order_meta.post_id = orders.id WHERE orders.post_type = 'shop_order' AND orders.post_status in ( 'wc-completed', 'wc-processing', 'wc-refunded' ) AND meta_key in( '_payment_method','_order_total','_order_currency') GROUP BY orders.id ) order_gateways GROUP BY gateway, currency " ); } $orders_by_gateway_currency = array(); // The associative array that is created as the result of array_reduce is passed to extract_group_key() // This function has the logic that will remove specific transaction identifiers that may sometimes be part of a // payment method. For example, two payments methods like 'WooDataPay ** #123' and 'WooDataPay ** #78' would // both have the same group_key 'WooDataPay **'. $orders_by_gateway = self::extract_group_key( // Convert into an associative array with a combination of currency and gateway as key. array_reduce( $orders_and_gateway_details, function( $result, $item ) { $item->gateway = preg_replace( '/\s+/', ' ', $item->gateway ); // Introduce currency as a prefix for the key. $key = $item->currency . '==' . $item->gateway; $result[ $key ] = $item; return $result; }, array() ), 'gateway' ); // Aggregate using group_key. foreach ( $orders_by_gateway as $orders_details ) { $gkey = $orders_details->group_key; // Remove currency as prefix of key for backward compatibility. if ( str_contains( $gkey, '==' ) ) { $tokens = preg_split( '/==/', $gkey ); $key = $tokens[1]; } else { $key = $gkey; } $key = str_replace( array( 'payment method', 'payment gateway', 'gateway' ), '', strtolower( $key ) ); $key = trim( preg_replace( '/[: ,#*\-_]+/', ' ', $key ) ); // Add currency as postfix of gateway for backward compatibility. $key = 'gateway_' . $key . '_' . $orders_details->currency; $count_key = $key . '_count'; $total_key = $key . '_total'; if ( array_key_exists( $count_key, $orders_by_gateway_currency ) || array_key_exists( $total_key, $orders_by_gateway_currency ) ) { $orders_by_gateway_currency[ $count_key ] = $orders_by_gateway_currency[ $count_key ] + $orders_details->counts; $orders_by_gateway_currency[ $total_key ] = $orders_by_gateway_currency[ $total_key ] + $orders_details->totals; } else { $orders_by_gateway_currency[ $count_key ] = $orders_details->counts; $orders_by_gateway_currency[ $total_key ] = $orders_details->totals; } } return $orders_by_gateway_currency; }