/** * Return a meta query for filtering by price. * @return array */ private function price_filter_meta_query() { if (isset($_GET['max_price']) || isset($_GET['min_price'])) { $meta_query = wc_get_min_max_price_meta_query($_GET); $meta_query['price_filter'] = true; return $meta_query; } return array(); }
/** * Query args. * * @param array $args Request args. * @param WP_REST_Request $request Request data. * @return array */ public function query_args($args, $request) { // Set post_status. $args['post_status'] = $request['status']; // Taxonomy query to filter products by type, category, // tag, shipping class, and attribute. $tax_query = array(); // Map between taxonomy name and arg's key. $taxonomies = array('product_cat' => 'category', 'product_tag' => 'tag', 'product_shipping_class' => 'shipping_class'); // Set tax_query for each passed arg. foreach ($taxonomies as $taxonomy => $key) { if (!empty($request[$key])) { $tax_query[] = array('taxonomy' => $taxonomy, 'field' => 'term_id', 'terms' => $request[$key]); } } // Filter product type by slug. if (!empty($request['type'])) { $tax_query[] = array('taxonomy' => 'product_type', 'field' => 'slug', 'terms' => $request['type']); } // Filter by attribute and term. if (!empty($request['attribute']) && !empty($request['attribute_term'])) { if (in_array($request['attribute'], wc_get_attribute_taxonomy_names(), true)) { $tax_query[] = array('taxonomy' => $request['attribute'], 'field' => 'term_id', 'terms' => $request['attribute_term']); } } if (!empty($tax_query)) { $args['tax_query'] = $tax_query; } // Filter featured. if (is_bool($request['featured'])) { $args['tax_query'][] = array('taxonomy' => 'product_visibility', 'field' => 'name', 'terms' => 'featured'); } // Filter by sku. if (!empty($request['sku'])) { $args['meta_query'] = $this->add_meta_query($args, array('key' => '_sku', 'value' => $request['sku'])); } // Filter by tax class. if (!empty($request['tax_class'])) { $args['meta_query'] = $this->add_meta_query($args, array('key' => '_tax_class', 'value' => 'standard' !== $request['tax_class'] ? $request['tax_class'] : '')); } // Price filter. if (!empty($request['min_price']) || !empty($request['max_price'])) { $args['meta_query'] = $this->add_meta_query($args, wc_get_min_max_price_meta_query($request)); } // Filter product in stock or out of stock. if (is_bool($request['in_stock'])) { $args['meta_query'] = $this->add_meta_query($args, array('key' => '_stock_status', 'value' => true === $request['in_stock'] ? 'instock' : 'outofstock')); } // Filter by on sale products. if (is_bool($request['on_sale'])) { $on_sale_key = $request['on_sale'] ? 'post__in' : 'post__not_in'; $args[$on_sale_key] += wc_get_product_ids_on_sale(); } // Apply all WP_Query filters again. if (is_array($request['filter'])) { $args = array_merge($args, $request['filter']); unset($args['filter']); } // Force the post_type argument, since it's not a user input variable. if (!empty($request['sku'])) { $args['post_type'] = array('product', 'product_variation'); } else { $args['post_type'] = $this->post_type; } return $args; }
/** * Test wc_get_min_max_price_meta_query() * * @since 2.7.0 */ public function test_wc_get_min_max_price_meta_query() { $meta_query = wc_get_min_max_price_meta_query(array('min_price' => 10, 'max_price' => 100)); $this->assertEquals(array('key' => '_price', 'value' => array(10, 100), 'compare' => 'BETWEEN', 'type' => 'DECIMAL'), $meta_query); }