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

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

В WooCommerce часто возникает задача временно скрыть товар из каталога и поиска, но при этом не удалять его из базы, чтобы сохранить все данные и отзывы. Например, товар временно отсутствует на складе или идет подготовка к новой версии. Стандартных настроек в WooCommerce для этого нет, поэтому нужно реализовать кастомное решение.

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

1. Получение ID товара

Для исключения нужно знать ID товара. Его можно посмотреть в админке WooCommerce на странице Товары. Например, пусть ID товара — 123.

2. Добавление кода в functions.php или плагин

Добавим следующий код, который исключит товар с ID 123 из результатов поиска и каталога:

function exclude_product_from_shop_and_search( $query ) {
    if ( ! is_admin() && $query->is_main_query() ) {
        // Исключаем из каталога
        if ( is_shop() || is_product_category() || is_product_tag() ) {
            $query->set( 'post__not_in', array( 123 ) );
        }
        // Исключаем из поиска
        if ( is_search() ) {
            $query->set( 'post__not_in', array( 123 ) );
        }
    }
}
add_action( 'pre_get_posts', 'exclude_product_from_shop_and_search' );

Этот код проверяет, что мы не в админке, и основной запрос — магазин или поиск. Затем исключает указанный товар по ID.

3. Массовое исключение нескольких товаров

Если нужно исключить несколько товаров, замените array( 123 ) на массив с нужными ID, например:

$exclude_ids = array( 123, 456, 789 );
$query->set( 'post__not_in', $exclude_ids );

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

  • Перейдите на страницу магазина WooCommerce: товар с ID 123 должен отсутствовать в списке.
  • Выполните поиск по названию исключенного товара — он не должен появляться в результатах.
  • При переходе по прямой ссылке на товар страница должна открываться (товар не удален).

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

  • Товар все еще отображается в виджетах или на других страницах: проверьте, что код добавлен в правильное место и нет конфликтов с другими плагинами, которые формируют запросы.
  • Пустая страница магазина: если в post__not_in передается пустой массив, это может влиять на запрос. Добавляйте проверку, что массив не пуст:
if ( ! empty( $exclude_ids ) ) {
    $query->set( 'post__not_in', $exclude_ids );
}
  • Код не работает настраиваемых страницах или с кэшированием: очистите кэш сайта и браузера. Если используете плагин кеширования, проверьте настройки исключений.

Альтернативные способы и их сравнение

МетодПлюсыМинусы
Добавление кода в functions.phpБыстро, не требует плагинов, гибкоТребует навыков, легко сломать сайт неправильным кодом
Плагины для скрытия товаров (например, WooCommerce Catalog Visibility Options)Простой интерфейс, дополнительные функцииМожет замедлять сайт, требует обновления, не всегда бесплатны
Изменение статуса товара на "Скрытый"Стандартный функционал WooCommerceНе всегда полностью исключает из поиска и каталога, зависит от темы

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

  • Добавляйте код в дочернюю тему или собственный плагин, чтобы не потерять изменения при обновлении.
  • Избегайте тяжелых запросов в pre_get_posts, старайтесь минимизировать количество исключаемых товаров.
  • Тестируйте изменения на тестовом сайте, чтобы избежать сбоев на боевом.
  • Если используете кэширование, добавьте исключения для страниц с изменениями.
WooCommerce: как отключить автоматическое обновление статуса заказов
24.05.2026
WooCommerce: как отключить автоматическое обновление статуса заказов
13.06.2026
WooCommerce: как корректно удалить вариации товаров при удалении родительского товара
16.06.2026
WooCommerce: как исключить товар из каталога без удаления
07.05.2026
Как использовать хуки в WordPress для автоматизации задач
07.11.2025