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

7 мая 2014 г., 00:06:11
Просмотры: 172K
Голосов: 30

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

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

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

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

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

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

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

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

2
Комментарии

category или product_category?

fuxia fuxia
14 мая 2014 г. 21:34:10

вы используете echo с var_dump. Это всегда будет показывать 0 или 1. Кстати, объект ничего не получил, так как 0 означает false. Проблема в том, что вы не указали post_type, поэтому по умолчанию используется "post". Скорее всего, нет категории с ID 47 для типа записи post.

Behemoth Behemoth
9 мая 2023 г. 07:00:17
Все ответы на вопрос 6
3
30

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

Итак, для категории с ID 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', //Это необязательно, по умолчанию используется 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Возможные значения: 'IN', 'NOT IN', 'AND'.
        ),
        array(
            'taxonomy'      => 'product_visibility',
            'field'         => 'slug',
            'terms'         => 'exclude-from-catalog', // Также возможно 'exclude-from-search'
            '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', //Это необязательно, по умолчанию используется 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Возможные значения: 'IN', 'NOT IN', 'AND'.
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

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

Подробнее о работе с категориями можно узнать в документации WP_Query - часто удобнее получать категории по ярлыку (slug), а не по ID!

2 июн. 2014 г. 13:53:57
Комментарии

Решение сработало. Хорошее объяснение.

Kamesh Jungi Kamesh Jungi
10 июл. 2015 г. 09:26:09

Начиная с WooCommerce 3, видимость была изменена на таксономию вместо мета, поэтому вам нужно изменить meta_query на tax_query. Смотрите https://wordpress.stackexchange.com/a/262628/37355.

jarnoan jarnoan
18 окт. 2017 г. 10:10:14

Ваш вывод о get_posts() неверен. Вы можете заменить new WP_Query($args) на get_posts($args) в вашем коде, и это будет работать.

Bjorn Bjorn
14 июл. 2018 г. 12:43:59
1
24
$products = wc_get_products([
   'category' => get_term($category_id, 'product_cat')->slug
]);
29 июл. 2019 г. 14:54:03
Комментарии

Автор вопроса явно просил получить товары по ID категории, однако это помогло мне, так что я все равно проголосую за. Просто учтите, что это не отвечает на исходный вопрос

dKen dKen
24 сент. 2019 г. 20:34:18
0

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

<?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; 
?>
Внутри цикла мы можем получить изображение товара, название, описание, цену и т.д.

<?phpendwhile;wp_reset_query(); ?>
19 янв. 2015 г. 14:21:04
0

Немного запоздалый ответ, но хотелось бы внести ясность и предоставить более чистое решение. Пользователь @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, конечно, действительны, но не требовались автором вопроса, поэтому я решил не включать их в этот ответ.

18 нояб. 2016 г. 13:22:49
0

Используя функцию WordPress get_posts

Получение всех ID товаров WooCommerce по категории

В приведенном ниже коде достаточно только указать название категории, и он заработает.

$all_ids = get_posts( array(
  'post_type' => 'product',
  'numberposts' => -1,
  'post_status' => 'publish',
  'fields' => 'ids',
  'tax_query' => array(
     array(
        'taxonomy' => 'product_cat',
        'field' => 'slug',
        'terms' => 'your_product_category', /*название категории*/
        'operator' => 'IN',
        )
     ),
  ));
  foreach ( $all_ids as $id ) {
     echo $id;
  }
16 сент. 2020 г. 13:25:39
0

Это работает при использовании файла шаблона taxonomy-product-cat.php

$products = wc_get_products(['category_id' => get_queried_object_id()]);
2 дек. 2021 г. 12:58:23