Что такое фильтр woocommerce_product_query и зачем он нужен
Фильтр woocommerce_product_query позволяет изменить параметры WP_Query, которые WooCommerce использует для выборки товаров на страницах магазина, архивах категорий и других местах, где выводятся товары. Это мощный инструмент для разработчиков, которые хотят реализовать кастомную логику фильтрации товаров без создания дополнительных запросов или переопределения шаблонов.
Диагностика проблемы с выборкой товаров в WooCommerce
Часто возникает задача: нужно исключить из вывода определённые товары, изменить сортировку, фильтровать по метаданным или таксономиям, но стандартные опции WooCommerce в админке не позволяют сделать это гибко.
Проверить, что выборка товаров не соответствует вашим требованиям, можно двумя способами:
- Визуально: на страницах магазина показываются товары, которые должны быть скрыты или отсортированы иначе;
- Программно: с помощью отладки запросов и вывода параметров WP_Query.
Например, чтобы вывести параметры текущего запроса на страницах магазина, добавьте временно код:
add_action('woocommerce_before_shop_loop', function() {
global $wp_query;
echo '<pre>';
print_r($wp_query->query_vars);
echo '</pre>';
});Это поможет понять, какие параметры передаются WooCommerce для выборки товаров.
Пошаговое решение: как изменить выборку товаров через woocommerce_product_query
Пример задачи: исключить из списка товаров те, у которых есть метаполе _hide_from_shop со значением yes.
1. Подключитесь к фильтру woocommerce_product_query в файле functions.php вашей темы или в плагине.
2. Добавьте условие для модификации запроса:
add_action('woocommerce_product_query', 'filter_hide_products_from_shop');
function filter_hide_products_from_shop( $query ) {
$meta_query = $query->get('meta_query') ?: [];
$meta_query[] = [
'key' => '_hide_from_shop',
'value' => 'yes',
'compare' => '!='
];
$query->set('meta_query', $meta_query);
}В этом коде мы добавляем условие, что метаполе _hide_from_shop не должно быть равно yes, то есть такие товары не попадут в выборку.
3. Сохраняем изменения и проверяем страницу магазина.
Проверка результата после внедрения
Чтобы убедиться, что фильтрация работает:
- Создайте тестовый товар и установите ему метаполе
_hide_from_shop = yes(например, с помощью плагина Advanced Custom Fields или через phpMyAdmin). - Перейдите на страницу магазина — товар с этим метаполем не должен отображаться.
- Выведите параметры запроса с помощью кода из раздела диагностики и убедитесь, что
meta_queryсодержит ваш фильтр.
Частые ошибки при работе с woocommerce_product_query и их исправления
- Неправильное использование
meta_query: если вы перезаписываетеmeta_query, а не дополняете существующий массив, то теряются другие условия. Всегда получайте текущийmeta_queryчерез$query->get('meta_query')и добавляйте новый элемент. - Отсутствие проверки контекста: иногда фильтр применяется и на страницах, где не нужно менять запрос. Добавьте дополнительные проверки, например,
is_shop(),is_product_category()илиis_main_query(). - Изменения не влияют на пагинацию: при неправильном изменении параметров запроса пагинация может сломаться. Используйте фильтр только с главным запросом (
is_main_query()).
Практические советы по безопасности и производительности
- Не добавляйте тяжелые JOIN-запросы в фильтре, чтобы не замедлять загрузку страниц.
- Для сложных условий лучше использовать WP_Meta_Query и WP_Tax_Query, а не писать кастомные SQL-запросы.
- Кэшируйте результаты запросов, если выборка сложная и не меняется часто (например, с помощью Transients API или Object Cache).
- Проверяйте, что фильтр применяется только там, где нужно, чтобы избежать лишних нагрузок.
Сравнение способов кастомизации выборки товаров в WooCommerce
| Способ | Плюсы | Минусы |
|---|---|---|
Фильтр woocommerce_product_query | Простой в использовании, интегрируется с основным запросом, не требует переопределения шаблонов | Ограничен работой с WP_Query, нельзя полностью изменить логику запроса |
| Переопределение шаблонов WooCommerce | Максимальная гибкость вывода и выборки | Сложнее поддерживать, требует знаний шаблонной системы WooCommerce |
| Создание собственного WP_Query и вывод товаров вручную | Полный контроль над выборкой и выводом | Нужно самостоятельно реализовывать пагинацию, сортировку и т.д. |