Проблема: как автоматически отключать товары WooCommerce при отсутствии на складе
В интернет-магазинах на WooCommerce часто возникает задача автоматически скрывать или отключать товары, которых нет в наличии. Это необходимо для улучшения пользовательского опыта и избежания заказов товаров, которые нельзя поставить. Многие владельцы магазинов используют сторонние плагины, но это увеличивает нагрузку на сайт и может привести к конфликтам. В этой статье покажу, как реализовать автоматическое отключение товаров при отсутствии на складе средствами кода без плагинов.
Диагностика проблемы: почему товары не отключаются автоматически
По умолчанию WooCommerce не отключает товар, если его количество на складе равно нулю, особенно если в настройках управления запасами включена опция «Разрешить заказы при отсутствии товара». Даже если отключить заказы, товар остается доступным на сайте, что может вводить покупателя в заблуждение.
Для диагностики:
- Перейдите в WooCommerce → Настройки → Товары → Запасы и проверьте, включено ли управление запасами и отключены ли заказы при отсутствии товара.
- Проверьте, правильно ли ведется учет запасов у товаров и их вариаций.
- Убедитесь, что у товаров нет статуса «В наличии», если количество равно 0.
Пошаговое решение: код для автоматического отключения товаров при отсутствии на складе
Решение состоит в добавлении кода, который при обновлении количества на складе будет менять статус товара на «черновик» (или другой скрытый статус), если товар отсутствует на складе. Аналогично можно сделать и для вариаций.
1. Функция для отключения простых товаров
add_action('woocommerce_product_set_stock', 'auto_disable_product_if_out_of_stock', 10, 1);function auto_disable_product_if_out_of_stock($product) { if (!$product instanceof WC_Product) { $product = wc_get_product($product); } if (!$product) { return; } $stock_quantity = $product->get_stock_quantity(); $manage_stock = $product->get_manage_stock(); if ($manage_stock && $stock_quantity !== null && $stock_quantity <= 0) { // Меняем статус на черновик $product->set_status('draft'); $product->save(); } else { // Восстанавливаем статус публикации, если есть товар на складе if ($product->get_status() === 'draft') { $product->set_status('publish'); $product->save(); } }}2. Аналогичная функция для вариаций товаров
add_action('woocommerce_variation_set_stock', 'auto_disable_variation_if_out_of_stock', 10, 1);function auto_disable_variation_if_out_of_stock($variation) { if (!$variation instanceof WC_Product_Variation) { $variation = wc_get_product($variation); } if (!$variation) { return; } $stock_quantity = $variation->get_stock_quantity(); $manage_stock = $variation->get_manage_stock(); if ($manage_stock && $stock_quantity !== null && $stock_quantity <= 0) { $variation->set_status('draft'); $variation->save(); } else { if ($variation->get_status() === 'draft') { $variation->set_status('publish'); $variation->save(); } }}Этот код добавляется в файл functions.php активной темы или в кастомный плагин.
Проверка результата после внедрения
- Обновите количество товара или вариации на складе через админку WooCommerce, установив 0 или меньше.
- Проверьте, что статус товара (или вариации) изменился на «черновик» (Draft). Его не будет видно на фронтенде.
- Увеличьте количество на складе, обновите — статус должен автоматически вернуться в «опубликован» (Publish), и товар снова станет видимым.
- Обновите страницу с каталогом и убедитесь, что отсутствующие товары не отображаются.
Частые ошибки и как их исправить
- Код не срабатывает при обновлении запаса: Проверьте, действительно ли вы обновляете количество через интерфейс WooCommerce, а не через прямые SQL-запросы. Хуки
woocommerce_product_set_stockиwoocommerce_variation_set_stockсрабатывают только при обновлении через WC API. - Статус товара не меняется: Убедитесь, что у вашего пользователя есть права на редактирование товара. Добавьте отладочный вывод через
error_logвнутри функций, чтобы проверить вызов. - Вариации не отключаются: Проверьте, что вы используете правильный хук для вариаций
woocommerce_variation_set_stock. - Невозможно увидеть изменения на сайте: Очистите кэш сайта и браузера, особенно если используете плагины кеширования.
Практические советы по безопасности и производительности
- Добавляйте кэширование результатов и минимизируйте вызов сохранения статуса, чтобы избежать лишних запросов к базе данных.
- Не используйте массовое обновление товаров без тестирования кода — это может привести к изменению статусов не тех товаров.
- Обязательно делайте резервные копии базы данных перед внесением изменений с автоматизацией статусов.
- Мониторьте логи ошибок сервера на наличие проблем с сохранением продуктов.
Сравнение вариантов реализации автоматического отключения товаров
| Вариант | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин управления запасами | Простая установка, готовые функции | Нагрузка на сайт, возможные конфликты | Использовать только проверенные плагины |
| Кастомный код (описанный выше) | Легкий, гибкий, без сторонних зависимостей | Требует навыков разработки и тестирования | Оптимально для опытных разработчиков |
| Ручное скрытие товаров | Максимальный контроль | Трудозатратно, возможны ошибки | Подходит для небольших магазинов |