Продукты 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".