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

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

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

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

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

  • Проверка настроек WooCommerce: WooCommerce > Настройки > Товары > Запасы — параметр Включить управление запасами должен быть активен.
  • Параметр Разрешить заказ при отсутствии товара должен быть выключен, чтобы товар не заказывался при отсутствии.
  • Проверка статуса товара: даже при 0 на складе статус товара может оставаться publish, если не настроено автоматическое управление статусом.
  • Если используется сторонний плагин управления складом, он может переопределять логику WooCommerce.

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

1. Включаем управление запасами в WooCommerce

Перейдите в WooCommerce > Настройки > Товары > Запасы и убедитесь, что опция Включить управление запасами активирована.

2. Отключаем возможность заказа при отсутствии товара

В том же разделе снимите галочку с Разрешить заказ при отсутствии товара.

3. Добавляем пользовательский код для автоматического отключения товаров

WooCommerce не меняет автоматически статус товара на «черновик» или «отключено» при достижении запаса 0, поэтому добавим хук для автоматической деактивации.

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

function auto_disable_product_if_out_of_stock($product) {
    if (!$product instanceof WC_Product) {
        $product = wc_get_product($product);
    }

    // Проверяем, если запас 0 или меньше
    if ($product->get_stock_quantity() <= 0) {
        // Меняем статус товара на 'draft' (черновик)
        $post = get_post($product->get_id());
        if ($post->post_status !== 'draft') {
            wp_update_post([
                'ID' => $product->get_id(),
                'post_status' => 'draft'
            ]);
        }
    }
}

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

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

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

add_action('save_post_product', 'check_stock_and_disable_product', 20, 3);
function check_stock_and_disable_product($post_id, $post, $update) {
    if (wp_is_post_revision($post_id)) return;

    $product = wc_get_product($post_id);
    if (!$product) return;

    if ($product->get_stock_quantity() <= 0) {
        if ($post->post_status !== 'draft') {
            // Меняем статус
            remove_action('save_post_product', 'check_stock_and_disable_product', 20);
            wp_update_post([
                'ID' => $post_id,
                'post_status' => 'draft'
            ]);
            add_action('save_post_product', 'check_stock_and_disable_product', 20, 3);
        }
    } else {
        // Если запас появился, переводим обратно в опубликованный статус
        if ($post->post_status === 'draft') {
            remove_action('save_post_product', 'check_stock_and_disable_product', 20);
            wp_update_post([
                'ID' => $post_id,
                'post_status' => 'publish'
            ]);
            add_action('save_post_product', 'check_stock_and_disable_product', 20, 3);
        }
    }
}

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

  • Создайте тестовый продукт с запасом 1.
  • Сделайте заказ, чтобы уменьшить запас до 0, или вручную установите запас в 0 через админку.
  • Проверьте, что статус товара автоматически изменился на черновик и товар исчез с витрины.
  • Увеличьте запас обратно и проверьте, что товар возвращается в опубликованный статус.

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

  • Код не срабатывает при изменении запаса через импорт — добавьте проверку на сохранение товара (как показано в шаге 4).
  • Товар остаётся видимым после установки запаса 0 — проверьте, включено ли управление запасами в настройках WooCommerce.
  • Конфликт с плагинами управления складом — временно отключите сторонние плагины и проверьте работу кода.
  • Статус товара меняется, но товар всё равно отображается — проверьте, не используется ли кэширование страниц или сторонние кэш-плагины, очистите кеш.

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

  • Добавляйте код в дочернюю тему functions.php или в отдельный site-specific плагин, чтобы не потерять изменения при обновлении.
  • Используйте remove_action и add_action при обновлении статуса, чтобы избежать рекурсии.
  • При большом количестве товаров и частых заказах рассмотрите оптимизацию: кеширование запросов и асинхронную обработку статусов через WP-Cron.
  • Проверяйте права доступа, чтобы код не запускался на фронтенде без необходимости.

Сравнение способов реализации

МетодПлюсыМинусы
Настройки WooCommerceПростая настройка без кодаНе отключает товар, только запрещает заказ
Код на хуках (woocommerce_reduce_stock, save_post_product)Автоматически меняет статус товара, скрывая его полностьюТребует поддержки и тестирования при обновлениях
Сторонние плагины управления запасамиДополнительный функционал, отчеты, интеграцииМогут конфликтовать, создавать нагрузку
Как сделать автоматическое удаление старых вариантов товаров в WooCommerce
04.07.2026
Как оптимизировать производительность WordPress при большом количестве посетителей
16.04.2026
Как устроен AJAX в WooCommerce и как его оптимизировать
30.04.2026
Как установить автоматическое обновление тем и плагинов WordPress без рисков
16.12.2025
Как сделать автоматический откат обновлений в WordPress при ошибках
03.04.2026