Диагностика проблемы: почему нужно исключить товары из поиска WooCommerce
В стандартной установке WooCommerce поиск на сайте выводит все товары, включая те, которые могут быть неактуальны, устаревшие или предназначены только для внутреннего использования. Это снижает удобство для пользователей и может ухудшить конверсию. Часто возникает задача — исключить из результатов поиска товары из конкретных категорий, например, "Скрытые", "Архив" или "Товары для оптовиков".
В WooCommerce нет стандартных настроек для исключения категорий из поиска, поэтому необходимо реализовать кастомное решение.
Как исключить товары из определённых категорий из поиска на WooCommerce: пошаговое решение
1. Подготовка: определяем ID или слаг категорий для исключения
Для начала нужно узнать слаги категорий, товары из которых нужно исключить. Это можно сделать в админке WordPress в разделе Товары > Категории. Например, категории hidden и archive.
2. Добавляем фильтр для модификации запроса поиска WooCommerce
Чтобы исключить товары из определённых категорий, нужно изменить запрос WP_Query, который используется для поиска. Это делается через хук pre_get_posts.
function wpinfo_exclude_categories_from_search( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
// Категории для исключения из поиска
$excluded_cats = array( 'hidden', 'archive' );
// Получаем ID категорий по слагам
$excluded_cat_ids = array();
foreach ( $excluded_cats as $slug ) {
$term = get_term_by( 'slug', $slug, 'product_cat' );
if ( $term ) {
$excluded_cat_ids[] = $term->term_id;
}
}
if ( ! empty( $excluded_cat_ids ) ) {
$tax_query = (array) $query->get('tax_query');
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => $excluded_cat_ids,
'operator' => 'NOT IN',
);
$query->set( 'tax_query', $tax_query );
}
// Убедимся, что поиск идет только по товарам
$query->set( 'post_type', 'product' );
}
}
add_action( 'pre_get_posts', 'wpinfo_exclude_categories_from_search' );3. Добавляем код в functions.php вашей темы или в кастомный плагин
Лучше всего вставлять этот код в дочернюю тему или в плагин, чтобы не потерять изменения при обновлении.
Проверка результата после внедрения
Чтобы проверить, что исключение работает:
- Перейдите на сайт и выполните поиск по слову, которое есть в товарах из исключённых категорий.
- Убедитесь, что эти товары не отображаются в результатах.
- Для контроля можно временно добавить в исключаемые категории категорию с уникальным названием и проверить, что товары из неё не выводятся.
Частые ошибки и как их исправить
- Код не работает — товары из исключённых категорий всё равно появляются в поиске. Проверьте, что функция подключена, и что поиск действительно использует основной запрос (is_main_query()). Если используется кастомный поиск, нужно адаптировать код под него.
- Исключаются не те категории. Проверьте правильность слагов категорий и их наличие в таксономии
product_cat. - Конфликт с другими плагинами, изменяющими поиск. Попробуйте временно отключить другие плагины, влияющие на поиск, чтобы проверить совместимость.
Практические советы по производительности и безопасности
- Функция не должна вызывать дополнительных тяжелых запросов — вызов
get_term_byкэширует данные, но если категорий много, лучше один раз получить ID и сохранить их в опции или transient. - Не используйте
query_posts, а именноpre_get_postsдля изменения главного запроса. - Проверяйте, что изменения не ломают пагинацию и сортировку в результатах поиска.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр pre_get_posts | Гибко, без дополнительных плагинов, точечное изменение | Требует базовых знаний PHP, может конфликтовать с плагинами поиска |
| Плагин для кастомизации поиска (например, SearchWP) | Простота настройки, расширенные возможности | Платно, влияет на производительность |
| Добавление метаполей и фильтров в UI | Удобно для пользователя | Сложно реализовать без плагинов, требует доработки |