Диагностика проблемы: почему варианты товаров не отключаются при отсутствии запаса
В стандартной установке WooCommerce, если у вариативного товара один из вариантов закончился, он может автоматически становиться недоступным для покупки. Однако иногда не происходит отключение варианта товара, даже если его запас равен нулю. Это приводит к негативному опыту пользователей и потенциальным ошибкам при оформлении заказа.
Основные причины такой проблемы:
- Неправильные настройки управления запасом в WooCommerce;
- Кастомные шаблоны или плагины, которые переопределяют поведение отображения вариаций;
- Закэшированные данные, из-за которых фронтенд не обновляет статус варианта;
- Варианты, у которых опция "Разрешить покупку при отсутствии запаса" включена.
Пошаговое решение: как автоматически отключить варианты по нулевому запасу
1. Проверка и корректировка настроек WooCommerce
В админке WordPress перейдите в WooCommerce > Настройки > Товары > Запасы и убедитесь, что включена опция Включить управление запасами. Проверьте, что опция Разрешить покупку при отсутствии запаса отключена.
2. Обновление статуса вариаций через код
Если стандартное поведение не срабатывает, добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин. Этот код автоматически снимает с публикации варианты, у которых запас равен нулю, что исключит их из отображения на сайте.
add_action('woocommerce_product_set_stock', 'auto_disable_variations_on_zero_stock', 10, 1);
function auto_disable_variations_on_zero_stock($product) {
if (!$product->is_type('variable')) {
return;
}
$variations = $product->get_children();
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if ($variation->managing_stock() && $variation->get_stock_quantity() <= 0) {
$variation->set_status('draft');
$variation->save();
} else {
// Включаем обратно, если есть запас
if ($variation->get_status() === 'draft') {
$variation->set_status('publish');
$variation->save();
}
}
}
}Этот хук срабатывает при изменении запаса у основного товара. Если вы хотите, чтобы проверка происходила при изменении запасов у каждой вариации, используйте хук woocommerce_variation_set_stock аналогичным образом.
3. Очистка кэша и обновление страницы
После внесения изменений обязательно очистите кэш сайта (если используете кеширующие плагины или серверный кэш) и браузера. Проверьте, что варианты с нулевым запасом исчезли с витрины и недоступны для выбора.
Проверка результата после внедрения
- Зайдите в карточку вариативного товара на фронтенде.
- Убедитесь, что варианты с запасом 0 не отображаются в селекторе вариаций.
- Попробуйте изменить запас вариации на положительное число — вариант должен появиться снова.
- В админке в разделе "Товары > Все товары > Вариации" проверьте статус варианта (должен быть "Черновик" для отсутствующих на складе и "Опубликован" для доступных).
Частые ошибки и как их исправить
- Вариант отображается, хотя запас 0: Проверьте, что для варианта отключена опция Разрешить покупку при отсутствии запаса в настройках вариации.
- Изменения не применяются: Очистите кэш сайта и браузера. Проверьте работу без плагинов кеширования.
- Код не работает: Убедитесь, что используете правильные хуки и что код добавлен в правильный файл (functions.php дочерней темы или кастомный плагин).
- Варианты не переключаются обратно в "Опубликованные": Проверьте логику кода, может быть, не происходит вызов сохранения или проверка запаса.
Практические советы по безопасности и производительности
- Не меняйте статус вариаций слишком часто — это может создавать нагрузку на базу данных. Используйте WP-Cron для периодической проверки, если запасы изменяются массово.
- Перед изменением статусов делайте резервные копии базы данных, чтобы избежать потери данных.
- Если у вас большой магазин, рассмотрите вариант обработки изменений через пакетные задачи, а не сразу в хуках обновления запаса.
Сравнение подходов: плагин vs кастомный код
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Стандартные настройки WooCommerce | Простота, поддержка обновлений | Не всегда отключает варианты автоматически | Включить управление запасом в настройках |
| Плагины для управления запасом | Готовые функции, UI | Зависимость от стороннего кода, возможные конфликты | WooCommerce Stock Manager и др. |
| Кастомный код (хук + status) | Контроль, гибкость, без лишних плагинов | Требует навыков разработки, возможны ошибки | Пример выше в статье |