Диагностика проблемы отсутствия товара на складе
В WooCommerce стандартно товары могут оставаться доступными для покупки даже если их количество на складе равно нулю или отрицательно. Это ведёт к негативному пользовательскому опыту и дополнительной ручной обработке заказов. Чтобы убедиться, что проблема именно в настройках склада, проверьте следующие моменты:
- В настройках товара включён ли учёт остатков (Inventory management)?
- Установлен ли параметр "Разрешить заказы при отсутствии товара" (Allow backorders)?
- Отображается ли остаток товара на странице карточки товара?
Для диагностики можно использовать следующий PHP код в файле темы functions.php или в плагине, чтобы вывести статус наличия:
add_action('woocommerce_single_product_summary', function() {
global $product;
if (!$product->is_in_stock()) {
echo '<p style="color:red;">Товар отсутствует на складе</p>';
} else {
echo '<p style="color:green;">Товар в наличии: ' . $product->get_stock_quantity() . '</p>';
}
}, 20);Пошаговое решение: отключаем оформление заказа при отсутствии товара
1. Включаем управление запасами
В админке WooCommerce перейдите в WooCommerce → Настройки → Товары → Управление запасами и убедитесь, что опция Включить управление запасами активирована.
2. Отключаем предзаказы (Backorders)
Для каждого товара в карточке товара на вкладке Запасы установите Разрешить заказы при отсутствии товара в значение Нет. Это гарантирует, что при нулевом или отрицательном остатке покупка невозможна.
3. Автоматическое скрытие кнопки "Добавить в корзину" при отсутствии товара
Чтобы улучшить UX, скройте кнопку добавления в корзину для отсутствующих товаров. Добавьте в functions.php следующий код:
add_filter('woocommerce_is_purchasable', function($purchasable, $product) {
if (!$product->is_in_stock()) {
return false;
}
return $purchasable;
}, 10, 2);4. Отключение оформления заказа на уровне корзины
Если в корзине есть хотя бы один отсутствующий товар, отключим кнопку оформления заказа и покажем уведомление:
add_action('woocommerce_check_cart_items', function() {
foreach (WC()->cart->get_cart() as $cart_item) {
if (!$cart_item['data']->is_in_stock()) {
wc_add_notice('В корзине есть товары, отсутствующие на складе. Пожалуйста, удалите их для оформления заказа.', 'error');
break;
}
}
});Проверка результата после внедрения
- Перейдите на страницу товара с нулевым запасом. Кнопка "Добавить в корзину" должна отсутствовать.
- Попробуйте добавить отсутствующий товар в корзину — это должно быть невозможно.
- Добавьте в корзину товар в наличии, затем вручную добавьте отсутствующий товар в корзину (например, через REST API) и перейдите в корзину — должна появиться ошибка и кнопка оформления заказа должна быть заблокирована.
Частые ошибки и как их исправить
- Ошибка: Кнопка "Добавить в корзину" продолжает отображаться на страницах отсутствующих товаров.
Причина: Не отключен backorders, либо код не добавлен в functions.php, либо используется кэширование.
Решение: Проверьте настройки backorders, очистите кэш сайта и браузера, убедитесь, что код работает (временно добавьте echo в функцию). - Ошибка: Ошибка в корзине при проверке отсутствия товара не появляется.
Причина: Хукwoocommerce_check_cart_itemsне срабатывает или конфликт с плагинами.
Решение: Отключите другие плагины и протестируйте повторно, проверьте, что корзина содержит отсутствующий товар.
Практические советы по безопасности и производительности
- Добавленное решение работает на уровне PHP и не требует дополнительных запросов к базе, что минимизирует нагрузку.
- Не используйте сторонние плагины для этой задачи без необходимости — они могут добавить лишний код и замедлить сайт.
- Если используете кэширование страниц, исключите страницы товара и корзины из кэша, чтобы изменения статуса товара отображались корректно.
Сравнение методов отключения оформления заказа по наличию товара
| Метод | Плюсы | Минусы |
|---|---|---|
| Настройка Backorders в админке | Простота, нативное решение | Требует ручной настройки для каждого товара |
| Код в functions.php для скрытия кнопки | Автоматизация, единоразовый код | Не отключает оформление заказа на уровне корзины |
| Проверка корзины и блокировка оформления заказа | Максимальная защита от ошибок | Сложнее в реализации, требует тестирования |