wpload.ru wordpress WPLoad.ru

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

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

В интернет-магазинах на WooCommerce иногда требуется ограничить поиск по товарам из определённых категорий. Например, если в магазине есть категория «Скидки», товары из которой не должны отображаться в общем поиске, чтобы не мешать основной навигации. Или же категории товаров для внутреннего использования, которые не предназначены для публичного поиска.

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

Как проверить текущую работу поиска по WooCommerce

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

Если отображаются, значит задача актуальна — нужно внедрять фильтр.

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

Для исключения товаров из поиска по категориям нужно использовать хук pre_get_posts и модифицировать параметры запроса.

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

        $tax_query = (array) $query->get( 'tax_query' );

        $tax_query[] = array(
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => $excluded_categories,
            'operator' => 'NOT IN',
        );

        $query->set( 'tax_query', $tax_query );
    }
}
add_action( 'pre_get_posts', 'wpload_exclude_product_categories_from_search' );

Объяснение кода:

  • Проверяем, что запрос — публичный, основной и поисковый.
  • Добавляем в параметр tax_query условие исключения категорий по slug.
  • Подключаем функцию к хуку pre_get_posts, который меняет параметры WP_Query перед выполнением.

Добавление исключения по ID категории

Если у вас в магазине категории имеют одинаковые слаги, или вы хотите использовать ID, замените 'field' => 'slug' на 'field' => 'term_id' и укажите ID категорий:

$excluded_categories = array( 12, 34 );

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

  • Очистите кэш сайта и браузера.
  • Выполните поиск по ключевому слову, которое есть в товарах из исключённых категорий.
  • Убедитесь, что товары из этих категорий не отображаются в результатах поиска.
  • Проверьте, что остальные товары отображаются корректно.

Частые ошибки при исключении категорий из поиска и как их исправить

  • Неправильный хук: использование pre_get_posts вне условий проверки запроса приводит к изменению всех запросов, в том числе в админке. Обязательно проверяйте is_admin() и is_main_query().
  • Ошибка в slug категорий: неверно указанные слаги не приведут к исключению. Проверьте slugs в админке WooCommerce (Товары → Категории).
  • Кэширование: кэш страниц или плагинов кэширования может показывать старые результаты — очистите кэш.
  • Конфликты с плагинами поиска: если используется сторонний плагин для поиска, он может игнорировать стандартные фильтры WP_Query. В этом случае нужно смотреть документацию плагина.

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

  • Используйте условие is_main_query() для минимизации влияния на другие запросы.
  • Если у вас большой каталог, добавление tax_query может повлиять на скорость — рассмотрите использование специализированных плагинов поиска (например, ElasticPress) с поддержкой фильтров.
  • Следите, чтобы slugs категорий были уникальными и не менялись, иначе фильтр перестанет работать.
  • Не добавляйте логику исключения в шаблоны или файлы темы напрямую без проверки запроса — это может приводить к багам.

Сравнение вариантов реализации исключения категорий из поиска

МетодОписаниеПлюсыМинусы
Хук pre_get_postsИзменение WP_Query программноГибкость, бесплатное решение, работает с дефолтным поискомМожет влиять на производительность на больших сайтах
Плагин поиска с фильтрамиИспользование плагина (Relevanssi, SearchWP)Более быстрый и точный поиск, удобный интерфейсПлатные решения, нужно настраивать
Индексация внешними сервисамиПоиск через внешний сервис (Elastic, Algolia)Очень высокая скорость и масштабируемостьСложность настройки, дополнительные расходы
×

Время действовать!

Суперцены на
WordPress!

-20%
на премиум темы

Не упусти шанс ⋙