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

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

Поиск товаров в стандартном WooCommerce выводит все товары, включая те, которые не должны отображаться покупателям — например, товары из категории "Скрытые", товары для внутреннего использования или устаревшие позиции. Это мешает юзабилити и снижает конверсию. Выясним, как проверить, что поиск действительно выводит нежелательные товары, и как это исправить программно.

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

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

Для точной проверки можно временно вывести ID товаров и их категории прямо в шаблоне search.php или через pre_get_posts хук, отладив запрос.

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

Мы будем использовать хук pre_get_posts, чтобы модифицировать WP_Query на странице поиска и исключить из результатов товары из указанных категорий.

function exclude_categories_from_search( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
        // Категории товаров, которые нужно исключить из поиска
        $excluded_cats = array('skrytye', 'vnutrennie-tovary');

        // Получаем ID категорий по слагу
        $excluded_terms = get_terms( array(
            'taxonomy' => 'product_cat',
            'slug' => $excluded_cats,
            'fields' => 'ids',
            'hide_empty' => false
        ) );

        if ( ! is_wp_error( $excluded_terms ) && ! empty( $excluded_terms ) ) {
            // Добавляем таксономию в запрос
            $tax_query = (array) $query->get('tax_query');
            $tax_query[] = array(
                'taxonomy' => 'product_cat',
                'field' => 'term_id',
                'terms' => $excluded_terms,
                'operator' => 'NOT IN',
            );
            $query->set('tax_query', $tax_query);
        }
    }
}
add_action('pre_get_posts', 'exclude_categories_from_search');

Этот код исключит из результатов поиска все товары из категорий с слагами skrytye и vnutrennie-tovary.

Подсказка по добавлению слагов категорий

Убедитесь, что указанные слаги категорий точно совпадают с теми, что есть в WooCommerce. Для проверки можно зайти в Товары > Категории в админке.

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

  • Очистите кэш сайта и браузера, если используете кеширующие плагины.
  • Выполните поиск по ключевым словам, которые раньше возвращали товары из исключённых категорий.
  • Товары из этих категорий не должны отображаться в результатах.
  • Для дополнительной проверки можно добавить временный вывод var_dump($query->tax_query) в функцию, чтобы убедиться, что фильтр применяется.

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

  • Ошибка: Товары не исключаются из поиска.
    Причина: Фильтр не применяется из-за неправильной проверки условий (is_search(), is_main_query(), ! is_admin()) или ошибки в слагах категорий.
    Решение: Проверьте, что функция подключена правильно и слаги категорий актуальны.
  • Ошибка: Все товары пропали из поиска.
    Причина: Некорректно построен tax_query, например, ошибка в формате массива.
    Решение: Используйте стандартный формат массива для tax_query, избегайте вложенных ошибок.
  • Ошибка: Изменения не видны из-за кеширования.
    Решение: Очистите кэш сайта и браузера, отключите кеш на время отладки.

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

  • Производительность: Использование tax_query с NOT IN влияет на производительность при большом количестве товаров и категорий. Если набор категорий для исключения большой, рассмотрите вариант с тегами или отдельным метаполем для более быстрого фильтра.
  • Безопасность: Избегайте включения пользовательских данных напрямую в запрос без проверки. В нашем примере данные берутся из настроек, поэтому риска SQL-инъекции нет.
  • Кэширование: После внедрения фильтра убедитесь, что плагин кеширования корректно обновляет результаты поиска.

Альтернативы: плагин vs код

МетодПлюсыМинусы
Код через pre_get_postsБыстро, без плагинов, контроль над логикойНужны базовые знания PHP, ошибки могут привести к потере результатов
Плагин (например, Search Exclude)Простая настройка через UI, подходит для новичковДополнительная нагрузка, может конфликтовать с другими плагинами
Как добавить автопостинг в WordPress с помощью WPRemark
18.03.2026
WooCommerce: как автоматически исключать товары из определённых категорий из корзины
15.05.2026
Как создать собственный виджет для WordPress
14.11.2025
Как изменить имя пользователя в WordPress без доступа к базе данных
26.03.2026
Автоматическое создание резервных копий WordPress: лучшие практики и примеры кода
22.12.2025