Введение
Функция wc_get_products() — стандартный API WooCommerce для безопасного получения товаров из базы данных с поддержкой HPOS и встроенного кэширования.
Версия WooCommerce
Какие задачи решает:
- Выборка товаров по любым критериям (категории, цены, остатки, теги, акции и статусы);
- Замена прямых SQL-запросов и
WP_Queryна нативные типизированные объектыWC_Product; - Оптимизация нагрузки на базу данных и оперативную память при пакетной обработке (
'return' => 'ids').
Что возвращает
Формат возвращаемых данных зависит от переданного аргумента return:
Массив объектов товаров
По умолчанию ('return' => 'objects') функция возвращает массив объектов, наследующих базовый класс WC_Product.
Стандартные классы WooCommerce (Core):
WC_Product_Simple— простой товар (физический или цифровой). Дефолтный класс WooCommerce.WC_Product_Variable— вариативный товар-контейнер, объединяющий набор вариаций.WC_Product_Variation— отдельная вариация вариативного товара со своей ценой, артикулом и остатком.WC_Product_Grouped— сгруппированный товар (набор простых товаров в одной карточке).WC_Product_External— внешний или партнерский товар со ссылкой на сторонний ресурс.
Классы популярных расширений WooCommerce:
WC_Product_Subscription— простая подписка (WooCommerce Subscriptions).WC_Product_Variable_Subscription— вариативная подписка (WooCommerce Subscriptions).WC_Product_Bundle— комплект товаров (WooCommerce Product Bundles).WC_Product_Composite— составной товар (WooCommerce Composite Products).WC_Product_Booking— бронируемый товар или услуга (WooCommerce Bookings).
Сторонние плагины могут регистрировать собственные классы через фабрику WC_Product_Factory и фильтр woocommerce_product_class.
$products = wc_get_products( [
'status' => 'publish',
'limit' => 5,
] );
foreach ( $products as $product ) {
echo $product->get_name() . ' — ' . $product->get_price_html();
}
Массив идентификаторов
При 'return' => 'ids' функция возвращает плоский массив целых чисел int[] с ID товаров (например, [101, 102, 105]). Данные объектов не гидратируются, что многократно экономит оперативную память.
Объект пагинации
При 'paginate' => true возвращается объект stdClass со свойствами:
products— массив найденных товаров (WC_Product[]или массив IDint[]);total— общее количество подходящих товаров (int);max_num_pages— доступное количество страниц (int).
Значения по умолчанию
Если вызвать функцию без параметров, WooCommerce применит системные значения из классов WC_Product_Query и WC_Object_Query:
[
'status' => [ 'draft', 'pending', 'private', 'publish' ],
'type' => [ 'simple', 'grouped', 'external', 'variable' ],
'limit' => get_option( 'posts_per_page' ), // обычно 10
'page' => 1,
'offset' => '',
'order' => 'DESC',
'orderby' => 'date',
'return' => 'objects',
'paginate' => false,
'category' => [],
'tag' => [],
'shipping_class' => [],
'include' => [],
'exclude' => [],
]
Внимание к статусам
Часто используемые параметры
limit, page и offset
limit(int): количество товаров. Значение-1запрашивает все товары.page(int): номер текущей страницы выборки (по умолчанию1).offset(int): количество пропускаемых товаров от начала списка.
status и visibility
status(string|array): статус записи —publish,draft,pending,private,trash.visibility(string): видимость в каталоге —visible(каталог и поиск),catalog,search,hidden.
type и featured
type(string|array): тип товара —simple,variable,grouped,external,variation.featured(bool):true— только рекомендуемые товары (со звездочкой в админке),false— только обычные.
stock_status и manage_stock
stock_status(string): статус склада —instock(в наличии),outofstock(нет в наличии),onbackorder(предзаказ).manage_stock(bool): включено ли управление запасами на уровне товара (true/false).stock_quantity(int): точное количество остатка на складе.
category, tag и shipping_class
category(array): массив slug-ярлыков категорий товаров.tag(array): массив slug-ярлыков меток товаров.shipping_class(array): массив slug-ярлыков классов доставки.
orderby и order
orderby(string): поле сортировки:date— дата добавления;titleилиname— название товара;id— идентификатор товара;price— текущая цена;popularity— количество продаж (total_sales);rating— средний рейтинг отзывов;menu_order— ручной порядок сортировки в каталоге;rand— случайный порядок;include— сохранение порядка переданных ID в параметреinclude.
order(string): направление сортировки —ASC(по возрастанию) илиDESC(по убыванию).
date_created и date_modified
date_created(string): дата создания товара. Поддерживает точные даты (2026-01-01), операторы сравнения (>2026-01-01,<=2026-02-01) и диапазоны дат (2026-01-01...2026-01-31).date_modified(string): дата последнего изменения товара с аналогичным синтаксисом.
return и paginate
return(string): формат вывода —'objects'(массив объектовWC_Product) или'ids'(массив идентификаторов).paginate(bool): приtrueвозвращает объектstdClassс метаданными пагинации (products,total,max_num_pages).
Часто используемые примеры
По категориям и тегам
Товары из конкретной категории:
$products = wc_get_products( [
'status' => 'publish',
'category' => [ 'hoodies' ],
'limit' => 8,
] );
Объединение категорий (логика OR):
Вернет товары, которые принадлежат хотя бы одной из указанных категорий (дефолтное поведение terms с оператором IN):
$products = wc_get_products( [
'status' => 'publish',
'category' => [ 'hoodies', 'tshirts' ],
'limit' => 8,
] );
Пересечение категорий (логика AND): Вернет товары, которые входят одновременно в обе категории:
$products = wc_get_products( [
'status' => 'publish',
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => [ 'hoodies', 'winter' ],
'operator' => 'AND',
],
],
'limit' => 8,
] );
Выборка по метке (тегу):
$products = wc_get_products( [
'status' => 'publish',
'tag' => [ 'bestseller' ],
'limit' => 4,
] );
По остаткам и наличию
Товары только в наличии:
$products = wc_get_products( [
'status' => 'publish',
'stock_status' => 'instock',
'limit' => 12,
] );
Товары с включенным складским учетом:
$products = wc_get_products( [
'status' => 'publish',
'manage_stock' => true,
'limit' => 20,
] );
Распродажи и акции
Выборка товаров, находящихся на скидке в текущий момент:
$on_sale_ids = wc_get_product_ids_on_sale();
$sale_products = wc_get_products( [
'status' => 'publish',
'include' => ! empty( $on_sale_ids ) ? $on_sale_ids : [ 0 ],
'limit' => 8,
] );
Хиты продаж и избранное
Популярные товары (сортировка по объёму продаж):
$popular_products = wc_get_products( [
'status' => 'publish',
'limit' => 5,
'orderby' => 'popularity',
'order' => 'DESC',
] );
Рекомендуемые (Featured) товары:
$featured_products = wc_get_products( [
'status' => 'publish',
'featured' => true,
'visibility' => 'visible',
'limit' => 4,
] );
Быстрая выборка ID с пагинацией
Оптимальный паттерн для AJAX-фильтров и REST API без загрузки полных объектов:
$results = wc_get_products( [
'status' => 'publish',
'category' => [ 'hoodies' ],
'limit' => 10,
'page' => 1,
'return' => 'ids',
'paginate' => true,
] );
// $results->products содержит массив [101, 102, 103...]
echo "Всего найдено: {$results->total}\n";
echo "Страниц: {$results->max_num_pages}\n";
Советы и практики
- Экономия памяти через
'return' => 'ids': в методеWC_Product_Data_Store_CPT::query()при значении'ids'WooCommerce возвращает массив ID напрямую из$query->postsбез вызова фабрикиwc_get_product(). Это снижает потребление памяти PHP в 5–10 раз при больших выборках. - Всегда фиксируйте
'status' => 'publish': исходный кодWC_Product_Query::get_default_query_vars()показывает, что по умолчанию параметрstatusзапрашивает не толькоpublish, но иdraft,pending,private. Для публичной витрины всегда задавайте статус явно. - Используйте
'visibility' => 'visible': товары могут быть скрыты из каталога или поиска в настройках карточки. Передача'visibility' => 'visible'автоматически исключает позиции со служебными меткамиexclude-from-catalogиexclude-from-search. - Автоматический прогрев кэша объектов: при
'return' => 'objects'WooCommerce выполняет массовый вызовupdate_post_caches( $query->posts, ['product', 'product_variation'] ). Это исключает проблему N+1 запросов при чтении метаполей товаров в цикле. - Сохранение очередности переданных ID: если товары запрашиваются по конкретному списку идентификаторов
'include' => [42, 15, 88], укажите'orderby' => 'include'. В коде хранилища это преобразуется в нативный аргумент'orderby' => 'post__in', сохраняя заданную последовательность. - Выборка конкретных вариаций: дефолтный список типов включает только
simple,grouped,external,variable. Чтобы выбрать отдельные вариации с их персональными артикулами и ценами, передайте'type' => 'variation'. - Фильтрация заполненных артикулов по маске:
wc_get_products()поддерживает синтаксис'sku' => '*'. В коде хранилища это превращается в условиеEXISTSи!= '', позволяя моментально выбрать только товары с заданным артикулом.
