WooCommerce: автоматическое отключение неактивных вариантов товаров

Проблема: зачем отключать неактивные варианты товаров в WooCommerce

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

Автоматическое отключение или скрытие вариаций с нулевым остатком и статусом «нет в наличии» помогает повысить удобство использования магазина и уменьшить количество обращений в техподдержку.

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

Для начала необходимо проверить, как WooCommerce обрабатывает запасы и отображение вариаций:

  • В настройках WooCommerce — WooCommerce > Настройки > Товары > Запасы — должна быть включена опция «Включить управление запасами».
  • Для каждого варианта товара в админке проверьте поля «Управление запасами», «Количество на складе» и «Статус наличия» (например, «Нет в наличии»).
  • На фронтенде убедитесь, что вариации с нулевым остатком показываются (если это нежелательно).

Если неактивные варианты отображаются покупателям, нужно автоматизировать их отключение.

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

1. Создаем функцию для автоматического изменения статуса вариаций

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

add_action('woocommerce_product_set_stock', 'auto_disable_variation_if_out_of_stock', 10, 1);

function auto_disable_variation_if_out_of_stock($product) {
    if ($product->is_type('variation')) {
        $stock_quantity = $product->get_stock_quantity();
        $manage_stock = $product->get_manage_stock();

        if ($manage_stock && $stock_quantity <= 0) {
            $product->set_status('private'); // Отключаем вариацию
            $product->save();
        } else {
            if ($product->get_status() === 'private') {
                $product->set_status('publish'); // Включаем вариацию, если есть на складе
                $product->save();
            }
        }
    }
}

Эта функция срабатывает при изменении запаса конкретного варианта. Если запас 0 или меньше — устанавливаем статус «private», чтобы вариация стала недоступна покупателям.

2. Запускаем массовое обновление для существующих вариаций

Чтобы сразу отключить все неактивные вариации, можно выполнить скрипт разового запуска через WP-CLI или временно добавить код:

function disable_all_out_of_stock_variations() {
    $args = [
        'post_type' => 'product_variation',
        'posts_per_page' => -1,
        'post_status' => ['publish', 'private'],
    ];

    $variations = get_posts($args);

    foreach ($variations as $variation_post) {
        $variation = wc_get_product($variation_post->ID);
        $stock_quantity = $variation->get_stock_quantity();
        $manage_stock = $variation->get_manage_stock();

        if ($manage_stock && $stock_quantity <= 0 && $variation->get_status() !== 'private') {
            $variation->set_status('private');
            $variation->save();
        } elseif ($manage_stock && $stock_quantity > 0 && $variation->get_status() === 'private') {
            $variation->set_status('publish');
            $variation->save();
        }
    }
}
// Запустить один раз
// disable_all_out_of_stock_variations();

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

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

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

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

  • Вариации по-прежнему отображаются: проверьте, что в настройках WooCommerce включено управление запасами и отключена опция «Разрешить заказы при отсутствии товара» (WooCommerce > Настройки > Товары > Запасы).
  • Статус вариации не меняется: убедитесь, что функция подключена и нет конфликтов с другими плагинами, влияющими на статусы продуктов.
  • Проблемы с кешированием: после изменения запасов очистите кеш сайта и браузера, чтобы увидеть актуальное состояние.
  • Вариации становятся невидимыми в админке: статус private скрывает вариации в публичной части, но они остаются видимыми в админке, если возникнут проблемы с видимостью, проверьте права пользователя.

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

  • Используйте WP-CLI для массовых операций с вариациями, это быстрее и безопаснее, чем запускать тяжелые циклы с PHP через веб.
  • Автоматизируйте обработку через хук woocommerce_product_set_stock, чтобы не запускать лишние запросы при каждом загрузке страницы.
  • Периодически выполняйте аудит вариаций с помощью SQL-запросов для выявления несоответствий в запасах и статусах.
  • Если магазин большой, подумайте о создании отдельного cron-задачи для регулярной проверки и обновления статусов вариаций.

Сравнение вариантов решения

МетодПлюсыМинусыКомпромисс
Использование хука woocommerce_product_set_stockАвтоматическое обновление, минимальная нагрузкаНе охватывает массовые изменения сразуКомбинировать с разовым скриптом для массовой обработки
Массовый скрипт на get_postsОбрабатывает все вариации сразуВысокая нагрузка при большом каталоге, требует запуска вручнуюЗапускать через WP-CLI или ограничивать пакетами
Плагины управления запасамиГотовые решения с UI, дополнительные функцииМожет замедлять сайт, возможны конфликтыИспользовать при больших магазинах и сложных сценариях
Как создать автоматическую сборку и оптимизацию изображений в WordPress
02.02.2026
Как создать собственный шорткод в WordPress
01.11.2025
Как создать настройку автообновления плагинов WordPress с контролем и уведомлениями
01.03.2026
Как удалить CSS класс из элемента в WordPress с помощью JavaScript
13.03.2026
WordPress оптимизация базы данных: практические советы и примеры
14.11.2025