Что такое wc_get_products и зачем она нужна
Функция wc_get_products() появилась в WooCommerce начиная с версии 3.0 и служит удобным оберткой для получения списка товаров по заданным параметрам. Это более современный и гибкий способ вместо использования прямого WP_Query по типу записи product.
Она возвращает массив объектов WC_Product, с которыми удобно работать благодаря методам класса.
Диагностика: когда использовать wc_get_products вместо WP_Query
Если вы часто делаете выборку товаров с фильтрацией по атрибутам, типам, метаданным и хотите получить именно объекты WC_Product, то wc_get_products() будет удобнее и быстрее. Однако, если вам нужна сложная кастомная выборка с JOIN и нестандартными параметрами, лучше использовать WP_Query или WC_Product_Query.
Признаки необходимости wc_get_products:
- Нужно получить товары с фильтрами по цене, статусу, категории, тэгам;
- Требуется быстро получить объекты с методами (например,
get_price(),get_name()); - Хотите избежать дублирования кода и использовать стандартный API WooCommerce.
Пошаговое решение: пример использования wc_get_products
Допустим, нужно получить 10 опубликованных товаров из категории aksessuary с ценой ниже 3000 рублей.
$args = [
'limit' => 10,
'category' => ['aksessuary'],
'status' => 'publish',
'max_price' => 3000
];
$products = wc_get_products($args);
foreach ($products as $product) {
echo $product->get_name() . ' — ' . wc_price($product->get_price()) . "\n";
}
Пояснения к параметрам:
limit— максимальное число товаров;category— массив с слагами категорий;status— статус публикации товара;max_price— максимальная цена (фильтр по метаполю_price).
Фильтрация по нескольким параметрам
Можно комбинировать фильтры, например, получить продукты с тегом sale, сортировкой по цене и с определённым атрибутом:
$args = [
'limit' => 5,
'tag' => ['sale'],
'orderby' => 'price',
'order' => 'ASC',
'attribute' => 'color',
'attribute_term' => 'blue'
];
$products = wc_get_products($args);
<Обратите внимание, что для фильтрации по атрибутам используются параметры attribute и attribute_term — слаг атрибута и термин таксономии соответственно.
Проверка результата после внедрения
1. Добавьте код в файл темы или плагина и выведите результаты на страницу или в лог.
2. Проверьте, что возвращается массив объектов WC_Product с нужными параметрами.
3. Убедитесь, что фильтры работают корректно, изменяя параметры и анализируя результат.
Частые ошибки и как их исправить
- Пустой массив товаров: проверьте правильность слагов категорий и тегов, статус товара, а также наличие товаров, соответствующих условиям.
- Неправильно фильтруются атрибуты: убедитесь, что используете правильные слаги атрибута и терминов (например, атрибут color будет в виде
pa_colorв таксономии). - Неверный тип возвращаемых данных:
wc_get_products()возвращает объектыWC_Product, а не массивы данных. Для вывода используйте методы объекта.
Практические советы по производительности и безопасности
- Используйте параметр
limitдля ограничения количества возвращаемых товаров, чтобы не нагружать базу. - Кэшируйте результаты выборки, если данные не меняются часто, например, с помощью Transients API.
- Избегайте вывода данных напрямую из объекта без проверки, чтобы не допустить XSS-уязвимости.
- Если фильтрация по ценам не работает, проверьте, что метаполе
_priceиндексировано в базе.
Сравнение методов получения товаров: wc_get_products vs WP_Query vs WC_Product_Query
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| wc_get_products() | Простота, возвращает WC_Product, встроенные фильтры | Ограниченные возможности сложных запросов | Быстрая выборка с базовыми фильтрами |
| WP_Query | Гибкость, мощный запрос | Возвращает WP_Post, требуется дополнительная обработка | Сложные запросы с JOIN, нестандартные условия |
| WC_Product_Query | Специализирован для товаров, гибкий | Сложнее в использовании, требует понимания класса | Продвинутые выборки с кастомными условиями |