Диагностика проблемы: почему варианты с нулевым запасом доступны для покупки
В 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 задача для периодической проверки и отключения | Не нагружает админку, гибко | Задержка в обновлении статусов |