Диагностика проблемы с отменёнными заказами в WooCommerce
В WooCommerce часто возникает ситуация, когда пользователь отменяет заказ, но продукты остаются в корзине. Это приводит к путанице и неудобствам для покупателей, а также может влиять на точность учёта товаров в сессии. Автоматическое очищение корзины при отмене заказа решает эту проблему.
Как автоматически удалять товары из корзины при отмене заказа
WooCommerce не предоставляет встроенный механизм для очистки корзины при изменении статуса заказа на «отменён». Поэтому нужно добавить кастомный хук, который будет отслеживать изменение статуса и очищать корзину текущего пользователя.
Пошаговое решение
- Откройте файл
functions.phpвашей дочерней темы или создайте плагин для пользовательских функций. - Добавьте следующий код, который отслеживает изменение статуса заказа и очищает корзину пользователя, если заказ отменён.
add_action('woocommerce_order_status_cancelled', 'clear_cart_on_order_cancelled', 10, 1);
function clear_cart_on_order_cancelled($order_id) {
if (!is_user_logged_in()) {
return; // Очистка корзины актуальна только для авторизованных пользователей
}
$order = wc_get_order($order_id);
$user_id = get_current_user_id();
$cart = WC()->cart;
if (!$cart) {
// Инициализируем корзину, если она не загружена
$cart = WC()->cart = new WC_Cart();
}
// Проверяем, что заказ принадлежит текущему пользователю
if ($order && $order->get_user_id() === $user_id) {
$cart->empty_cart();
}
}Этот код работает только для авторизованных пользователей, так как корзина по умолчанию привязана к сессии, а не к гостю. Для гостьевых заказов нужна отдельная логика с JavaScript и cookie, что выходит за рамки текущей задачи.
Как проверить, что решение сработало
- Авторизуйтесь на сайте как пользователь.
- Добавьте товары в корзину.
- Создайте заказ и отмените его через админку WooCommerce.
- Перейдите в корзину — она должна быть пустой.
Частые ошибки при реализации и как их исправить
- Корзина не очищается для гостей: это нормальное поведение, корзина у гостей хранится в сессии браузера. Для поддержки гостей нужна дополнительная обработка на стороне фронтенда.
- Код не срабатывает при отмене заказа админом: убедитесь, что используете правильный хук
woocommerce_order_status_cancelled, а неwoocommerce_order_status_changedбез проверки нового статуса. - Вызов
WC()->cartвозвращает null: если код вызывается вне контекста фронтенда (например, в AJAX или CLI), корзина может не инициализироваться. В таком случае очистка невозможна.
Практические советы по производительности и безопасности
- Не используйте очистку корзины без проверки пользователя — это может привести к удалению товаров у других пользователей.
- Минимизируйте логику в хуках, чтобы не замедлять обработку статуса заказа.
- Для гостевых корзин можно рассмотреть реализацию уведомлений и очистки с помощью JavaScript с сохранением статуса заказа в cookie.
Альтернативные варианты решения
| Метод | Плюсы | Минусы |
|---|---|---|
Код на PHP в хуке woocommerce_order_status_cancelled | Простой, работает для авторизованных пользователей | Не работает для гостей, требует авторизации |
| JavaScript очистка корзины на фронтенде | Поддерживает гостей | Сложнее в реализации, может быть ненадёжным |
| Использование сторонних плагинов | Минимум кода, готовые решения | Может создать нагрузку, не всегда бесплатно |