Диагностика проблемы: почему товары с нулевым запасом остаются в корзине
В стандартной установке WooCommerce товары с нулевым запасом могут оставаться в корзине, если пользователь добавил их до того, как запас закончился. Это приводит к ошибкам при оформлении заказа, путанице и ухудшению UX. Особенно критично для магазинов с динамическим учетом остатков или большим ассортиментом.
Основные симптомы:
- Товары с нулевым запасом отображаются в корзине и оформлении заказа.
- При попытке оформить заказ появляется ошибка об отсутствии товара на складе.
- Пользователь не получает уведомлений об удалении или замене товара.
Пошаговое решение: автоматическое удаление товаров с нулевым запасом из корзины
Реализуем проверку содержимого корзины при каждом ее обновлении или загрузке страницы, чтобы удалить товары с запасом 0. Для этого используем хук woocommerce_check_cart_items, который срабатывает до отображения корзины и оформления заказа.
add_action('woocommerce_check_cart_items', 'wpreg_remove_out_of_stock_items_from_cart');
function wpreg_remove_out_of_stock_items_from_cart() {
$cart = WC()->cart->get_cart();
$removed_items = 0;
foreach ($cart as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
if (!$product->is_in_stock()) {
WC()->cart->remove_cart_item($cart_item_key);
$removed_items++;
}
}
if ($removed_items > 0) {
wc_add_notice(sprintf('Из корзины автоматически удалено %d товаров, отсутствующих на складе.', $removed_items), 'notice');
}
}Этот код удалит все товары, которые не в наличии, при загрузке страниц корзины и оформления заказа, а также при любых обновлениях корзины.
Как добавить код в тему или плагин
Рекомендуется вставить данный код в functions.php дочерней темы или создать небольшой плагин, чтобы не потерять изменения при обновлении.
Проверка результата после внедрения
- Добавьте товар с запасом 1 в корзину.
- Уменьшите запас товара до 0 в админке WooCommerce.
- Перейдите в корзину – товар должен автоматически удалиться, и появится уведомление об удалении.
- Попробуйте оформить заказ – товар с нулевым запасом не должен присутствовать.
Для дополнительной проверки проверьте логи WooCommerce и убедитесь, что ошибок при оформлении заказа из-за отсутствия товара нет.
Частые ошибки и их исправление
- Товары не удаляются из корзины: убедитесь, что в WooCommerce активирован учет запасов (
WooCommerce > Настройки > Товары > Управление запасами). - Удаление происходит, но уведомление не отображается: проверьте, что тема поддерживает вывод уведомлений
wc_print_notices()в шаблонах корзины и оформления заказа. - Конфликты с другими плагинами, которые управляют корзиной: временно отключите такие плагины для теста и проверьте совместимость.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы к базе данных внутри цикла корзины — функция
is_in_stock()уже оптимизирована. - Для магазинов с большим ассортиментом и большим трафиком рассмотрите использование кеширования объектов товара, чтобы снизить нагрузку.
- Если требуется более тонкая фильтрация (например, исключать товары с определёнными атрибутами и нулевым запасом), расширяйте функцию условными операторами.
Альтернативные варианты реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php | Добавление кастомного кода в тему | Быстро, гибко | Зависимость от темы, при смене темы код потеряется |
| Создание мини-плагина | Выделенный плагин для контроля корзины | Независимость от темы, легко переносить | Требует базовых знаний плагиновой разработки |
| Плагины сторонних разработчиков | Готовые решения для управления запасами в корзине | Простота установки | Может нагружать сайт, не всегда соответствует требованиям |