Диагностика проблемы с отсутствием товаров на складе в корзине WooCommerce
В WooCommerce иногда возникает ситуация, когда товар, отсутствующий на складе, остается в корзине пользователя. Это приводит к проблемам на этапе оформления заказа, повышенному уровню отказов и негативному пользовательскому опыту. Основные причины:
- Отсутствие проверки наличия товара при загрузке корзины.
- Некорректная настройка управления запасами.
- Кэширование корзины без обновления данных о наличии.
Первый шаг – проверить, не отображаются ли в корзине товары с нулевым запасом. Для этого откройте страницу корзины и визуально проверьте наличие таких позиций. Чтобы получить список товаров с нулевым или отрицательным запасом в корзине, можно использовать следующий код для отладки (например, добавить в functions.php или в плагин):
add_action('woocommerce_before_cart', function() {
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
if (!$product->is_in_stock()) {
error_log('Товар в корзине отсутствует на складе: ' . $product->get_name());
}
}
});Пошаговое решение: удаление товаров из корзины при отсутствии на складе
Реализуем автоматическую очистку корзины от недоступных товаров с помощью хука woocommerce_check_cart_items. Этот хук вызывается перед отображением страницы корзины и оформления заказа, что позволяет гибко управлять содержимым корзины.
add_action('woocommerce_check_cart_items', function() {
$cart = WC()->cart;
$removed_products = [];
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
if (!$product->is_in_stock()) {
$removed_products[] = $product->get_name();
$cart->remove_cart_item($cart_item_key);
}
}
if (!empty($removed_products)) {
wc_add_notice('Следующие товары были удалены из корзины, так как отсутствуют на складе: ' . implode(', ', $removed_products), 'error');
}
});Разъяснение кода:
- Цикл перебирает все товары в корзине.
- Метод
is_in_stock()проверяет наличие товара. - Если товар отсутствует, он удаляется из корзины через
remove_cart_item(). - Пользователь получает уведомление об удалении.
Проверка результата после внедрения
Чтобы убедиться, что код работает корректно:
- Добавьте в корзину товар с нулевым запасом (например, вручную выставив значение запаса в 0 в админке WooCommerce).
- Перейдите на страницу корзины.
- Проверьте, что товар автоматически удаляется, а уведомление выводится.
- В случае использования кэша (например, плагина кеширования) очистите его, чтобы изменения вступили в силу.
Частые ошибки и как их исправить
- Товар не удаляется из корзины: Убедитесь, что код добавлен в активную тему или плагин, и что корзина инициализирована (WC()->cart не null).
- Ошибка «Call to a member function is_in_stock() on null»: Проверьте, что
$cart_item['data']— это объектWC_Product. Иногда корзина содержит невалидные данные или кастомные товары. - Уведомления не отображаются: Проверьте, что тема выводит сообщения WooCommerce с помощью
wc_print_notices()или аналогичных функций.
Практические советы по безопасности и производительности
- Не используйте удаление товаров из корзины на стороне клиента (JavaScript) — это легко обходится и не гарантирует актуальность данных.
- Добавляйте проверку наличия товара на серверной стороне при каждом обновлении корзины и оформлении заказа.
- Если ваш магазин имеет большой трафик, избегайте тяжелых операций в хуках, чтобы не замедлять загрузку страниц.
- Используйте плагины кеширования с учётом динамического контента корзины, чтобы не кэшировать её полностью.
Сравнение решений: код vs плагины для удаления отсутствующих товаров из корзины
| Решение | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код (как в статье) | Полный контроль, бесплатно, гибко | Требует навыков PHP, поддержка и доработка на владельце сайта | Для разработчиков и кастомных проектов |
| Плагины (например, WooCommerce Stock Manager или специализированные) | Простота установки, готовый функционал, поддержка | Может влиять на производительность, ограничена кастомизация | Для владельцев без навыков программирования |