Проблема: статус товара не обновляется при отсутствии на складе
В стандартной установке WooCommerce статус наличия товара может не меняться автоматически, если на складе заканчивается товар. Это приводит к тому, что покупатели видят, что товар доступен, хотя его нет в наличии, что негативно влияет на пользовательский опыт и конверсии.
Диагностика проблемы
- Проверьте, что у товара установлен правильный уровень запасов (Stock Quantity).
- Убедитесь, что в настройках WooCommerce включено управление запасами:
WooCommerce > Настройки > Товары > Управление запасами. - Проверьте, не отключена ли опция «Разрешить заказы при отсутствии товара» (Allow backorders) для товара.
- Посмотрите, изменяется ли статус товара вручную через админку при изменении количества.
Пошаговое решение: автоматическое обновление статуса наличия
Для автоматической смены статуса при изменении количества товара используйте следующий код, который добавляется в файл functions.php вашей темы или в отдельный плагин:
add_action('woocommerce_product_set_stock', 'update_stock_status_automatically', 10, 1);function update_stock_status_automatically($product) { if (!$product->managing_stock()) { return; } $stock_quantity = $product->get_stock_quantity(); if ($stock_quantity <= 0) { $product->set_stock_status('outofstock'); } else { $product->set_stock_status('instock'); } $product->save();}Объяснение кода:
woocommerce_product_set_stock— хук вызывается при изменении количества товара.- Функция проверяет, управляется ли запасами товар.
- Если количество меньше или равно нулю, статус меняется на
outofstock. - Иначе — на
instock. - В конце вызывается метод
save()для сохранения изменений.
Обработка вариативных товаров
Для вариативных товаров можно добавить аналогичный обработчик для каждой вариации:
add_action('woocommerce_variation_set_stock', 'update_variation_stock_status', 10, 1);function update_variation_stock_status($variation) { if (!$variation->managing_stock()) { return; } $stock_quantity = $variation->get_stock_quantity(); if ($stock_quantity <= 0) { $variation->set_stock_status('outofstock'); } else { $variation->set_stock_status('instock'); } $variation->save();}Проверка результата после внедрения
- Измените количество товара в админке на 0 или меньше.
- Перейдите на страницу товара на фронтенде.
- Проверьте, что статус товара отображается как «Нет в наличии».
- Увеличьте количество, например до 5.
- Обновите страницу и убедитесь, что статус изменился обратно на «В наличии».
При необходимости очистите кеш сайта и браузера, чтобы увидеть актуальные изменения.
Частые ошибки и как их исправить
- Код не работает для вариаций: убедитесь, что добавлен обработчик для вариаций
woocommerce_variation_set_stock. - Статус не обновляется на фронтенде: проверьте, не кэшируется ли страница и не конфликтуют ли плагины кэширования.
- Разрешены заказы при отсутствии товара: в настройках товара отключите «Разрешить заказы при отсутствии товара» (Backorders).
- Код вызывает ошибки PHP: проверьте синтаксис, используйте отладчик или логи ошибок сервера.
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или собственный плагин, чтобы избежать потери при обновлениях.
- Используйте проверку
managing_stock(), чтобы код не выполнялся на товарах без управления запасами. - Минимизируйте работу с базой данных, вызывая
save()только при изменении статуса. - При большом количестве товаров и частых изменениях запасов рассмотрите интеграцию с внешней системой складского учета через REST API.
Сравнение вариантов решения
| Вариант | Плюсы | Минусы |
|---|---|---|
| Ручное изменение статуса | Простота | Человеческий фактор, ошибки, время |
| Плагин управления запасами | Автоматизация, поддержка | Зависимость от плагина, нагрузка |
| Код в functions.php (наш способ) | Легковесность, контроль, отсутствие новых плагинов | Требует навыков, возможны ошибки в коде |