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

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

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

Проверьте следующие моменты в админ-панели WooCommerce:

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

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

Шаг 1. Включите управление запасами и скрытие отсутствующих товаров

Перейдите в WooCommerce > Настройки > Товары > Запасы и установите галочки:

  • Включить управление запасами
  • Отключать товар при отсутствии на складе - активируйте, чтобы товар автоматически менял статус на «Черновик» или «В архиве» при достижении остатка 0
  • Скрывать отсутствующие товары из каталога

Шаг 2. Добавьте кастомный код для гарантированного отключения товара

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

add_action('woocommerce_reduce_order_stock', 'auto_disable_product_if_out_of_stock', 10, 1);
function auto_disable_product_if_out_of_stock($order) {
    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if (!$product || !$product->managing_stock()) continue;

        $stock_quantity = $product->get_stock_quantity();
        if ($stock_quantity !== null && $stock_quantity <= 0) {
            // Меняем статус товара на черновик
            $product->set_status('draft');
            $product->save();
        }
    }
}

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

Шаг 3. Обработка вариативных товаров

Для вариативных товаров логика похожая, но нужно проходить по вариациям:

add_action('woocommerce_reduce_order_stock', 'auto_disable_variable_product_if_out_of_stock', 20, 1);
function auto_disable_variable_product_if_out_of_stock($order) {
    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if (!$product) continue;

        if ($product->is_type('variation')) {
            $stock = $product->get_stock_quantity();
            if ($stock !== null && $stock <= 0) {
                $parent_id = $product->get_parent_id();
                $parent = wc_get_product($parent_id);
                if ($parent) {
                    $parent->set_status('draft');
                    $parent->save();
                }
            }
        }
    }
}

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

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

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

  • Ошибка: Товар не меняет статус после заказа.
    Причина: Кэширование сайта или плагинов кеширования мешает обновлению.
    Решение: Очистите кеш и отключите плагины кеширования для проверки.
  • Ошибка: Вариативные товары остаются видимыми даже если все вариации отсутствуют.
    Причина: Статус меняется только у вариаций, а не у родительского товара.
    Решение: Используйте дополнительный код для переключения статуса родительского товара.
  • Ошибка: Ошибка PHP при добавлении кода.
    Причина: Синтаксические ошибки или несовместимость с версией PHP.
    Решение: Проверьте код через отладчик и используйте последние версии WordPress и WooCommerce.

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

  • Не размещайте кастомный код напрямую в functions.php родительской темы — используйте дочернюю тему или кастомный плагин.
  • Код срабатывает на событии woocommerce_reduce_order_stock, что минимизирует нагрузку — не используйте тяжелые запросы в циклах.
  • Регулярно обновляйте WooCommerce и WordPress для безопасности и совместимости.
  • Используйте Clearfy Pro для оптимизации базы данных и удаления лишних ревизий, чтобы база не раздувалась от большого количества заказов и товаров.

Сравнение вариантов автоматического отключения товаров

МетодПлюсыМинусы
Встроенные настройки WooCommerceПростая настройка без кодаНе всегда срабатывает корректно для вариативных товаров
Кастомный код на хуке woocommerce_reduce_order_stockГибкость, точное управление статусом товаровТребуется базовые навыки PHP, можно ошибиться в коде
Плагины сторонних разработчиковГотовое решение с поддержкойМожет увеличить нагрузку, требует обновлений
⭐⭐⭐⭐⭐