Как исключить отображение товаров с нулевым запасом в WooCommerce с помощью кода

Зачем исключать товары с нулевым запасом из каталога WooCommerce?

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

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

Для начала убедитесь, что у вас включено управление запасами в WooCommerce и корректно выставлен статус товара. Проверьте следующие моменты:

  • Включено ли управление запасами в WooCommerce > Настройки > Товары > Запасы.
  • Для каждого товара настроено управление запасами и указано количество.
  • Статус товара не установлен вручную как "В наличии".
  • Отсутствует ли переопределение видимости товара в коде или плагинах.

Если все параметры корректны, но товары с нулевым запасом все равно отображаются, значит нужна кастомизация запроса.

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

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

add_action('pre_get_posts', 'exclude_out_of_stock_products_from_catalog');
function exclude_out_of_stock_products_from_catalog($query) {
    if (is_admin() || !$query->is_main_query()) {
        return;
    }

    if (is_shop() || is_product_category() || is_product_tag()) {
        // Включаем фильтрацию по наличию
        $meta_query = $query->get('meta_query');
        if (!is_array($meta_query)) {
            $meta_query = [];
        }

        // Исключаем товары с _stock_status = 'outofstock'
        $meta_query[] = [
            'key' => '_stock_status',
            'value' => 'outofstock',
            'compare' => '!='
        ];

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

Этот код добавляет дополнительный фильтр к основному запросу WooCommerce и исключает все товары, у которых метаполе _stock_status имеет значение outofstock.

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

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

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

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

  • Код не работает, товары с нулевым запасом видны: проверьте, что вы редактируете правильный файл и что код подключен.
    Проверьте, что запрос действительно основной (is_main_query()), и что условия is_shop() или категории срабатывают.
  • Фильтр исключает слишком много товаров: возможно, есть товары с неправильным статусом запаса — проверьте вручную в базе данных.
  • Проблемы с кешем: отключите все кеширующие плагины на время теста и очистите кеш.
  • Конфликт с плагинами управления запасами: временно деактивируйте сторонние плагины, которые могут изменять запросы.

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

  • Добавляйте код через дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлениях.
  • Используйте pre_get_posts только с условиями проверки is_main_query и !is_admin(), чтобы избежать замедления административной части.
  • Если у вас много товаров, учитывайте нагрузку на базу данных — можно использовать кеширование результатов запроса.
  • Для более гибкой настройки можно использовать фильтр woocommerce_product_query_meta_query, но это требует понимания работы WooCommerce.

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

МетодПлюсыМинусы
Использование кода с pre_get_postsБыстро, без плагинов, гибкоТребуется знание PHP, риск ошибки при неправильном коде
Плагин управления запасами (например, WooCommerce Out of Stock Visibility)Простота установки, готовые настройкиДополнительная нагрузка на сайт, возможные конфликты
Отметка товаров как "Скрытые" вручнуюПростота для малого каталогаНе подходит для динамического каталога, требует ручного труда
Как автоматизировать создание собственных типов записей в WordPress с помощью кода и плагинов
21.12.2025
Как отключить авторизацию по телефону в WordPress
28.12.2025
Автоматическое удаление старых записей WordPress через AJAX
22.01.2026
Как удалить неиспользуемые круглые даты из WordPress
25.02.2026
Как автоматизировать удаление старого контента WooCommerce по дате
13.06.2026