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

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

В интернет-магазинах на WooCommerce иногда требуется скрыть определённые товары из результатов поиска и из страниц категорий без удаления их из каталога. Это может быть необходимо для товаров, которые временно недоступны, находятся на проверке, или же являются скрытыми акционными предложениями.

Часто пользователи пытаются просто снять галочку «В наличии», но это не убирает товар из поиска и категорий. В результате товары продолжают отображаться, что вызывает путаницу и снижает конверсию.

Как определить, что товар отображается в поиске и категориях

  • Перейдите на страницу поиска по сайту и введите название или артикул товара.
  • Откройте страницу нужной категории и проверьте, отображается ли товар среди списка.
  • Проверьте, что товар опубликован и имеет статус "Опубликовано".

Пошаговое решение: исключение товаров с помощью кода

Для исключения товаров из поиска и категорий добавим кастомный фильтр в functions.php вашей темы или в плагин-сниппет.

Шаг 1. Добавляем метаполе для скрытия товаров

Чтобы управлять скрытием на уровне товара, создадим метаполе exclude_from_shop. Можно добавить его вручную через панель Advanced Custom Fields или через стандартный метабокс.

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

update postmeta set meta_value = 'yes' where post_id = 123 and meta_key = 'exclude_from_shop';

Где 123 — ID нужного товара.

Шаг 2. Добавляем фильтр на запросы WooCommerce

function wpma_exclude_products_from_search_and_category( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    if ( ( is_search() || is_product_category() ) && $query->is_post_type_archive( 'product' ) || $query->get( 'post_type' ) === 'product' ) {
        $meta_query = $query->get( 'meta_query' );
        if ( ! $meta_query ) {
            $meta_query = [];
        }

        $meta_query[] = array(
            'key'     => 'exclude_from_shop',
            'compare' => 'NOT EXISTS',
        );

        $meta_query[] = array(
            'key'     => 'exclude_from_shop',
            'value'   => 'yes',
            'compare' => '!=',
        );

        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'wpma_exclude_products_from_search_and_category' );

Этот код добавляет условия, чтобы исключить товары с метаполем exclude_from_shop равным yes из поиска и страниц категорий.

Проверка результата

  • Обновите страницу поиска с названием товара, который должен быть скрыт. Он не должен отображаться.
  • Откройте категорию, где товар был виден ранее — товар должен исчезнуть из списка.
  • Проверьте, что товар доступен по прямой ссылке (если не требуется скрывать его полностью).

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

  • Код не срабатывает на страницах архивов: проверьте, что условие is_main_query() не блокирует ваш запрос и что вы не работаете в админке.
  • Товар продолжает показываться: убедитесь, что метаполе exclude_from_shop задано именно у этого товара и что значение yes написано без лишних пробелов.
  • Проблемы с кэшированием: после внесения изменений очистите кеш плагина и/или браузера.
  • Неправильный приоритет хука: если другой код меняет запрос, попробуйте поставить приоритет ниже, например, add_action('pre_get_posts', 'wpma_exclude_products_from_search_and_category', 20);.

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

  • Используйте метаполя для управления видимостью товаров, а не удаляйте их из базы — это безопаснее и проще для контроля.
  • Кэшируйте результаты запросов и используйте плагин кеширования с правильной настройкой исключений для динамического контента WooCommerce.
  • Если товаров много, оптимизируйте запросы с помощью индексов на таблицу postmeta, чтобы метазапросы не тормозили.
  • Для массового изменения видимости товаров используйте WP-CLI или SQL-запросы с осторожностью.

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

МетодПлюсыМинусы
Использование метаполя + pre_get_posts (код)Гибко, легко масштабируемо, не требует плагиновНужны навыки PHP, возможны ошибки в запросах
Плагины для скрытия товаров (например, "WooCommerce Catalog Visibility Options")Простой интерфейс, дополнительные функцииЗависимость от стороннего кода, нагрузка на сайт
Изменение статуса товара (черновик, ожидание)Простая реализацияТовар полностью недоступен, нельзя показывать по прямой ссылке
Как создать автоматический sitemap в WordPress с помощью кода
27.12.2025
Как разрешить пользователям загружать файлы в WordPress по расширениям
14.02.2026
WooCommerce: автоматическое удаление неподтверждённых заказов
21.06.2026
Создать динамические формы в WordPress на AJAX без плагинов
04.01.2026
Как автоматически удалить неиспользуемые шорткоды в WordPress
15.03.2026