Введение
При разработке под 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,
]
Внимание к статусам
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:
- Производительность и память: если для рендера нужны только идентификаторы (например, для передачи в сторонние сервисы), всегда используйте аргумент
'return' => 'ids'. - Безопасность витрины: обязательно передавайте
'status' => 'publish'и'visibility' => 'visible', чтобы исключить попадание скрытых или черновиковых позиций в пользовательский интерфейс. - Стабильность: использование встроенного API гарантирует работу кода независимо от структуры таблиц базы данных и активных оптимизаций HPOS.