Продукты WP_Query Woocommerce, которые принадлежат только отдельным категориям, только tax_query
Я использую WP_Query
для продуктов Woocommerce в попытке запросить продукты в определенной категории. Это синтаксис, который работал у меня -
$args = array(
'posts_per_page' => -1,
'product_cat' => 'category-slug-here',
'post_type' => 'product',
'orderby' => 'title',
);
$the_query = new WP_Query( $args );
// The Loop
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo '' . get_the_title() . '<br /><br />';
}
wp_reset_postdata();
Это возвращает данные, но я хочу передать идентификатор, а не категорию slug, для фильтрации, и я хочу найти продукты, которые существуют в нескольких категориях только.
Аргумент product_cat
не является родным для WP_Query
(по крайней мере, я могу найти), поэтому я предполагаю, что это что-то обычное для Woocommerce. Благодаря их документации я не смог найти ничего, что позволит мне фильтровать по идентификатору категории, а также использовать условие И для этой фильтрации.
Используя cat
, массив tax_query
и category__and
не дал никаких результатов. По сути, я хотел бы запросить все продукты, которые существуют как в категории ID 102, так и в 115. Если мне нужно использовать пули, я уверен, что есть способ получить эту информацию на основе идентификатора, который у меня есть, но я бы например, чтобы избежать 2 запросов для фильтрации по нескольким категориям.
Кто-нибудь знает, как это сделать?
ОБНОВЛЕНИЕ:. Я узнал, что разделение разрядов категорий запятыми в аргументе product_cat
приведет к эффекту "ИЛИ", поэтому он будет сочетать разные продукты от обоих, но это не то, что я я ищу. Итак, например:
'product_cat' => 'category-slug1, category-slug2'
будет возвращать продукты из обеих категорий в целом, но я все еще ищу способ найти отдельные продукты, которые ТОЛЬКО относятся к обоим или нескольким категориям.
Ответы
Ответ 1
Ничего себе, поэтому после нескольких часов ударов головой я так и смог решить эту проблему -
$args = array(
'posts_per_page' => -1,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'category-slug1'
),
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'category-slug2'
)
),
'post_type' => 'product',
'orderby' => 'title',
);
$the_query = new WP_Query( $args );
Это использует аргумент tax_query
, включая relation => 'AND'
, чтобы продукт попадал в категории BOTH.
Надеюсь, это поможет кому-то в будущем.
Мне также не удалось выяснить, как передать идентификатор, а не путать (хотя я уверен, что есть способ), но здесь функция для восстановления slug на основе ID:
$terms = get_term($YOURID, 'product_cat');
$theslug = $terms->slug;
Ответ 2
Для запроса по категории_ID это то, что сработало для меня.
// First obtain term id:
//...
$all_categories = get_categories( $args );
$cat_ids = array();
foreach ($all_categories as $cat)
{
array_push($cat_ids, $cat->term_id);
}
//Now use ids from array:
$args = array(
'posts_per_page' => -1,
'post_type' => 'product',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $cat_ids
)
)
);
Ответ 3
Из кода WordPress WP_Query
для параметров категории:
эквивалент ИЛИ
$args = array( 'product_cat' => 'category-slug1,category-slug2' ) );
эквивалент И
$args = array( 'product_cat' => 'category-slug1+category-slug2' );
например.
$query = new WP_Query( $args );
Ответ 4
В массиве массива "tax_query" вы можете указать "оператор", который будет выполняться в запросе. Вы можете добиться того, что хотите, используя оператор "AND".
$args = array(
'posts_per_page' => -1,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'category-slug1', 'category-slug2' )
'operator => 'AND',
),
),
'post_type' => 'product',
'orderby' => 'title',
);
$the_query = new WP_Query( $args );
Все продукты, выбранные этим запросом, будут соответствовать предоставленным "условиям". См. Эту ссылку для получения дополнительной информации: https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
Если связь когда-либо ломается, вот соответствующая информация:
operator (string) - Оператор для проверки. Возможные значения: "IN", "NOT IN", "AND", "EXISTS" и "NOT EXISTS". Значение по умолчанию - "IN".