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

Диагностика проблемы с отображением вариантов без остатков

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

Проверить наличие таких вариантов можно в админке WooCommerce в разделе "Товары" - открыть нужный товар и посмотреть вкладку "Вариации". Если у варианта количество на складе равно 0, а он при этом активен, значит, автоматическое отключение не настроено.

Почему WooCommerce не отключает варианты с 0 остатком автоматически

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

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

1. Использование хука woocommerce_product_set_stock для контроля остатков

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

add_action('woocommerce_product_set_stock', 'auto_disable_variation_on_zero_stock', 10, 1);
function auto_disable_variation_on_zero_stock($product) {
    if ($product->is_type('variation')) {
        $stock_quantity = $product->get_stock_quantity();
        $status = ($stock_quantity &> 0) ? 'publish' : 'private'; // private - скрывает вариант
        if ($product->get_status() !== $status) {
            $product->set_status($status);
            $product->save();
        }
    }
}

Этот код слушает событие обновления остатков и меняет статус варианта на "private" (скрытый), если остаток 0 или меньше. Статус "private" исключает вариант из вывода в каталоге и на странице товара.

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

Чтобы применить правило к уже существующим вариантам с нулевым остатком, нужно выполнить массовый скрипт:

function batch_disable_zero_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);
        if (!$variation) continue;
        $stock = $variation->get_stock_quantity();
        $new_status = ($stock > 0) ? 'publish' : 'private';
        if ($variation->get_status() !== $new_status) {
            $variation->set_status($new_status);
            $variation->save();
        }
    }
}
// Запускайте функцию вручную, например, через wp-cli или временно в functions.php
// batch_disable_zero_stock_variations();

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

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

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

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

  • Вариации не скрываются после обновления остатков: Возможно, кэш страниц или объекта. Очистите кэш сайта и браузера.
  • Вариации отображаются, но статус private не меняется: Проверьте права пользователя, под которым запускается код, и наличие ошибок в логах.
  • Покупка товаров с 0 остатком все ещё разрешена: В настройках WooCommerce убедитесь, что отключена опция "Разрешить покупку товаров без остатков".

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

  • Не запускайте массовые скрипты на живом сайте без тестирования — лучше использовать wp-cli или запускать на staging.
  • Добавляйте логику отключения варианта только для товаров с типом вариация, чтобы избежать влияния на простые товары.
  • Для больших магазинов рекомендуется использовать WP Cron с отложенным выполнением массовых операций.
  • При изменениях в functions.php используйте дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении темы.

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

МетодОписаниеПреимуществаНедостатки
Код на хуке woocommerce_product_set_stockАвтоматическая смена статуса варианта при обновлении остаткаБыстрое реагирование, без сторонних плагиновТребует программных навыков, не влияет на уже существующие варианты без запуска массовой функции
Плагин «Out of Stock Variations» (сторонний)Автоматическое скрытие вариантов с 0 остаткомПростота установки, готовое решениеДополнительная нагрузка, возможные конфликты, ограниченная кастомизация
Массовое обновление через SQL-запросыПрямое изменение статуса в базе данныхБыстрое массовое решениеРиск ошибок, требует резервного копирования, не автоматическое
Как создать автоматический импорт постов в WordPress из внешнего источника
03.04.2026
Как создать динамическое меню в WordPress: пошаговое руководство
21.11.2025
Как избежать проблем с hoistingом в WordPress: практические советы
05.01.2026
Как удалить автоматические редиректы в WordPress: практическое руководство
29.01.2026
WooCommerce: как исправить проблему с отображением вариаций товаров
04.05.2026