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

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

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

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

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

1. Исключение товаров по атрибуту или метаполю через фильтр запроса

В WooCommerce вывод товаров в списках и поиске управляется WP_Query с параметром post_type=product. Чтобы исключить товары по заданному условию, можно использовать хук pre_get_posts и добавить условие исключения.

Пример: исключаем товары, у которых метаполе _hide_from_search установлено в yes.

add_action('pre_get_posts', 'exclude_products_from_search_and_cat');
function exclude_products_from_search_and_cat($query) {
    if (is_admin() || !$query->is_main_query()) {
        return;
    }
    if ($query->is_search() || is_product_category() || is_shop()) {
        $meta_query = $query->get('meta_query');
        if (!is_array($meta_query)) {
            $meta_query = [];
        }
        $meta_query[] = [
            'key'     => '_hide_from_search',
            'value'   => 'yes',
            'compare' => '!='
        ];
        $query->set('meta_query', $meta_query);
    }
}

Чтобы использовать этот метод, в админке или через импорт нужно выставить у товара метаполе _hide_from_search со значением yes для скрытия.

2. Исключение вариантов товаров (variations) из отображения

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

add_action('pre_get_posts', 'exclude_variations_from_shop');
function exclude_variations_from_shop($query) {
    if (is_admin() || !$query->is_main_query()) {
        return;
    }
    if ($query->is_search() || is_product_category() || is_shop()) {
        $post_type = $query->get('post_type');
        if (empty($post_type)) {
            $post_type = ['product'];
        }
        if (is_array($post_type)) {
            $post_type = array_diff($post_type, ['product_variation']);
            $query->set('post_type', $post_type);
        } elseif ($post_type === 'product_variation') {
            $query->set('post_type', 'product');
        }
    }
}

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

Чтобы проверить, что скрытие работает:

  • Откройте страницу поиска с ключевым словом, по которому ранее показывались скрытые товары.
  • Перейдите в категории, где были эти товары.
  • Убедитесь, что товары с метаполем _hide_from_search = yes не отображаются.
  • Если вы скрывали вариации, проверьте, что они не выводятся в списках и поиске.

Для дополнительной проверки можно выполнить WP_Query вручную в консоли или через плагин Debug Bar, убедившись, что запрос не возвращает скрытые товары.

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

  • Не работает условие фильтрации: проверьте, что хук pre_get_posts подключён правильно и что условие is_main_query() не блокирует ваш код.
  • Метаполе не установлено или неверно задано: убедитесь, что метаполе _hide_from_search действительно есть у товаров и имеет значение yes (строчное).
  • Кэширование: если используется кэш (например, плагин кэширования или серверный), очистите кэш после внесения изменений.
  • Плагины с кастомным выводом товаров: некоторые плагины могут игнорировать стандартный WP_Query. В этом случае нужно изучать их API или отключать отображение вариантов в настройках.

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

  • Используйте meta_query с минимальным количеством условий, так как запросы по метаполям влияют на скорость.
  • Индексация метаполей в базе данных значительно ускорит фильтрацию. Рассмотрите индексацию, если у вас большой каталог.
  • Если скрывать нужно много товаров, лучше использовать таксономию или статус публикации, а не метаполя, чтобы оптимизировать запросы.

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

МетодПлюсыМинусыРекомендации
Фильтр pre_get_posts с метаполем Гибкий, не требует плагинов, точечное управление Нагрузка на БД при большом количестве товаров, требует правильного задания метаполей Использовать для небольших и средних магазинов
Использование статуса публикации (например, черновик) Простота реализации, быстрый фильтр Товар не будет доступен в каталоге и для заказов Когда нужно полностью скрыть товар
Плагины с управлением видимостью товаров Удобный UI, дополнительные функции Дополнительная нагрузка, возможные конфликты Для магазинов с большим количеством условий и пользователей
Как удалить неиспользуемые таксономии и термины в WordPress
02.01.2026
Как удалить неиспользуемые шорткоды в WordPress
23.01.2026
Как удалить зависшие AJAX-запросы в WordPress
15.04.2026
Оптимизация базы данных WordPress для ускорения сайта
03.11.2025
Как использовать хуки в WordPress для решения конкретных задач
09.01.2026