Исключение определённых товаров из поиска WooCommerce: практическое руководство

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

В стандартной установке WooCommerce поиск по сайту возвращает все товары, которые опубликованы и доступны для продажи. Иногда требуется исключить из результатов поиска определённые товары — например, товары со статусом “черновик”, определённой категории, с конкретенным атрибутом или по другим критериям. Это позволит улучшить релевантность поиска и избежать путаницы для покупателей.

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

Если вы пробуете скрыть товары с помощью стандартных настроек или плагинов, но товары продолжают отображаться в результатах поиска, возможные причины:

  • Запрос поиска не учитывает дополнительные параметры фильтрации WooCommerce.
  • Товары опубликованы и имеют статус «publish» — они по умолчанию видны.
  • Кэширование страниц или поисковых запросов мешает обновлению результатов.
  • Используется сторонний плагин поиска, который не учитывает стандартные фильтры WordPress.

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

Лучший способ — использовать фильтр pre_get_posts для изменения запроса поиска и исключения товаров по нужным критериям.

1. Исключение товаров по ID

function exclude_products_from_search_by_id( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
        $excluded_ids = array(123, 456); // ID товаров, которые нужно исключить
        $post__not_in = $query->get('post__not_in');
        if ( ! is_array( $post__not_in ) ) {
            $post__not_in = array();
        }
        $post__not_in = array_merge( $post__not_in, $excluded_ids );
        $query->set('post__not_in', $post__not_in);
    }
}
add_action( 'pre_get_posts', 'exclude_products_from_search_by_id' );

2. Исключение товаров по категории

Допустим, нужно исключить товары категории с таксономией product_cat и slug hidden-category:

function exclude_products_from_search_by_category( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
        $tax_query = $query->get( 'tax_query' );
        if ( ! is_array( $tax_query ) ) {
            $tax_query = array();
        }
        $tax_query[] = array(
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => array( 'hidden-category' ),
            'operator' => 'NOT IN',
        );
        $query->set( 'tax_query', $tax_query );
    }
}
add_action( 'pre_get_posts', 'exclude_products_from_search_by_category' );

3. Исключение товаров по атрибуту

Для исключения товаров с атрибутом pa_brand и значением example-brand добавьте в запрос таксономию:

function exclude_products_from_search_by_attribute( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
        $tax_query = $query->get( 'tax_query' );
        if ( ! is_array( $tax_query ) ) {
            $tax_query = array();
        }
        $tax_query[] = array(
            'taxonomy' => 'pa_brand',
            'field'    => 'slug',
            'terms'    => array( 'example-brand' ),
            'operator' => 'NOT IN',
        );
        $query->set( 'tax_query', $tax_query );
    }
}
add_action( 'pre_get_posts', 'exclude_products_from_search_by_attribute' );

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

После добавления кода в файл functions.php вашей темы или в кастомный плагин:

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

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

  • Ошибка: Фильтр не срабатывает, товары не исключаются.
    Причина: Код добавлен вне хука pre_get_posts или условие is_search() неправильно определено.
    Решение: Проверьте, что код подключён и условие строго для фронтенда и основного запроса.
  • Ошибка: Исключаются лишние товары.
    Причина: Неправильно указаны ID или условия tax_query.
    Решение: Проверьте корректность ID и slug категорий/атрибутов.
  • Ошибка: Конфликт с плагинами кэширования.
    Решение: Очистите кэш, временно отключите плагины кэширования, проверьте работу поиска.

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

  • Всегда используйте pre_get_posts для изменения запросов WordPress, не меняйте напрямую SQL.
  • Не добавляйте тяжелые вычисления в фильтры поиска — это замедляет выдачу.
  • Храните списки исключаемых товаров в опциях или transient, если они динамические, чтобы не нагружать запрос.
  • Ограничьте права доступа к файлу с кодом, если используете кастомный плагин.

Сравнение методов исключения товаров из поиска WooCommerce

МетодПреимуществаНедостаткиКогда использовать
Исключение по ID (post__not_in)Просто реализуется, точечное исключениеТребуется поддержка списка ID вручнуюКогда нужно исключить небольшое количество конкретных товаров
Исключение по категории (tax_query)Гибко, можно исключить целую группу товаровНе подходит для исключения отдельных товаровКогда товары сгруппированы в отдельной категории
Исключение по атрибуту (tax_query)Удобно для исключения по характеристикамЗависит от корректного заполнения атрибутовКогда нужно исключить товары с определёнными свойствами
Как удалить проблемы с кэшированием в WooCommerce
03.06.2026
Как удалить повторяющиеся вариации товара в WooCommerce: практическое руководство
10.06.2026
Исключение определённых товаров из поиска WooCommerce: практическое руководство
17.06.2026
Как удалить или изменить slug таксономии в WordPress
15.02.2026
Массовое обновление атрибутов товаров в WooCommerce: практическое руководство
28.05.2026