diff --git a/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-orders-controller.php b/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-orders-controller.php index 25b7a1dc2a4..82552b29368 100644 --- a/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-orders-controller.php +++ b/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-orders-controller.php @@ -30,10 +30,10 @@ class WC_Admin_REST_Orders_Controller extends WC_REST_Orders_Controller { */ public function get_collection_params() { $params = parent::get_collection_params(); + // This needs to remain a string to support extensions that filter Order Number. $params['number'] = array( 'description' => __( 'Limit result set to orders matching part of an order number.', 'woocommerce-admin' ), - 'type' => 'integer', - 'sanitize_callback' => 'absint', + 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); return $params; @@ -51,15 +51,22 @@ class WC_Admin_REST_Orders_Controller extends WC_REST_Orders_Controller { // Search by partial order number. if ( ! empty( $request['number'] ) ) { - $order_ids = $wpdb->get_col( + $partial_number = trim( $request['number'] ); + $limit = intval( $args['posts_per_page'] ); + $order_ids = $wpdb->get_col( $wpdb->prepare( - "SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND ID LIKE %s", - intval( $request['number'] ) . '%' + "SELECT ID + FROM {$wpdb->prefix}posts + WHERE post_type = 'shop_order' + AND ID LIKE %s + LIMIT %d", + $wpdb->esc_like( absint( $partial_number ) ) . '%', + $limit ) ); // Force WP_Query return empty if don't found any order. - $order_ids = ! empty( $order_ids ) ? $order_ids : array( 0 ); + $order_ids = empty( $order_ids ) ? array( 0 ) : $order_ids; $args['post__in'] = $order_ids; } diff --git a/plugins/woocommerce-admin/packages/components/src/search/autocompleters/orders.js b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/orders.js index c4c1b3df63f..042a7cda115 100644 --- a/plugins/woocommerce-admin/packages/components/src/search/autocompleters/orders.js +++ b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/orders.js @@ -3,7 +3,6 @@ * External dependencies */ import apiFetch from '@wordpress/api-fetch'; -import { isNaN } from 'lodash'; /** * WooCommerce dependencies @@ -24,18 +23,11 @@ import { computeSuggestionMatch } from './utils'; export default { name: 'orders', className: 'woocommerce-search__order-result', - inputType: 'number', options( search ) { let payload = ''; if ( search ) { - const number = parseInt( search ); - - if ( isNaN( number ) ) { - return; - } - const query = { - number, + number: search, per_page: 10, }; payload = stringifyQuery( query ); diff --git a/plugins/woocommerce-admin/tests/api/orders.php b/plugins/woocommerce-admin/tests/api/orders.php index 25f763ea2b6..2e3df65f7eb 100644 --- a/plugins/woocommerce-admin/tests/api/orders.php +++ b/plugins/woocommerce-admin/tests/api/orders.php @@ -46,7 +46,7 @@ class WC_Tests_API_Orders extends WC_REST_Unit_Test_Case { $request = new WP_REST_Request( 'GET', $this->endpoint ); $request->set_query_params( array( - 'number' => $order->get_id(), + 'number' => (string) $order->get_id(), ) );