it-roy-ru.com

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();

Это возвращает данные, но я хочу передать идентификатор, а не категорию категории, чтобы фильтровать, и я хочу найти продукты, которые существуют в нескольких категориях только

Аргумент product_cat не является родным для WP_Query (по крайней мере, я могу найти), поэтому я предполагаю, что это что-то особенное для Woocommerce. Из их документации я не смог найти ничего, что позволило бы мне фильтровать по идентификатору категории или использовать условие AND для этой фильтрации.

При использовании cat массив tax_query и category__and не дали никаких результатов. По сути, я хотел бы запросить все продукты, которые существуют как с идентификатором категории 102, так и с 115. Если мне нужно использовать слагов, я уверен, что есть способ получить эту информацию на основе имеющегося у меня идентификатора, но я бы хотел бы избежать 2 запросов для фильтрации по нескольким категориям.

Кто-нибудь знает, как этого добиться?

ОБНОВЛЕНИЕ: Я узнал, что разделение слагов категорий через запятую в аргументе product_cat будет производить эффект «ИЛИ», поэтому он будет объединять разные продукты из обоих, но это не то, что я ищу. Так, например:

 'product_cat' => 'category-slug1, category-slug2'

будет возвращать продукты из обеих категорий в целом, но я все еще ищу способ найти отдельные продукты, которые относятся ТОЛЬКО к обеим или нескольким категориям. 

12
RCNeil

Вау, так что после нескольких часов стука в мою голову, вот как я смог решить это - 

$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', чтобы убедиться, что продукт подпадает под обе категории.

Надеюсь, это поможет кому-то в будущем. 

Я также не смог выяснить, как передать идентификатор, а не слаг (хотя я уверен, что есть способ), но вот функция для извлечения слага на основе идентификатора:

$terms = get_term($YOURID, 'product_cat'); 
$theslug = $terms->slug; 
27
RCNeil

Для запроса по category_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
        )
    )
);
10
user2718602

Из кодекса WordPress на WP_Query для параметров категории :

эквивалент ИЛИ

$args = array( 'product_cat' => 'category-slug1,category-slug2' ) );

эквивалент И

$args = array( 'product_cat' => 'category-slug1+category-slug2' );

например.

$query = new WP_Query( $args );
6
Daniel Twork

Внутри массива 'tax_query' вы можете указать 'оператор' для выполнения запроса. Вы можете достичь того, что вы хотите, используя оператор «И».

$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

В случае разрыва связи вот соответствующая информация:

оператор (строка) - оператор для проверки. Возможные значения: «IN», «NOT IN», «AND», «EXISTS» и «NOT EXISTS». Значением по умолчанию является «IN». 

0
asdf