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

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

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

Диагностика проблемы

  • Проверьте, включено ли управление запасами в WooCommerce: WooCommerce > Настройки > Товары > Управление запасами.
  • Убедитесь, что конкретные товары настроены на управление запасами и имеют корректные значения остатков.
  • Посмотрите, не влияют ли сторонние плагины или кастомный код на отображение товаров с нулевым остатком.
  • Проверьте, не установлен ли флаг Продажи при отсутствии на складе в настройках товара.

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

1. Включаем управление запасами для магазина и товаров

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

WooCommerce > Настройки > Товары > Управление запасами - поставить галочку

При редактировании товара - во вкладке "Запасы" включить "Управлять запасами?" и заполнить поле "Количество на складе".

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

Через хук woocommerce_reduce_order_stock или при изменении остатка товара можно автоматически менять статус публикации:

add_action('woocommerce_reduce_order_stock', 'auto_disable_product_if_out_of_stock', 10, 1);

function auto_disable_product_if_out_of_stock( $product ) {
    if ( ! is_a( $product, 'WC_Product' ) ) {
        $product = wc_get_product( $product );
    }

    if ( $product->get_stock_quantity() <= 0 ) {
        $product->set_catalog_visibility('hidden'); // скрыть из каталога
        $product->set_status('draft'); // сделать черновиком
        $product->save();
    }
}

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

3. Обработка товаров с изменением остатков вручную

Чтобы синхронизировать статус при ручном изменении запасов, добавьте:

add_action('save_post_product', 'check_stock_and_update_status', 20, 3);

function check_stock_and_update_status($post_ID, $post, $update) {
    if ( wp_is_post_revision( $post_ID ) ) return;

    $product = wc_get_product( $post_ID );
    if ( ! $product->managing_stock() ) return;

    $stock = $product->get_stock_quantity();

    if ( $stock <= 0 && $post->post_status !== 'draft' ) {
        $post->post_status = 'draft';
        wp_update_post( $post );
    } elseif ( $stock > 0 && $post->post_status === 'draft' ) {
        $post->post_status = 'publish';
        wp_update_post( $post );
    }
}

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

  • Создайте тестовый товар с управлением запасами и установите количество 1.
  • Оформите заказ на этот товар, чтобы остаток стал 0.
  • Проверьте, что товар автоматически стал черновиком и пропал из каталога.
  • Измените остаток вручную на значение больше 0 — товар должен автоматически опубликоваться.

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

  • Товар не меняет статус после заказа: проверьте, что в коде нет ошибок, и что хук woocommerce_reduce_order_stock срабатывает. Кэширование может мешать — очистите кэш сайта и браузера.
  • Товар продолжает отображаться несмотря на статус черновика: убедитесь, что тема и плагины корректно обрабатывают статус draft. Иногда стоит вместо изменения статуса использовать set_catalog_visibility('hidden').
  • Ручное изменение остатков не обновляет статус: проверьте, что функция на save_post_product добавлена в functions.php и работает без ошибок.
  • Срабатывание кода с ошибками PHP: всегда проверяйте логи ошибок, используйте отладчик или WP_DEBUG.

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

  • Добавляйте проверку прав пользователя в функции, которые меняют статусы (например, проверяйте current_user_can('edit_product', $post_ID)), чтобы избежать нежелательных изменений.
  • Кэшируйте результаты, если используете подобный функционал на сайте с большим количеством товаров.
  • Тестируйте код на staging-среде перед внедрением в продакшен.

Сравнение вариантов реализации

МетодОписаниеПлюсыМинусы
Использование плагина управления запасамиГотовые решения с настройкамиПростота, поддержкаЗависимость от стороннего кода, нагрузка
Кастомный код с хукамиТочная настройка поведенияЛегковесность, контрольТребует навыков разработки
Изменение статуса товара вручнуюБез кода, через админкуПростотаРучной труд, ошибки
WooCommerce: автоматическое отключение товаров при нулевом остатке складских запасов
29.06.2026
Как использовать хуки для изменения отображения цен в WooCommerce
01.05.2026
Как автоматизировать удаление неактивных пользователей в WordPress
28.03.2026
Как очистить базу данных WordPress от старых meta данных и оптимизировать сайт
13.03.2026
WooCommerce: автоматическое обновление остатков товаров в реальном времени
13.06.2026