Диагностика проблемы: почему товары не отключаются автоматически при нулевых остатках
В стандартной установке WooCommerce товары с нулевым остатком не всегда автоматически скрываются или отключаются для покупки. Это приводит к ситуациям, когда покупатели видят товары, которые нельзя приобрести, что снижает конверсию и вызывает недовольство пользователей.
Основные причины:
- В настройках WooCommerce не активировано управление запасами или автоматическое скрытие товаров при отсутствии остатков.
- Кастомные темы или плагины переопределяют стандартное поведение WooCommerce.
- Используются вариативные товары, для которых остаток рассчитывается некорректно.
Пошаговое решение: как автоматически отключать товары и поднимать их при пополнении запасов
1. Проверка и настройка управления запасами WooCommerce
Перейдите в WooCommerce > Настройки > Товары > Запасы и убедитесь, что включена опция Включить управление запасами.
Также активируйте опцию Скрывать товары, отсутствующие на складе, чтобы товары с нулевым запасом автоматически скрывались из каталога.
2. Добавление кода для принудительного отключения товара при нулевом запасе
Если стандартные настройки не дают нужного результата (например, из-за кастомной темы), добавьте следующий код в functions.php вашей дочерней темы или в специальный плагин:
add_action('woocommerce_product_set_stock_status', 'auto_disable_product_on_out_of_stock', 10, 1);
function auto_disable_product_on_out_of_stock($product) {
if (!$product instanceof WC_Product) return;
if ($product->get_stock_quantity() <= 0) {
$product->set_catalog_visibility('hidden');
$product->save();
} else {
// При пополнении запаса возвращаем видимость
$product->set_catalog_visibility('visible');
$product->save();
}
}Этот хук срабатывает при смене статуса запаса и меняет видимость товара в каталоге.
3. Обработка вариативных товаров
Для вариативных товаров нужно убедиться, что видимость контролируется на уровне вариаций. Используйте следующий код для синхронизации видимости основного товара с запасами вариаций:
add_action('woocommerce_variation_set_stock_status', 'sync_variable_product_visibility', 10, 2);
function sync_variable_product_visibility($variation, $stock_status) {
$parent_id = $variation->get_parent_id();
$parent_product = wc_get_product($parent_id);
$variations = $parent_product->get_children();
$in_stock = false;
foreach ($variations as $variation_id) {
$var = wc_get_product($variation_id);
if ($var->is_in_stock()) {
$in_stock = true;
break;
}
}
if ($in_stock) {
$parent_product->set_catalog_visibility('visible');
} else {
$parent_product->set_catalog_visibility('hidden');
}
$parent_product->save();
}Проверка результата после внедрения
- Создайте тестовый товар с запасом 1, проверьте, что он отображается в каталоге.
- Уменьшите запас до 0 через админку и сохраните — товар должен исчезнуть из каталога.
- Пополните запас товара — товар должен снова появиться в каталоге.
- Проверьте аналогично для вариативных товаров, изменяя запасы вариаций.
Частые ошибки и как их исправить
- Товар не скрывается при нулевом запасе: проверьте, активирована ли опция управления запасами в WooCommerce и нет ли конфликтов с темой или плагинами, которые переопределяют видимость.
- Видимость не восстанавливается при пополнении: убедитесь, что код обновляет видимость при изменении запаса, как показано в примере.
- Кэширование мешает увидеть изменения: очистите кэш сайта и браузера после изменения запасов.
- Проблемы с вариативными товарами: убедитесь, что запас считается корректно для каждой вариации и что родительский товар синхронизируется с запасами вариаций.
Практические советы по безопасности и производительности
- Добавляйте кастомный код через дочернюю тему или отдельный плагин, чтобы избежать потери изменений при обновлениях.
- Не используйте тяжелые запросы к базе — в представленном коде изменения происходят только при обновлении запасов, что минимизирует нагрузку.
- Регулярно проверяйте совместимость кастомного кода с обновлениями WooCommerce и WordPress.
- Для больших магазинов с тысячами товаров рассмотрите возможность использования специализированных плагинов кэширования и оптимизации базы данных, например Clearfy Pro (https://wpshop.ru/plugins/clearfy), чтобы избежать замедления при массовых обновлениях запасов.
Сравнение вариантов решения проблемы
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Стандартные настройки WooCommerce | Простота, без кода | Не всегда работает с кастомными темами/плагинами | Малые и средние магазины без кастомизаций |
| Кастомный код в functions.php | Гибкость, точное управление | Требует навыков PHP, возможны ошибки | Если стандарт не подходит или нужны дополнительные условия |
| Плагины для управления запасами | Дополнительный функционал, удобство | Зависимость от стороннего кода, нагрузка | Большие магазины с комплексными требованиями |