Диагностика проблемы: почему товары остаются в корзине при отсутствии на складе
В стандартной комплектации WooCommerce не удаляет автоматически товары из корзины, если их количество на складе равно нулю или товар снят с продажи. Это может привести к конфликтам при оформлении заказа и неудобствам для клиентов, которые видят в корзине недоступный товар.
Основные признаки проблемы:
- Клиенты могут добавить товар, который отсутствует на складе;
- При переходе к оформлению заказа появляется ошибка «нет в наличии», но товар остаётся в корзине;
- Отсутствует автоматическая синхронизация статуса товара и содержимого корзины.
Пошаговое решение: как автоматически удалять отсутствующие товары из корзины
1. Добавление кода для проверки наличия товара при загрузке корзины
Используем хук woocommerce_check_cart_items, который срабатывает при проверке корзины. В функции будем проходить по товарам корзины и удалять те, которых нет на складе.
add_action('woocommerce_check_cart_items', 'wpin_remove_out_of_stock_from_cart');
function wpin_remove_out_of_stock_from_cart() {
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
if (!$product->is_in_stock()) {
WC()->cart->remove_cart_item($cart_item_key);
wc_add_notice(sprintf('Товар «%s» был удалён из корзины, так как отсутствует на складе.', $product->get_name()), 'notice');
}
}
}
2. Обработка AJAX-обновления корзины
Чтобы функция срабатывала и при AJAX-обновлении корзины (например, изменение количества), добавим аналогичный вызов:
add_action('woocommerce_before_calculate_totals', 'wpin_remove_out_of_stock_from_cart');
3. Кэш и кеширующие плагины
Убедитесь, что корзина не кешируется сервером или плагинами кеширования, иначе изменения не будут видны сразу.
Проверка результата после внедрения
- Добавьте в корзину товар, который в наличии — он останется.
- Добавьте товар с нулевым остатком или отключенный на складе — он автоматически удалится, и появится уведомление.
- Обновите корзину (изменение количества, переход на страницу оформления) — проверьте, что отсутствующие товары не возвращаются.
- Проверьте логи WooCommerce и консоль браузера на отсутствие ошибок.
Частые ошибки и как их исправить
- Отсутствие уведомлений клиенту: если вы не видите сообщения об удалении, проверьте, не отключены ли уведомления WooCommerce или тема их не выводит.
- Товары не удаляются при AJAX-обновлении: проверьте, что хук
woocommerce_before_calculate_totalsподключён и функция не вызывает ошибок. - Кеширование корзины: кеширующие плагины (например, WP Super Cache, W3 Total Cache) могут препятствовать обновлению корзины. Настройте исключения для страниц корзины и оформления заказа.
- Проблемы с вариативными товарами: убедитесь, что проверка
is_in_stock()работает корректно для вариаций, иногда нужно дополнительно проверять наличие атрибутов.
Практические советы по безопасности и производительности
- Добавляйте код только в дочернюю тему или в кастомный плагин, чтобы не потерять изменения при обновлении.
- Минимизируйте количество операций в цикле по корзине, чтобы не замедлять загрузку страниц.
- Регулярно тестируйте корзину после обновления WooCommerce — API и поведение функций может меняться.
- Для сайтов с большим трафиком рассмотрите кэширование на уровне объектов, но исключайте корзину из общего кеша.
Сравнение способов решения задачи
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код в functions.php / плагине | Полный контроль, без сторонних зависимостей | Требует навыков, риск ошибок при обновлениях | Для разработчиков, кастомных решений |
| Плагины для управления запасами | Простая настройка, готовые функции | Могут грузить сайт, не всегда гибкие | Для пользователей без навыков программирования |
| Комбинация кода и плагинов | Баланс контроля и удобства | Может усложнить поддержку | Для средних проектов с частыми изменениями |