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

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

DonVardix DonVardix

Введение

При разработке под WooCommerce частой ошибкой является использование прямого WP_Query или SQL-запросов для выборки товаров. Это нарушает совместимость с High-Performance Order Storage (HPOS) и внутренними слоями кэширования WooCommerce.

  • Проблема: прямые обращения к posts и postmeta тяжеловесны, не учитывают статус видимости товаров и могут сломаться при обновлении архитектуры WooCommerce.
  • Решение: использовать стандартную функцию wc_get_products(), которая инкапсулирует WC_Product_Query и возвращает строго типизированные объекты.
  • Результат: быстрый, безопасный и кэшируемый доступ к каталогу товаров с удобной фильтрацией по категориям, наличию, ценам и статусам.

1. Возвращаемые данные

Функция wc_get_products() возвращает массив объектов WC_Product (в зависимости от типа товара это могут быть экземпляры WC_Product_Simple, WC_Product_Variable и др.). Через методы объекта можно безопасно запрашивать любые параметры: $product->get_price(), $product->get_id(), $product->is_in_stock().

Если товары по заданным критериям не найдены, функция возвращает пустой массив [].

$products = wc_get_products( [
    'limit' => 5,
] );

foreach ( $products as $product ) {
    echo $product->get_name() . ' — ' . $product->get_price_html();
}

2. Значения аргументов по умолчанию

Если передать пустой массив аргументов, WooCommerce применит системные параметры по умолчанию:

[
    'limit'        => get_option( 'posts_per_page' ),
    'status'       => ['publish', 'draft', 'pending', 'private'],
    'type'         => ['simple', 'variable', 'grouped', 'external'],
    'orderby'      => 'date',
    'order'        => 'DESC',
    'page'         => 1,
    'return'       => 'objects',
    'paginate'     => false,
]

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

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

3. Примеры использования в проектах

Выборка по категориям и наличию

Последние опубликованные товары:

$products = wc_get_products( [
    'status' => 'publish',
    'limit'  => 8,
] );

Товары из конкретной категории:

$products = wc_get_products( [
    'status'   => 'publish',
    'category' => ['hoodies'],
] );

Пересечение категорий (логика AND): Вернет товары, которые входят одновременно в обе категории:

$products = wc_get_products( [
    'status'   => 'publish',
    'category' => ['hoodies', 'tshirts'],
] );

Объединение категорий (логика OR): Вернет товары, принадлежащие хотя бы одной категории:

$products = wc_get_products( [
    'status'    => 'publish',
    'tax_query' => [
        [
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => ['hoodies', 'tshirts'],
            'operator' => 'IN',
        ],
    ],
] );

Выборка по остаткам и спискам ID

Только товары в наличии:

$products = wc_get_products( [
    'status'       => 'publish',
    'stock_status' => 'instock',
    'limit'        => 12,
] );

Выборка конкретных товаров по списку ID:

$products = wc_get_products( [
    'include' => [101, 102, 103],
] );

4. Справочник параметров выборки

Основные аргументы для гибкой фильтрации:

limit и page

  • limit (int): количество товаров. -1 возвращает все товары (использовать с осторожностью на больших базах).
  • page (int): номер текущей страницы пагинации (по умолчанию 1).

status и visibility

  • status (string|array): publish, draft, pending, private, trash.
  • visibility (string): видимость в каталоге — visible (каталог и поиск), catalog, search, hidden.

type и stock_status

  • type (string|array): simple, variable, grouped, external.
  • stock_status (string): instock, outofstock, onbackorder, lowstock.

orderby и order

  • orderby (string): поле сортировки (date, name, ID, type, rand, modified).
  • order (string): направление — ASC или DESC.

return и paginate

  • return (string): objects (по умолчанию возвращает массив объектов WC_Product) или ids (возвращает только массив ID, что значительно быстрее и экономит память).
  • paginate (bool): при true функция возвращает объект со свойствами:
    • products: массив найденных товаров;
    • total: общее количество подходящих товаров;
    • max_num_pages: доступное количество страниц.

Пример работы с пагинацией:

$results = wc_get_products( [
    'status'   => 'publish',
    'limit'    => 12,
    'page'     => 1,
    'paginate' => true,
] );

echo "Всего товаров: {$results->total}";
echo "Всего страниц: {$results->max_num_pages}";

Вывод

Функция wc_get_products() — это стандарт для любых операций чтения товаров в WooCommerce:

  1. Производительность и память: если для рендера нужны только идентификаторы (например, для передачи в сторонние сервисы), всегда используйте аргумент 'return' => 'ids'.
  2. Безопасность витрины: обязательно передавайте 'status' => 'publish' и 'visibility' => 'visible', чтобы исключить попадание скрытых или черновиковых позиций в пользовательский интерфейс.
  3. Стабильность: использование встроенного API гарантирует работу кода независимо от структуры таблиц базы данных и активных оптимизаций HPOS.