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

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

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

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

Если варианты с нулём на складе доступны для выбора и покупки, значит требуется автоматическая их деактивация.

Шаги решения: как автоматически отключать варианты при отсутствии запаса

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

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

2. Добавление кода для автоматической деактивации вариантов с нулевым запасом

Добавьте следующий код в файл functions.php вашей дочерней темы или в пользовательский плагин. Этот код автоматически устанавливает статус вариантов с запасом 0 как draft, что делает их недоступными на сайте.

add_action('woocommerce_product_set_stock_status', 'disable_variations_with_no_stock', 10, 3);
function disable_variations_with_no_stock($product_id, $stock_status, $product) {
    if ($product->is_type('variable')) {
        $variations = $product->get_children();
        foreach ($variations as $variation_id) {
            $variation = wc_get_product($variation_id);
            if ($variation->managing_stock() && !$variation->is_in_stock()) {
                if ($variation->get_status() !== 'draft') {
                    $variation->set_status('draft');
                    $variation->save();
                }
            } else {
                if ($variation->get_status() === 'draft') {
                    $variation->set_status('publish');
                    $variation->save();
                }
            }
        }
    }
}

// Запустить проверку статусов при загрузке админки (для синхронизации)
add_action('admin_init', function() {
    $args = [
        'post_type' => 'product',
        'post_status' => 'publish',
        'numberposts' => -1
    ];
    $products = get_posts($args);
    foreach ($products as $post) {
        $product = wc_get_product($post->ID);
        if ($product->is_type('variable')) {
            do_action('woocommerce_product_set_stock_status', $post->ID, '', $product);
        }
    }
});

3. Очистка кэша и проверка работы скрипта

После добавления кода очистите кэш сайта (если используете плагин кэширования), а также кэш браузера. Затем на фронтенде проверьте страницу вариативного товара с нулевыми запасами — варианты с нулём должны быть скрыты или недоступны для выбора.

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

  • Обновите страницу вариативного товара и убедитесь, что варианты с запасом 0 не отображаются в селекторе вариаций.
  • В админке в разделе «Вариации» варианты с нулевым запасом должны иметь статус Черновик (draft).
  • Попробуйте вручную изменить запас варианта с 0 на положительное число — статус должен автоматически измениться обратно на Опубликовано (publish), и вариант должен стать доступен на сайте.

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

  • Код не срабатывает при массовом обновлении запасов. Проверьте, что функция woocommerce_product_set_stock_status вызывается корректно, и что переменная $product действительно является объектом WC_Product_Variable.
  • Варианты остаются видимыми, хотя запас 0. Возможно, у варианта отключено управление запасами (manage_stock=false). В этом случае код не отключит вариант. Проверьте настройку управления запасами у каждого варианта.
  • Изменения не применяются сразу на фронтенде. Очистите кэш сайта, а также кэш браузера. Если используете CDN, очистите кэш там.
  • Функция не запускается при импорте товаров. При импорте запасов через CSV или API может не срабатывать хук. В этом случае запустите ручную проверку через admin_init или выполните скрипт вручную.

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

  • Резервное копирование. Перед внесением изменений в код и автоматической сменой статусов сделайте резервную копию базы данных.
  • Отложенная обработка. Если у вас очень большой каталог, рекомендуется запускать проверку запасов в фоне через WP-Cron или отдельный скрипт, чтобы не нагружать страницу админки.
  • Логирование. Добавьте логирование изменений статусов вариантов для отладки и мониторинга.
  • Минимизация прямого редактирования. Лучше оформить код в отдельный плагин, чтобы не потерять изменения при обновлении темы.

Сравнение способов решения задачи

МетодОписаниеПлюсыМинусы
Код в functions.phpАвтоматическая смена статуса варианта на draftБесплатно, гибко, автоматизацияНужен опыт, возможны ошибки при обновлениях
Плагины управления запасамиПлагины с настройками скрытия товаров без запасаПростота настройки, поддержкаДополнительные нагрузки, платные решения
Ручное управлениеРучное отключение вариантов в админкеПростота и контрольТрудозатратно, риск ошибок
Как удалить зависшие варианты рубрик в WordPress: практическое руководство
16.03.2026
Автоматическое отключение вариантов товаров WooCommerce при отсутствии запаса
22.07.2026
Как создать автоматические задачи в WordPress с помощью WPReg_cron
27.11.2025
Оптимизация изображений в WordPress: улучшение скорости и SEO
02.12.2025
Как удалить зависшие задачи WP-Cron в WordPress
06.12.2025