From fae447014fb78c6e783c383545249c66e4ea0fed Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Fri, 15 Mar 2019 12:29:14 +0800 Subject: [PATCH] Update coupon search to allow searching by code (https://github.com/woocommerce/woocommerce-admin/pull/1800) * Add coupon code search filtering to REST API * Use search_code param in coupon search results * Use search_code param in coupon autocompleter * Override search param instead of adding search_code param --- ...class-wc-admin-rest-coupons-controller.php | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-coupons-controller.php b/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-coupons-controller.php index 2628d73aa40..dfde5b3ae8a 100644 --- a/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-coupons-controller.php +++ b/plugins/woocommerce-admin/includes/api/class-wc-admin-rest-coupons-controller.php @@ -24,4 +24,70 @@ class WC_Admin_REST_Coupons_Controller extends WC_REST_Coupons_Controller { */ protected $namespace = 'wc/v4'; + /** + * Get the query params for collections. + * + * @return array + */ + public function get_collection_params() { + $params = parent::get_collection_params(); + $params['search'] = array( + 'description' => __( 'Limit results to coupons with codes matching a given string.', 'woocommerce-admin' ), + 'type' => 'string', + 'validate_callback' => 'rest_validate_request_arg', + ); + return $params; + } + + + /** + * Add coupon code searching to the WC API. + * + * @param WP_REST_Request $request Request data. + * @return array + */ + protected function prepare_objects_query( $request ) { + $args = parent::prepare_objects_query( $request ); + + if ( ! empty( $request['search'] ) ) { + $args['search'] = $request['search']; + $args['s'] = false; + } + + return $args; + } + + /** + * Get a collection of posts and add the code search option to WP_Query. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + add_filter( 'posts_where', array( __CLASS__, 'add_wp_query_search_code_filter' ), 10, 2 ); + $response = parent::get_items( $request ); + remove_filter( 'posts_where', array( __CLASS__, 'add_wp_query_search_code_filter' ), 10 ); + return $response; + } + + /** + * Add code searching to the 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_search_code_filter( $where, $wp_query ) { + global $wpdb; + + $search = $wp_query->get( 'search' ); + if ( $search ) { + $search = $wpdb->esc_like( $search ); + $search = "'%" . $search . "%'"; + $where .= ' AND ' . $wpdb->posts . '.post_title LIKE ' . $search; + } + + return $where; + } + }