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

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

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

Ручное отключение таких вариантов при большом ассортименте затратно и подвержено ошибкам. Поэтому требуется автоматизация процесса отключения вариантов с нулевыми остатками.

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

Чтобы понять, что ваша система не отключает варианты с нулевым остатком, проверьте:

  • В карточке товара в админке вариации с остатком 0 отображаются как активные (состояние "В наличии").
  • На фронтенде вариации с нулевым остатком доступны для выбора и покупки.
  • В заказах появляются позиции с такими вариантами, даже если их нет в наличии.

Также полезно проверить настройки управления запасами в WooCommerce: WooCommerce > Настройки > Товары > Управление запасами. Флажок "Включить управление запасами" должен быть активен.

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

1. Подключение хука для автоотключения вариантов

Используем хук woocommerce_variation_set_stock, который срабатывает при обновлении запаса вариации. В функции проверяем остаток и меняем статус вариации.

add_action('woocommerce_variation_set_stock', 'auto_disable_variation_if_out_of_stock', 10, 1);
function auto_disable_variation_if_out_of_stock($variation) {
    if (!$variation instanceof WC_Product_Variation) {
        return;
    }

    $stock_quantity = $variation->get_stock_quantity();
    if ($stock_quantity === 0) {
        // Отключаем вариант
        $variation->set_status('private'); // или 'draft' по необходимости
        $variation->save();
    } else {
        // Включаем вариант, если есть остаток
        $variation->set_status('publish');
        $variation->save();
    }
}

2. Массовое обновление статусов для существующих вариантов

Чтобы обработать уже существующие варианты с нулевым остатком, добавьте скрипт массового обновления. Запустите в админке или временно вставьте в файл functions.php:

function bulk_disable_out_of_stock_variations() {
    $args = [
        'post_type' => 'product_variation',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_stock_status',
                'value' => 'outofstock'
            ]
        ]
    ];
    $query = new WP_Query($args);
    if (!$query->have_posts()) {
        return;
    }
    foreach ($query->posts as $variation_post) {
        $variation = wc_get_product($variation_post->ID);
        if ($variation) {
            $variation->set_status('private');
            $variation->save();
        }
    }
}
// ТОЛЬКО ОДИН РАЗ вызовите функцию
// bulk_disable_out_of_stock_variations();

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

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

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

  • Хук не срабатывает при массовом обновлении остатков. При импорте остатков из CSV или сторонних плагинов они могут не триггерить хук woocommerce_variation_set_stock. В таком случае используйте периодический запуск функции массового обновления.
  • Статус вариации меняется, но на сайте вариант всё равно виден. Проверьте, не кэшируется ли страница или не конфликтует ли тема с отображением статусов. Очистите кэш сайта и браузера.
  • Вариации не переключаются обратно в "publish" при появлении остатков. Убедитесь, что условие переключения статуса учитывает любое положительное число остатков.
  • Использование статусов "private" или "draft" приводит к проблемам с SEO. Если важна видимость вариаций, рассмотрите альтернативные методы (например, скрывать через CSS или фильтрацию в запросах).

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

  • Не вызывайте функцию массового обновления без необходимости — при большом количестве вариаций она может вызвать нагрузку.
  • Добавьте проверку nonce и прав пользователя, если функция запускается из интерфейса админки.
  • При использовании статуса "private" вариации не индексируются поисковыми системами, что полезно для SEO.
  • Если у вас включены кэш-плагины, настройте их на автоматическую очистку кэша при обновлении статусов продуктов.

Сравнение вариантов решения задачи

МетодПлюсыМинусыРекомендации
Хук woocommerce_variation_set_stockАвтоматическое обновление при изменении остатков, минимальная задержкаНе срабатывает при массовом импорте, требует кодаИспользовать вместе с массовым скриптом
Массовый скрипт массового обновленияОбрабатывает все варианты сразу, включая импортНагрузка при больших каталогах, требует ручного запускаЗапускать по расписанию или вручную время от времени
Плагины для управления остаткамиГотовые решения, удобный интерфейсМогут быть платными, добавляют нагрузкуИспользовать при отсутствии навыков программирования
WooCommerce: как избежать проблемы с кешированием и отображением товаров при фильтрации AJAX
16.05.2026
WooCommerce: как автоматически отключать варианты товаров без остатков
11.07.2026
Как добавить внутреннюю AJAX-переходку в WordPress без перезагрузки страницы
09.02.2026
Как избежать проблем с hoistingом в WordPress: практические советы
05.01.2026
WooCommerce: как автоматически отключить неактивные варианты товаров
30.06.2026