WooCommerce: как исключить товары из определённых категорий из поиска без плагинов

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

По умолчанию WooCommerce интегрируется с поиском WordPress, и все товары, включая товары из любых категорий, выводятся в результатах поиска. Иногда требуется исключить определённые категории из поиска, например, чтобы скрыть товары из архивных или неактивных категорий, не устанавливая дополнительные плагины. Без этого фильтра пользователи видят нерелевантные товары, что ухудшает UX и снижает конверсию.

Пошаговое решение: исключаем категории из поиска с помощью фильтра pre_get_posts

Самый эффективный способ — использовать хук pre_get_posts для изменения основного запроса поиска в WordPress. Ниже пример кода, который исключает товары из указанных категорий из результатов поиска WooCommerce.

function exclude_product_categories_from_search( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
        // ID или слаги категорий для исключения
        $excluded_cats = array( 'uncategorized', 'archive-products' );

        // Получаем объекты категорий по слагам
        $excluded_term_ids = array();
        foreach ( $excluded_cats as $slug ) {
            $term = get_term_by( 'slug', $slug, 'product_cat' );
            if ( $term ) {
                $excluded_term_ids[] = $term->term_id;
            }
        }

        if ( ! empty( $excluded_term_ids ) ) {
            // Добавляем tax_query для исключения
            $tax_query = array(
                array(
                    'taxonomy' => 'product_cat',
                    'field'    => 'term_id',
                    'terms'    => $excluded_term_ids,
                    'operator' => 'NOT IN',
                ),
            );

            $query->set( 'tax_query', $tax_query );

            // Ограничиваем поиск только товарами
            $query->set( 'post_type', 'product' );
        }
    }
}
add_action( 'pre_get_posts', 'exclude_product_categories_from_search' );

Добавьте этот код в файл темы functions.php или в отдельный функциональный плагин. В массиве $excluded_cats укажите слаги нужных категорий.

Что делает этот код:

  • Проверяет, что запрос — главный и поисковый.
  • Получает ID категорий по их слагам.
  • Добавляет условие tax_query, исключающее товары из этих категорий.
  • Ограничивает поиск только товарами WooCommerce.

Как проверить, что решение сработало

  1. Перейдите на страницу поиска вашего сайта и выполните запрос с ключевыми словами, которые есть в товарах исключённых категорий.
  2. Убедитесь, что товары из этих категорий не появляются в результатах.
  3. Для дополнительной проверки можно временно вывести SQL-запросы, используя плагин Query Monitor или добавив var_dump( $query->request ) внутри функции, чтобы увидеть, что tax_query применяется.

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

  • Категории не исключаются: Проверьте, правильно ли указаны слаги категорий в массиве. Используйте print_r(get_terms('product_cat')); для вывода всех категорий и их слагов.
  • Поиск показывает товары из других типов записей: Убедитесь, что в запросе установлен post_type => 'product'.
  • Код не работает в админке: Хук ограничен проверкой ! is_admin(), чтобы не повлиять на запросы в административной панели.
  • Нарушена работа пагинации: Если пагинация ломается, убедитесь, что не переопределяете параметры, влияющие на пагинацию, кроме необходимых.

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

  • Для сайтов с большим каталогом товаров и сложной структурой категорий стоит кэшировать результаты поисковых запросов, чтобы снизить нагрузку на базу данных.
  • Используйте object caching (Redis, Memcached) для ускорения выполнения сложных запросов tax_query.
  • Проверяйте корректность данных категорий и не используйте устаревшие или удалённые категории для исключения — это может привести к ошибкам.
  • Не отключайте проверку is_main_query(), чтобы избежать конфликтов с другими запросами на сайте.

Сравнение вариантов решения задачи

МетодОписаниеПлюсыМинусы
Код с pre_get_posts Исключение категорий через хук без плагинов Лёгкий, не требует сторонних решений, гибкий Требует базовых знаний PHP, может конфликтовать с другими фильтрами
Плагины поиска (Relevanssi, SearchWP) Расширенный поиск с настройками исключений Удобный интерфейс, дополнительные функции Дополнительная нагрузка, стоимость, сложность настройки
Автоматическое удаление неактивных пользователей в WooCommerce: пошаговое руководство
02.07.2026
WooCommerce: как сделать автоматическое изменение стоимости товара при определённых условиях
08.05.2026
Как удалить все виджеты на странице WordPress: практические решения и примеры кода
04.02.2026
Как создать собственный виджет для WordPress
14.11.2025
Как правильно настроить URL для кастомных типов записей в WordPress
30.12.2025