Ссылка скопирована

Получение продуктов WooCommerce — wc_get_products

DonVardixDonVardix—

Введение

Функция wc_get_products() — стандартный API WooCommerce для безопасного получения товаров из базы данных с поддержкой HPOS и встроенного кэширования.

Версия WooCommerce

Материал и примеры проверены на актуальной версии WooCommerce 11.1.1 и совместимы со всеми версиями, начиная с WooCommerce 3.0.

Какие задачи решает:

  • Выборка товаров по любым критериям (категории, цены, остатки, теги, акции и статусы);
  • Замена прямых 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[] или массив ID int[]);
  • 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'        => [],
]

Внимание к статусам

По умолчанию аргумент status включает не только опубликованные товары, но и draft, pending, private. Для публичной витрины всегда явно указывайте 'status' => 'publish'.

Часто используемые параметры

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 (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";

Советы и практики

  1. Экономия памяти через 'return' => 'ids': в методе WC_Product_Data_Store_CPT::query() при значении 'ids' WooCommerce возвращает массив ID напрямую из $query->posts без вызова фабрики wc_get_product(). Это снижает потребление памяти PHP в 5–10 раз при больших выборках.
  2. Всегда фиксируйте 'status' => 'publish': исходный код WC_Product_Query::get_default_query_vars() показывает, что по умолчанию параметр status запрашивает не только publish, но и draft, pending, private. Для публичной витрины всегда задавайте статус явно.
  3. Используйте 'visibility' => 'visible': товары могут быть скрыты из каталога или поиска в настройках карточки. Передача 'visibility' => 'visible' автоматически исключает позиции со служебными метками exclude-from-catalog и exclude-from-search.
  4. Автоматический прогрев кэша объектов: при 'return' => 'objects' WooCommerce выполняет массовый вызов update_post_caches( $query->posts, ['product', 'product_variation'] ). Это исключает проблему N+1 запросов при чтении метаполей товаров в цикле.
  5. Сохранение очередности переданных ID: если товары запрашиваются по конкретному списку идентификаторов 'include' => [42, 15, 88], укажите 'orderby' => 'include'. В коде хранилища это преобразуется в нативный аргумент 'orderby' => 'post__in', сохраняя заданную последовательность.
  6. Выборка конкретных вариаций: дефолтный список типов включает только simple, grouped, external, variable. Чтобы выбрать отдельные вариации с их персональными артикулами и ценами, передайте 'type' => 'variation'.
  7. Фильтрация заполненных артикулов по маске: wc_get_products() поддерживает синтаксис 'sku' => '*'. В коде хранилища это превращается в условие EXISTS и != '', позволяя моментально выбрать только товары с заданным артикулом.