diff --git a/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-reports-orders-controller.php b/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-reports-orders-controller.php index bb1bee2d8dd..a5e9d881bb9 100644 --- a/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-reports-orders-controller.php +++ b/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-reports-orders-controller.php @@ -55,6 +55,8 @@ class WC_Admin_REST_Reports_Orders_Controller extends WC_Admin_REST_Reports_Cont $args['extended_info'] = $request['extended_info']; $args['refunds'] = $request['refunds']; $args['match'] = $request['match']; + $args['order_includes'] = $request['order_includes']; + $args['order_excludes'] = $request['order_excludes']; return $args; } @@ -385,6 +387,24 @@ class WC_Admin_REST_Reports_Orders_Controller extends WC_Admin_REST_Reports_Cont 'sanitize_callback' => 'wc_string_to_bool', 'validate_callback' => 'rest_validate_request_arg', ); + $params['order_includes'] = array( + 'description' => __( 'Limit result set to items that have the specified order ids.', 'woocommerce-admin' ), + 'type' => 'array', + 'sanitize_callback' => 'wp_parse_id_list', + 'validate_callback' => 'rest_validate_request_arg', + 'items' => array( + 'type' => 'integer', + ), + ); + $params['order_excludes'] = array( + 'description' => __( 'Limit result set to items that don\'t have the specified order ids.', 'woocommerce-admin' ), + 'type' => 'array', + 'sanitize_callback' => 'wp_parse_id_list', + 'validate_callback' => 'rest_validate_request_arg', + 'items' => array( + 'type' => 'integer', + ), + ); return $params; } diff --git a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-orders-data-store.php b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-orders-data-store.php index 44e2b55ba2e..5155e46a093 100644 --- a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-orders-data-store.php +++ b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-orders-data-store.php @@ -90,6 +90,16 @@ class WC_Admin_Reports_Orders_Data_Store extends WC_Admin_Reports_Data_Store imp } } + $included_orders = $this->get_included_orders( $query_args ); + if ( $included_orders ) { + $where_subquery[] = "{$order_stats_lookup_table}.order_id IN ({$included_orders})"; + } + + $excluded_orders = $this->get_excluded_orders( $query_args ); + if ( $excluded_orders ) { + $where_subquery[] = "{$order_stats_lookup_table}.order_id NOT IN ({$excluded_orders})"; + } + if ( $query_args['customer_type'] ) { $returning_customer = 'returning' === $query_args['customer_type'] ? 1 : 0; $where_subquery[] = "{$order_stats_lookup_table}.returning_customer = ${returning_customer}"; @@ -162,6 +172,8 @@ class WC_Admin_Reports_Orders_Data_Store extends WC_Admin_Reports_Data_Store imp 'status_is' => array(), 'extended_info' => false, 'refunds' => null, + 'order_includes' => array(), + 'order_excludes' => array(), ); $query_args = wp_parse_args( $query_args, $defaults ); $this->normalize_timezones( $query_args, $defaults );