Использование фильтра WooCommerce product_query для точной настройки выборки товаров

Что такое фильтр 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 и вывод товаров вручнуюПолный контроль над выборкой и выводомНужно самостоятельно реализовывать пагинацию, сортировку и т.д.
Как использовать Meta Box в WordPress для управления дополнительными данными
31.12.2025
Как создать автоматический XML Sitemap в WordPress без плагинов
14.01.2026
Как изменить URL автора в WordPress без изменения ссылок постов
05.12.2025
Как создать автоматические резервные копии WordPress без плохой нагрузки на сервер
17.03.2026
Как удалить версии записей в WordPress чтобы уменьшить базу данных
22.11.2025