Диагностика задачи: зачем исключать товары из поиска по категориям
В интернет-магазинах на 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) | Очень высокая скорость и масштабируемость | Сложность настройки, дополнительные расходы |