Диагностика проблемы: почему товары остаются активными при нулевом остатке
В стандартной установке WooCommerce товар с нулевым остатком не всегда автоматически меняет статус или становится недоступным для покупки. Это может привести к негативному опыту пользователей, когда они видят товар в каталоге, но не могут его приобрести.
Проверить ситуацию можно, открыв карточку товара в админке и убедившись, что опция "Включить управление запасами" активирована, а количество равно нулю. Также стоит проверить, не заблокирован ли параметр "Разрешить покупку при отсутствии товара".
Пошаговое решение: как автоматически выключать товары с нулевым остатком
Настройка управления запасами WooCommerce
- В админке WordPress перейдите в WooCommerce → Настройки → Товары → Запасы.
- Убедитесь, что включена галочка "Включить управление запасами".
- Отключите опцию "Разрешить покупку при отсутствии товара", чтобы ограничить продажу товаров с нулевым остатком.
Добавление кастомного кода для автоматического отключения товаров
Для удобства можно добавить код, который будет менять статус товара на "черновик" при достижении нулевого остатка и обратно активировать, если товар снова появился в наличии.
add_action('woocommerce_reduce_stock', 'auto_disable_out_of_stock_products', 10, 1);
add_action('woocommerce_restore_order_stock', 'auto_enable_in_stock_products', 10, 1);
function auto_disable_out_of_stock_products($order) {
foreach ($order->get_items() as $item) {
$product = wc_get_product($item->get_product_id());
if ($product->managing_stock() && $product->get_stock_quantity() <= 0) {
$product->set_status('draft');
$product->save();
}
}
}
function auto_enable_in_stock_products($order) {
foreach ($order->get_items() as $item) {
$product = wc_get_product($item->get_product_id());
if ($product->managing_stock() && $product->get_stock_quantity() > 0 && $product->get_status() === 'draft') {
$product->set_status('publish');
$product->save();
}
}
}Этот код отслеживает изменение запасов при оформлении или отмене заказа и меняет статус товара.
Очистка и кэширование
Если вы используете плагины кеширования, после изменения статуса товара рекомендуется очистить кеш, чтобы изменения отобразились на сайте.
Проверка результата после внедрения
- Создайте тестовый товар с управлением запасами, установите количество 1.
- Оформите заказ на этот товар, что уменьшит его количество до 0.
- Проверьте, что статус товара изменился на черновик и товар исчез из каталога.
- Отмените или удалите заказ, чтобы восстановить запас, и убедитесь, что товар снова стал опубликован.
Частые ошибки и как их исправить
- Не включено управление запасами — код не сработает, если в настройках WooCommerce не активирована опция управления запасами.
- Плагин кеширования не очищен — изменения не видны из-за кеша, всегда очищайте кеш после обновления статусов.
- Товары с вариациями — код работает с простыми товарами, для вариативных потребуется адаптация, проверяйте остатки каждой вариации отдельно.
- Права доступа — убедитесь, что пользователь, который изменяет товар, имеет права на редактирование товаров.
Практические советы по производительности и безопасности
- Не используйте частый вызов функции изменения статуса вне событий изменения запасов, чтобы избежать лишней нагрузки на базу данных.
- Храните кастомный код в дочерней теме или в отдельном плагине, чтобы сохранить изменения при обновлении WooCommerce.
- Регулярно делайте бэкапы перед внесением изменений в функционал магазина.
- Для сложных сценариев с вариациями и сторонними плагинами управления складом тестируйте на копии сайта.
Сравнение способов реализации автоматического отключения товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| Настройки WooCommerce (запрет покупки при 0) | Просто настроить, работает из коробки | Товар остается видимым, только покупка запрещена |
| Кастомный код смены статуса (как в статье) | Автоматически скрывает товар, улучшает UX | Требуется тестирование, может не работать с вариациями |
| Плагины управления запасами | Расширенный функционал, поддержка вариаций | Могут быть платными, влияют на производительность |