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

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

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

Проверка текущих настроек управления запасами

  • В админке WordPress перейдите в WooCommerce → Настройки → Товары → Запасы.
  • Убедитесь, что опция «Включить управление запасами» активирована.
  • Проверьте, что для каждого варианта товара включено управление запасами и правильно выставлены значения «Количество на складе» и «Разрешить заказы при отсутствии товара» (должно быть отключено).

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

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

add_action('save_post_product', 'disable_variations_without_stock', 20, 3);function disable_variations_without_stock($post_id, $post, $update) {  if ($post->post_type !== 'product') {    return;  }  $product = wc_get_product($post_id);  if (!$product || $product->get_type() !== 'variable') {    return;  }  $variations = $product->get_children();  foreach ($variations as $variation_id) {    $variation = wc_get_product($variation_id);    if (!$variation) {      continue;    }    $stock_quantity = $variation->get_stock_quantity();    if ($stock_quantity === 0 || $stock_quantity === null) {      // Отключаем вариант      wp_update_post(array(        'ID' => $variation_id,        'post_status' => 'draft'      ));    } else {      // Включаем вариант, если запас есть      wp_update_post(array(        'ID' => $variation_id,        'post_status' => 'publish'      ));    }  }}

Этот код отключает варианты товаров с нулевым запасом, переводя их в статус «черновик», а варианты с запасом — публикует.

Как применить код

  • Добавьте код в файл functions.php дочерней темы или в кастомный плагин.
  • После сохранения вариативного товара код выполнится и обновит статусы вариантов.

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

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

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

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

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

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

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

Альтернативные варианты реализации

МетодПреимуществаНедостатки
Код на хуке save_post_productАвтоматическое отключение без плагиновНагрузка при сохранении, возможные задержки
Плагин для управления запасами (например, "WooCommerce Advanced Stock Management")Готовые настройки, поддержкаДополнительная нагрузка, возможные конфликты
WP-Cron задача для периодической проверки и отключенияНе нагружает админку, гибкоЗадержка в обновлении статусов
Автоматическое удаление старых Post Meta в WordPress: практическое руководство
08.04.2026
Как отключить Gutenberg и вернуть классический редактор в WordPress
12.12.2025
Как удалить и избежать duplicate content в WordPress
02.01.2026
Как автоматизировать создание резервных копий WordPress без плагинов
21.02.2026
Как избежать проблем с конфликтами между плагинами WordPress
30.01.2026