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

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

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

Как работает поиск товаров в WooCommerce

Поиск WooCommerce основан на WP_Query с параметром post_type = 'product'. Чтобы изменить вывод, нужно влиять на параметры запроса, чаще всего через хук pre_get_posts. Это позволяет фильтровать товары, исключая нужные по ID, категории, мета-данным и др.

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

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

Этот код исключит из результатов поиска товары с ID 123, 456 и 789.

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

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

function exclude_category_from_search( $query ) {
    if ( ! is_admin() && $query->is_search() && $query->is_main_query() ) {
        $tax_query = array(
            array(
                'taxonomy' => 'product_cat',
                'field'    => 'slug',
                'terms'    => array( 'skidka', 'rasprodazha' ),
                'operator' => 'NOT IN',
            ),
        );
        $query->set('post_type', 'product');
        $query->set('tax_query', $tax_query);
    }
}
add_action( 'pre_get_posts', 'exclude_category_from_search' );

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

  1. Определите, по каким критериям исключать товары (ID, категория, мета-ключ).
  2. Добавьте в файл functions.php вашей темы или в отдельный плагин соответствующий код с использованием pre_get_posts.
  3. Если нужно исключать по мета-значениям (например, скрыть товары с мета-полем _hide_from_search), дополните запрос параметром meta_query:
function exclude_meta_hidden_products_from_search( $query ) {
    if ( ! is_admin() && $query->is_search() && $query->is_main_query() ) {
        $meta_query = array(
            array(
                'key'     => '_hide_from_search',
                'value'   => '1',
                'compare' => '!=',
            ),
        );
        $query->set('post_type', 'product');
        $query->set('meta_query', $meta_query);
    }
}
add_action( 'pre_get_posts', 'exclude_meta_hidden_products_from_search' );
  • Сохраните изменения и очистите кэш сайта и браузера.
  • Проверка результата после внедрения

    Для проверки:

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

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

    • Ошибка: Исключаемые товары всё равно отображаются.
      Причина: Не проверяется, что запрос — это основной запрос, или условие is_search() не срабатывает.
      Решение: Проверьте, что в вашем коде есть if ( $query->is_main_query() && $query->is_search() ).
    • Ошибка: Исключение по категории не работает.
      Причина: Неверно указан слаг категории или таксономия.
      Решение: Проверьте slug категории в админке и используйте правильное название таксономии — для WooCommerce это product_cat.
    • Ошибка: Фильтр ломает пагинацию или другие типы запросов.
      Решение: Добавьте условие ! is_admin() и проверяйте, что фильтр применяется только к главному поисковому запросу.

    Практические советы по оптимизации и безопасности

    • Если исключаете много товаров по ID, лучше использовать таксономии или мета-поля, чтобы не нагружать запрос.
    • Для больших магазинов с тысячами товаров используйте индексацию поиска через сторонние сервисы (ElasticSearch, Algolia) — в них исключение реализуется проще и быстрее.
    • Всегда тестируйте изменения на тестовой среде, чтобы не сломать поиск на продакшене.
    • При использовании meta_query учитывайте, что сложные запросы могут замедлять поиск — применяйте кэширование.

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

    МетодПлюсыМинусыПример кода
    Исключение по IDБыстро и простоНужно вручную обновлять список IDpost__not_in
    Исключение по категорииАвтоматичное исключение всех товаров категорииНужно правильно указывать таксономию и слагtax_query с operator 'NOT IN'
    Исключение по мета-полюГибкий и расширяемый способМожет замедлить запросы при большом количестве товаровmeta_query с compare '!='
    Как запретить доступ к XML и RSS в WordPress
    25.11.2025
    Как удалить временные таблицы базы данных WordPress без потери данных
    13.06.2026
    Как создать управляемую форму обратной связи в WordPress без плагинов
    02.04.2026
    Автоподгрузка постов в WordPress без плагинов
    25.03.2026
    Как удалить разделы "Доставка" и "Оплата" на странице оформления заказа WooCommerce
    02.06.2026