WooCommerce ищет товары в ценовом диапазоне, используя WP_Query

В настоящее время я создаю свою собственную функцию расширенного поиска для веб-сайта WordPress с помощью Woocommerce. Вы должны быть в состоянии искать, используя фильтр:

  • категория
  • Мин. / Макс. Цена

Мой текущий прогресс прилагается ниже. Это позволяет указать слагов категории в параметре URL. Возвращены будут сообщения, которые соответствуют:

/**
* Default arguments
* @var array
*/

$query = array(
'post_status' => 'publish',
'post_type' => 'product',
'posts_per_page' => 10,
);

/**
* Category search
*/

if(isset($_GET['categories']) && $_GET['categories']) {
/**
* Comma seperated --- explode
* @var [type]
*/

$categories = explode(',', $_GET['categories']);

/**
* Add "or" parameter
*/

$query['tax_query']['relation'] = 'OR';

/**
* Add terms
*/

foreach($categories as $category) {
$query['tax_query'][] = array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $category,
);
}
}
/**
* Fetch
*/

$wp_query = new WP_Query($query);

Теперь, когда это прекрасно работает, когда вы ищете категории, кажется, что это становится намного сложнее, когда вам нужно искать по ценам.

В сыром SQL будет работать что-то вроде ниже:

SELECT DISTINCT ID, post_parent, post_type FROM $wpdb->posts
INNER JOIN $wpdb->postmeta ON ID = post_id
WHERE post_type IN ( 'product', 'product_variation' ) AND post_status = 'publish' AND meta_key = '_price' AND meta_value BETWEEN 200 AND 1000

Я понятия не имею, как я мог бы реализовать это с помощью WP_Query.

0

Решение

Вы можете комбинировать несколько метаданных при использовании WP_Query (или get_posts, которые, как я обнаружил, менее навязчивы в использовании).

http://codex.wordpress.org/Class_Reference/WP_Meta_Query

http://codex.wordpress.org/Class_Reference/WP_Query

Вы можете объединить их, сделав что-то вроде этого

$myposts = get_posts(
array(
'post_type' => array('product', 'product_variation'),
'meta_query' => array(
array(
'key' => '_price',
'value' => '200',
'compare' => '>='
),
array(
'key' => '_price',
'value' => '2000',
'compare' => '<='
)
)
)
);
3

Другие решения

Решение, вдохновленное @Niels van Renselaar, но более чистое:

$query = array(
'post_status' => 'publish',
'post_type' => 'product',
'posts_per_page' => 10,
'meta_query' => array(
array(
'key' => '_price',
'value' => array(50, 100),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
)
)
);

$wpquery = WP_Query($query); // return 10 products within the price range 50 - 100
3

Если вы работали в цикле woocommerce, когда вы можете использовать хук WC

add_action( 'woocommerce_product_query', 'example_product_query_price' );

function example_product_query_price ( $q ) {
$meta_query = $q->get( 'meta_query' );

$meta_query[] = array(
'key'     => '_regular_price',
'value'   => array(
300000 ,
900000
),
'compare' => 'BETWEEN',
'type'=> 'NUMERIC'
);

$q->set( 'meta_query', $meta_query );
}
3
По вопросам рекламы [email protected]