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

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

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

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

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

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

1. Проверка и настройка управления запасами WooCommerce

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

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

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

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

add_action('woocommerce_product_set_stock_status', 'auto_disable_product_on_out_of_stock', 10, 1);
function auto_disable_product_on_out_of_stock($product) {
    if (!$product instanceof WC_Product) return;
    if ($product->get_stock_quantity() <= 0) {
        $product->set_catalog_visibility('hidden');
        $product->save();
    } else {
        // При пополнении запаса возвращаем видимость
        $product->set_catalog_visibility('visible');
        $product->save();
    }
}

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

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

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

add_action('woocommerce_variation_set_stock_status', 'sync_variable_product_visibility', 10, 2);
function sync_variable_product_visibility($variation, $stock_status) {
    $parent_id = $variation->get_parent_id();
    $parent_product = wc_get_product($parent_id);
    $variations = $parent_product->get_children();
    $in_stock = false;
    foreach ($variations as $variation_id) {
        $var = wc_get_product($variation_id);
        if ($var->is_in_stock()) {
            $in_stock = true;
            break;
        }
    }
    if ($in_stock) {
        $parent_product->set_catalog_visibility('visible');
    } else {
        $parent_product->set_catalog_visibility('hidden');
    }
    $parent_product->save();
}

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

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

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

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

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

  • Добавляйте кастомный код через дочернюю тему или отдельный плагин, чтобы избежать потери изменений при обновлениях.
  • Не используйте тяжелые запросы к базе — в представленном коде изменения происходят только при обновлении запасов, что минимизирует нагрузку.
  • Регулярно проверяйте совместимость кастомного кода с обновлениями WooCommerce и WordPress.
  • Для больших магазинов с тысячами товаров рассмотрите возможность использования специализированных плагинов кэширования и оптимизации базы данных, например Clearfy Pro (https://wpshop.ru/plugins/clearfy), чтобы избежать замедления при массовых обновлениях запасов.

Сравнение вариантов решения проблемы

МетодПлюсыМинусыКогда использовать
Стандартные настройки WooCommerceПростота, без кодаНе всегда работает с кастомными темами/плагинамиМалые и средние магазины без кастомизаций
Кастомный код в functions.phpГибкость, точное управлениеТребует навыков PHP, возможны ошибкиЕсли стандарт не подходит или нужны дополнительные условия
Плагины для управления запасамиДополнительный функционал, удобствоЗависимость от стороннего кода, нагрузкаБольшие магазины с комплексными требованиями
⭐⭐⭐⭐⭐