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

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

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

Основные причины проблемы:

  • Настройка Управление запасами отключена в WooCommerce.
  • Товар не отмечен как «отслеживаемый по запасам» (manage stock).
  • Нет автоматической логики для смены статуса товара при достижении нулевого остатка.

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

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

add_action('woocommerce_product_set_stock', 'auto_disable_product_on_zero_stock', 10, 1); 

function auto_disable_product_on_zero_stock($product) {
    // Проверяем остаток
    $stock_quantity = $product->get_stock_quantity();

    // Проверяем, что управление запасами включено
    if (!$product->managing_stock()) {
        return;
    }

    // Если остаток 0 или меньше, меняем статус на черновик
    if ($stock_quantity <= 0) {
        if ($product->get_status() !== 'draft') {
            $product->set_status('draft');
            $product->save();
        }
    } else {
        // Если товар снова в наличии, возвращаем статус опубликованного
        if ($product->get_status() === 'draft') {
            $product->set_status('publish');
            $product->save();
        }
    }
}

Этот хук срабатывает всякий раз, когда обновляется запас товара. При достижении нуля или отрицательного значения статус товара меняется на «черновик», и он перестает отображаться в каталоге. При пополнении запаса — возвращается в публикацию.

Как использовать код с вариациями и простыми товарами

Если у вас есть вариации товаров, нужно отдельно отслеживать каждую вариацию. Для этого можно использовать следующий код:

add_action('woocommerce_variation_set_stock', 'auto_disable_variation_on_zero_stock', 10, 1);

function auto_disable_variation_on_zero_stock($variation) {
    $stock_quantity = $variation->get_stock_quantity();

    if (!$variation->managing_stock()) {
        return;
    }

    if ($stock_quantity <= 0) {
        if ($variation->get_status() !== 'private') {
            $variation->set_status('private'); // скрываем вариацию
            $variation->save();
        }
    } else {
        if ($variation->get_status() === 'private') {
            $variation->set_status('publish');
            $variation->save();
        }
    }
}

Статус private у вариаций скрывает их из каталога без удаления.

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

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

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

  • Код не срабатывает при обновлении запаса вручную через базу данных: Обновление должно проходить через стандартный интерфейс WooCommerce или API, чтобы сработал хук.
  • Товар не меняет статус, потому что управление запасами отключено: Проверьте, что у товара включена опция Управление запасами в настройках продукта.
  • Вариации не меняют статус: Используйте отдельный хук woocommerce_variation_set_stock и соответствующий код.
  • Проблемы с кэшированием: Очистите кэш сайта и браузера после внедрения.

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

  • Добавляйте код в дочернюю тему или отдельный плагин, чтобы избежать потери при обновлении темы.
  • Регулярно проверяйте работу скрипта после больших обновлений WooCommerce.
  • Если на сайте много товаров, убедитесь, что хук не вызывает замедления. Для масштабных каталогов лучше использовать WP CLI или CRON задачи для пакетной обработки.

Сравнение вариантов решения

МетодПлюсыМинусыПример использования
Код в functions.phpБесплатно, полный контроль, быстроТребует навыков PHP, возможны ошибки при обновленияхПример из статьи
Плагины управления запасамиПростота, готовое решение, поддержкаДополнительная нагрузка, стоимость, могут конфликтоватьWooCommerce Stock Manager и аналоги
CRON-скрипты для пакетной обработкиПодходит для больших каталогов, оптимизация нагрузкиСложнее в настройке, требует серверных знанийWP CLI скрипт или кастомный CRON
Оценка производительности WordPress с помощью Query Monitor
09.04.2026
WordPress REST API: установка и настройка для начинающих
05.11.2025
WooCommerce: как автоматически удалять товары с нулевым остатком на складе
08.05.2026
Как установить ограничения на регистрацию в WordPress по домену email
16.01.2026
WooCommerce: как автоматически удалять товары с нулевым остатком на складе без плагинов
17.05.2026