diff --git a/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-products-controller.php b/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-products-controller.php index 4d9cac32f84..7cc05e3dd22 100644 --- a/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-products-controller.php +++ b/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-products-controller.php @@ -55,17 +55,18 @@ class WC_Admin_REST_Products_Controller extends WC_REST_Products_Controller { * @return array */ public function get_collection_params() { - $params = parent::get_collection_params(); - $params['product_name'] = array( - 'description' => __( 'Search for a similar product name.', 'woocommerce-admin' ), + $params = parent::get_collection_params(); + $params['search'] = array( + 'description' => __( 'Search by similar product name or sku.', 'woocommerce-admin' ), 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); return $params; } + /** - * Add product name filtering to the WC API. + * Add product name and sku filtering to the WC API. * * @param WP_REST_Request $request Request data. * @return array @@ -73,8 +74,9 @@ class WC_Admin_REST_Products_Controller extends WC_REST_Products_Controller { protected function prepare_objects_query( $request ) { $args = parent::prepare_objects_query( $request ); - if ( ! empty( $request['product_name'] ) ) { - $args['post_title__like'] = $request['product_name']; + if ( ! empty( $request['search'] ) ) { + $args['search'] = $request['search']; + unset( $args['s'] ); } return $args; @@ -87,30 +89,51 @@ class WC_Admin_REST_Products_Controller extends WC_REST_Products_Controller { * @return WP_Error|WP_REST_Response */ public function get_items( $request ) { - add_filter( 'posts_where', array( __CLASS__, 'add_wp_query_post_title_filter' ), 10, 2 ); + add_filter( 'posts_where', array( __CLASS__, 'add_wp_query_product_search_filter' ), 10, 2 ); + add_filter( 'posts_join', array( __CLASS__, 'add_wp_query_product_search_join' ), 10, 2 ); $response = parent::get_items( $request ); - remove_filter( 'posts_where', array( __CLASS__, 'add_wp_query_post_title_filter' ), 10 ); + remove_filter( 'posts_where', array( __CLASS__, 'add_wp_query_product_search_filter' ), 10 ); + remove_filter( 'posts_join', array( __CLASS__, 'add_wp_query_product_search_join' ), 10 ); return $response; } /** - * Add post title searching to WP Query + * Allow searching by product name or sku in WP Query * * @param string $where Where clause used to search posts. * @param object $wp_query WP_Query object. * @return string */ - public static function add_wp_query_post_title_filter( $where, $wp_query ) { + public static function add_wp_query_product_search_filter( $where, $wp_query ) { global $wpdb; - $post_title_search = $wp_query->get( 'post_title__like' ); - if ( $post_title_search ) { - $post_title_search = $wpdb->esc_like( $post_title_search ); - $post_title_search = ' \'%' . $post_title_search . '%\''; - $where .= ' AND ' . $wpdb->posts . '.post_title LIKE ' . $post_title_search; + $search = trim( $wp_query->get( 'search' ) ); + if ( $search ) { + $search = $wpdb->esc_like( $search ); + $search = "'%" . $search . "%'"; + $where .= ' AND (' . $wpdb->posts . '.post_title LIKE ' . $search; + $where .= wc_product_sku_enabled() ? ' OR ps_post_meta.meta_key = "_sku" AND ps_post_meta.meta_value LIKE ' . $search . ')' : ')'; } return $where; } + /** + * Join posts meta table when product search is present and meta query is not present. + * + * @param string $join Join clause used to search posts. + * @param object $wp_query WP_Query object. + * @return string + */ + public static function add_wp_query_product_search_join( $join, $wp_query ) { + global $wpdb; + + $search = trim( $wp_query->get( 'search' ) ); + if ( $search && wc_product_sku_enabled() ) { + $join .= ' INNER JOIN ' . $wpdb->postmeta . ' AS ps_post_meta ON ps_post_meta.post_id = ' . $wpdb->posts . '.ID'; + } + + return $join; + } + } diff --git a/plugins/woocommerce-admin/packages/components/src/search/autocompleters/product.js b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/product.js index 851c273c11a..427955c8d35 100644 --- a/plugins/woocommerce-admin/packages/components/src/search/autocompleters/product.js +++ b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/product.js @@ -30,7 +30,7 @@ export default { let payload = ''; if ( search ) { const query = { - product_name: search, + search: search, per_page: 10, orderby: 'popularity', }; @@ -40,7 +40,7 @@ export default { }, isDebounced: true, getOptionKeywords( product ) { - return [ product.name ]; + return [ product.name, product.sku ]; }, getFreeTextOptions( query ) { const label = (