Получить список товаров для заданного ID категории
Я не смог найти правильный способ получить список всех товаров для заданного 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 есть товары. Есть идеи, как исправить мой код?

Я подозреваю, что основная проблема в том, что вам следует использовать объект 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!

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

изменить категорию (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(); ?>

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

Используя функцию 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;
}
