Как использовать pre_get_posts для исключения товаров из категорий WooCommerce

Диагностика проблемы: почему стандартные методы не работают для исключения товаров из категорий WooCommerce

В WooCommerce часто возникает задача исключить из отображения товары определённых категорий на страницах каталога или поиска. Многие пытаются сделать это через параметры запроса WP_Query или плагины. Однако стандартные параметры tax_query или фильтрация через админку не всегда эффективны, особенно если тема или плагины модифицируют запросы. Это приводит к тому, что товары из нужных категорий всё равно отображаются.

Проверить это можно, временно отключив все плагины кроме WooCommerce и переведя тему на стандартную (например, Storefront). Если проблема сохраняется, значит нужно вмешиваться непосредственно в запросы WordPress через хуки.

Пошаговое решение: использование хука pre_get_posts для исключения категорий товаров

1. Добавление функции фильтрации в файл functions.php вашей темы

function wptemy_exclude_woocommerce_categories( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    // Проверяем, что это страница магазина, архив товаров или поиск по товарам
    if ( is_post_type_archive( 'product' ) || is_tax( 'product_cat' ) || is_search() ) {
        // ID категорий, которые нужно исключить
        $excluded_cats = array( 15, 23 ); // замените на свои ID категорий

        // Формируем tax_query для исключения
        $tax_query = (array) $query->get( 'tax_query' );
        $tax_query[] = array(
            'taxonomy' => 'product_cat',
            'field'    => 'term_id',
            'terms'    => $excluded_cats,
            'operator' => 'NOT IN',
        );
        $query->set( 'tax_query', $tax_query );
    }
}
add_action( 'pre_get_posts', 'wptemy_exclude_woocommerce_categories' );

2. Определение ID категорий

Чтобы узнать ID категорий товаров, зайдите в админку WordPress в раздел Товары > Категории, наведите курсор на нужную категорию и посмотрите ссылку внизу браузера. Там будет параметр tag_ID=число — именно этот ID нужно использовать.

Проверка результата после внедрения

После добавления кода очистите кеш сайта и браузера. Перейдите на страницу магазина, архив категорий товаров и выполните поиск по товарам. Товары из указанных категорий не должны отображаться.

Если хотите дополнительно проверить, добавьте вывод параметра запроса в шаблон, например:

var_dump( $wp_query->query_vars );

и убедитесь, что tax_query содержит оператор NOT IN для нужных категорий.

Частые ошибки и как их исправить

  • Код не работает на страницах, отличных от главного запроса. Убедитесь, что в функции проверяется $query->is_main_query().
  • Исключение не срабатывает в админке. В начале функции стоит исключать административные запросы с помощью is_admin().
  • Неправильно указаны ID категорий. Проверьте, что вы используете именно ID, а не слаг или название категории.
  • Наличие других плагинов, которые модифицируют запросы. Временно отключите их для диагностики.
  • Кеширование на уровне сервера или плагина. Очистите кеш, чтобы увидеть изменения.

Практические советы по производительности и безопасности

  • Добавляйте фильтр только при необходимости — например, проверяйте is_post_type_archive('product') и is_search(), чтобы не влиять на другие запросы.
  • Используйте ID категорий вместо слагов для повышения скорости обработки запроса.
  • Если у вас большой каталог, настройте кеширование страниц и запросов, чтобы исключение не замедляло сайт.
  • Для тонкой настройки исключения можно добавить дополнительные условия, например, по ролям пользователей или по параметрам URL.

Таблица сравнения вариантов решения

МетодПлюсыМинусы
Использование pre_get_postsГибко, без плагинов, быстроТребует навыков программирования, возможны конфликты
Плагины фильтрации товаровПростота использования, UI для настроекДополнительная нагрузка, ограниченные настройки
Изменение шаблонов темыМаксимальный контроль над выводомТребует глубоких знаний PHP и WP-шаблонов
Как использовать хук pre_get_posts для фильтрации постов в WordPress
29.12.2025
Как добавить поля для дополнительного заполнения в форме оформления WooCommerce
03.05.2026
Как удалить пустые категории в WordPress
02.03.2026
Как исключить определённые товары из поиска WooCommerce
20.04.2026
Как изменить приоритет загрузки скриптов в WordPress
22.02.2026