Диагностика проблемы: почему товары из категорий отображаются в поиске 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.
Как проверить, что решение сработало
- Перейдите на страницу поиска вашего сайта и выполните запрос с ключевыми словами, которые есть в товарах исключённых категорий.
- Убедитесь, что товары из этих категорий не появляются в результатах.
- Для дополнительной проверки можно временно вывести 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) | Расширенный поиск с настройками исключений | Удобный интерфейс, дополнительные функции | Дополнительная нагрузка, стоимость, сложность настройки |