Получить все продукты Woocommerce из текущего идентификатора категории продуктов в WP_Query

У меня есть простая страница taxonomy-product_cat.php, на которой я пытаюсь отобразить только продукты в текущей категории. Прямо сейчас он отображает все продукты, а не только те, которые находятся в текущей категории. Вот мой код:

<ul class="products">

    <?php
       $current_cat_id = $wp_query->get_queried_object()->term_id;
       $args = array(
         'taxonomy'       => 'product_cat',
         'post_type'      => 'product',
         'post_status'    => 'publish',
         'posts_per_page' => -1,
         'tax_query'      => array(
             'taxonomy'   => 'product_cat',
             'field'      => 'term_id',
             'terms'      => $current_cat_id,
             'operator'   => 'IN'
         )
       );

       $products = new WP_Query( $args );

       while ( $products->have_posts() ) : $products->the_post();
           echo '<li><a href="'. get_permalink() .'"><div class="product__preview"><img src="' . get_the_post_thumbnail_url() . '"></div><span>' . get_the_title() . '</span></a></li>';
       endwhile;

       wp_reset_query();
       ?>
</ul>

Мой клиент постоянно меняет имена/слаги категории, поэтому мне нужно получить продукты по идентификатору категории. Любая идея, почему это генерирует все продукты, а не только те, которые находятся в текущей категории?


person crestinglight    schedule 11.09.2018    source источник
comment
хм, вроде ничего не изменилось :(   -  person crestinglight    schedule 11.09.2018
comment
Я удалил $wp-query-> и первый 'taxonomy' => 'product_cat', но по-прежнему получаю все продукты. Может ли это быть другой фрагмент кода, мешающий где-то еще?   -  person crestinglight    schedule 11.09.2018
comment
Все равно не повезло. :\   -  person crestinglight    schedule 11.09.2018
comment
Я попытался жестко закодировать бессмысленный номер в слот 'terms', и он по-прежнему показывает все продукты, так что, похоже, он вообще не читает термины.   -  person crestinglight    schedule 11.09.2018


Ответы (2)


Обновление 2

Налоговый запрос должен иметь 2 массива, встроенных друг в друга: 'tax_query' => array( array(

Удален первый ненужный 'taxonomy' => 'product_cat',

Заменено 'terms' => $current_cat_id, на 'terms' => array( get_queried_object()->term_id ),

Заменено wp_reset_query(); от wp_reset_postdata();

Ваш код будет:

$query = new WP_Query( array(
    'post_type'      => 'product',
    'post_status'    => 'publish',
    'posts_per_page' => -1,
    'tax_query'      => array( array(
        'taxonomy'   => 'product_cat',
        'field'      => 'term_id',
        'terms'      => array( get_queried_object()->term_id ),
    ) )
) );

while ( $query->have_posts() ) : $query->the_post();
    echo '<li><a href="'. get_permalink() .'"><div class="product__preview"><img src="' . get_the_post_thumbnail_url() . '"></div><span>' . get_the_title() . '</span></a></li>';
endwhile;

wp_reset_postdata();

Проверено и работает

person LoicTheAztec    schedule 11.09.2018

хотя его правильный ответ вы можете получить через ярлык категории.

    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => 10,
        'product_cat'    => 'category slug here',
    );
    $products_all = new WP_Query( $args );

проверена версия 4.6.1

person Arman H    schedule 31.10.2020