Получить список продуктов данной категории ID

14

Я не смог найти правильный способ получить список всех продуктов для данной категории ID (не название категории).

Код, который я использую для получения списка категорий, работает следующим образом:

$args = array(
           'orderby'    => $orderby,
           'order'      => $order,
           'hide_empty' => 0,
           'include'    => $ids,
           'parent'    => 0,
     ); 

$categories = get_terms( 'product_cat', $args );

Однако теперь для данной категории (скажем, 47) я не смог найти способ получить соответствующие продукты. Я попробовал следующий способ:

$args = array( 
    'posts_per_page' => 5,
    'offset'=> 1,
    'category' => 47
 );

$products = get_posts( $args );
echo var_dump($products);

Отладка $productsмассива всегда возвращает 0, что неверно, поскольку я знаю, что в категории есть продукты с идентификатором 47. Есть идеи, как исправить мой код?

Malloc
источник
1
categoryили product_category?
fuxia

Ответы:

19

Я подозреваю, что основная проблема заключается в том, что вы должны использовать WP_Queryобъект, а не get_posts(). Позднее по умолчанию возвращает только элементы с post_type postне продуктов,

Поэтому, учитывая категорию с идентификатором 26, следующий код вернет ее продукты (WooCommerce 3+):

    $args = array(
    'post_type'             => 'product',
    'post_status'           => 'publish',
    'ignore_sticky_posts'   => 1,
    'posts_per_page'        => '12',
    'tax_query'             => array(
        array(
            'taxonomy'      => 'product_cat',
            'field' => 'term_id', //This is optional, as it defaults to 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'.
        ),
        array(
            'taxonomy'      => 'product_visibility',
            'field'         => 'slug',
            'terms'         => 'exclude-from-catalog', // Possibly 'exclude-from-search' too
            'operator'      => 'NOT IN'
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

В более ранних версиях WooCommerce видимость сохранялась как мета-поле, поэтому код был бы:

    $args = array(
    'post_type'             => 'product',
    'post_status'           => 'publish',
    'ignore_sticky_posts'   => 1,
    'posts_per_page'        => '12',
    'meta_query'            => array(
        array(
            'key'           => '_visibility',
            'value'         => array('catalog', 'visible'),
            'compare'       => 'IN'
        )
    ),
    'tax_query'             => array(
        array(
            'taxonomy'      => 'product_cat',
            'field' => 'term_id', //This is optional, as it defaults to 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'.
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

Здесь мы только возвращаем видимые продукты, 12 на страницу.

Просмотрите http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters для получения более подробной информации о том, как работает таргетинг на категории - часто полезнее получить его по слагу, чем по идентификатору!

benz001
источник
Решение сработало. Хорошее объяснение.
Камеш Юнги
1
Начиная с Woocommerce 3, видимость меняется на таксономию вместо мета, поэтому вам нужно изменить meta_query на tax_query. См. Wordpress.stackexchange.com/a/262628/37355 .
jarnoan
Ваш вывод о get_posts()неверен. Вы можете заменить new WP_Query($args)на get_posts($args)в своем коде, и это будет работать.
Бьорн
2

изменить категорию (category-slug-name) по идентификатору, имени или слагу

<?php

$args = array( 'post_type' => 'product', 'stock' => 1, 'posts_per_page' => 2,'product_cat' => 'category-slug-name', 'orderby' =>'date','order' => 'ASC' );
  $loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
global $product; 
?>
Within loop we can fetch Product image, title, description, price etc. 

<?phpendwhile;wp_reset_query(); ?>
dalveer
источник
2

Немного опоздал, но хотел бы уточнить вещи и дать более четкий ответ. Пользователь @ benz001 дал возможный правильный ответ, но сказал что-то не так: get_postsвозвращает любой тип пост-типов, по умолчанию postsпост-тип, как WP_Query. Реальные различия между ними прекрасно объясняются ЗДЕСЬ .

Дело в том, что ОП просто не хватает некоторых параметров в $argsмассиве:

  • Определение пост-типа он ищет:

        'post_type'             => 'product',
  • И модификация «таксономической части» поискового запроса:

        'tax_query' => array(
            array(
                'taxonomy' => 'product_cat',
                'terms' => 26,
                'operator' => 'IN',
            )
        )

Таким образом, ваши следующие строки

$products = new WP_Query($args);
var_dump($products);

Покажет вам необходимые продукты :)

Все остальные дополнительные параметры, показанные @ benz001, конечно, действительны, но не запрашиваются OP, поэтому я решил оставить их в этом ответе.

Эренор Пас
источник
2
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));
Kaspi
источник
ОП специально попросил получить продукты с использованием идентификатора категории, однако это помогло мне, так что я все равно буду голосовать. Просто надо знать , что не дает ответа на исходный вопрос
dKen