Диагностика проблемы: почему товары остаются активными при отсутствии на складе
В WooCommerce по умолчанию товары с нулевым остатком отображаются в магазине, если не включена настройка Скрывать отсутствующие товары. Это приводит к тому, что покупатели могут видеть и пытаться купить товары, которых нет в наличии, что ухудшает опыт пользователя и ведёт к увеличению отмен заказов.
Проверьте следующие моменты в админ-панели WooCommerce:
- В разделе WooCommerce > Настройки > Товары > Запасы должна быть активирована опция
Включить управление запасами. - Должна быть включена опция
Скрывать отсутствующие товары из каталога, чтобы товары автоматически убирались с витрины.
Как настроить автоматическое отключение товаров при отсутствии на складе
Шаг 1. Включите управление запасами и скрытие отсутствующих товаров
Перейдите в WooCommerce > Настройки > Товары > Запасы и установите галочки:
Включить управление запасамиОтключать товар при отсутствии на складе- активируйте, чтобы товар автоматически менял статус на «Черновик» или «В архиве» при достижении остатка 0Скрывать отсутствующие товары из каталога
Шаг 2. Добавьте кастомный код для гарантированного отключения товара
Иногда базовых настроек WooCommerce недостаточно — товары остаются видимыми. Добавьте следующий код в файл functions.php вашей темы (рекомендуется дочерняя тема) или в пользовательский плагин:
add_action('woocommerce_reduce_order_stock', 'auto_disable_product_if_out_of_stock', 10, 1);
function auto_disable_product_if_out_of_stock($order) {
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if (!$product || !$product->managing_stock()) continue;
$stock_quantity = $product->get_stock_quantity();
if ($stock_quantity !== null && $stock_quantity <= 0) {
// Меняем статус товара на черновик
$product->set_status('draft');
$product->save();
}
}
}Этот код срабатывает при уменьшении запаса после оформления заказа и переводит товар в статус draft, делая его недоступным в каталоге.
Шаг 3. Обработка вариативных товаров
Для вариативных товаров логика похожая, но нужно проходить по вариациям:
add_action('woocommerce_reduce_order_stock', 'auto_disable_variable_product_if_out_of_stock', 20, 1);
function auto_disable_variable_product_if_out_of_stock($order) {
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if (!$product) continue;
if ($product->is_type('variation')) {
$stock = $product->get_stock_quantity();
if ($stock !== null && $stock <= 0) {
$parent_id = $product->get_parent_id();
$parent = wc_get_product($parent_id);
if ($parent) {
$parent->set_status('draft');
$parent->save();
}
}
}
}
}Проверка результата: как убедиться, что товары отключаются правильно
- Создайте тестовый товар с управляющим запасом, выставьте остаток 1.
- Оформите заказ на этот товар и проверьте уменьшение запаса.
- Проверьте статус товара в админке: он должен автоматически перейти в состояние
черновик. - Убедитесь, что товар не отображается на витрине и не доступен для покупки.
Частые ошибки и как их исправить
- Ошибка: Товар не меняет статус после заказа.
Причина: Кэширование сайта или плагинов кеширования мешает обновлению.
Решение: Очистите кеш и отключите плагины кеширования для проверки. - Ошибка: Вариативные товары остаются видимыми даже если все вариации отсутствуют.
Причина: Статус меняется только у вариаций, а не у родительского товара.
Решение: Используйте дополнительный код для переключения статуса родительского товара. - Ошибка: Ошибка PHP при добавлении кода.
Причина: Синтаксические ошибки или несовместимость с версией PHP.
Решение: Проверьте код через отладчик и используйте последние версии WordPress и WooCommerce.
Практические советы по безопасности и производительности
- Не размещайте кастомный код напрямую в
functions.phpродительской темы — используйте дочернюю тему или кастомный плагин. - Код срабатывает на событии
woocommerce_reduce_order_stock, что минимизирует нагрузку — не используйте тяжелые запросы в циклах. - Регулярно обновляйте WooCommerce и WordPress для безопасности и совместимости.
- Используйте Clearfy Pro для оптимизации базы данных и удаления лишних ревизий, чтобы база не раздувалась от большого количества заказов и товаров.
Сравнение вариантов автоматического отключения товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| Встроенные настройки WooCommerce | Простая настройка без кода | Не всегда срабатывает корректно для вариативных товаров |
Кастомный код на хуке woocommerce_reduce_order_stock | Гибкость, точное управление статусом товаров | Требуется базовые навыки PHP, можно ошибиться в коде |
| Плагины сторонних разработчиков | Готовое решение с поддержкой | Может увеличить нагрузку, требует обновлений |