Диагностика проблемы с товарами в корзине после ошибок оформления заказа
В WooCommerce иногда возникает ситуация, когда пользователь пытается оформить заказ, но из-за ошибок (например, неверные данные, проблемы с платежной системой) товары остаются в корзине и не удаляются автоматически. Это приводит к путанице и неудобству для клиента, а также к увеличению нагрузки на систему при повторных попытках оформления.
Проверить эту проблему можно, оформив тестовый заказ с ошибочными данными (например, неверный адрес или отключенный способ оплаты). Если после возврата на страницу корзины товары остаются и не обновляются, значит, стандартного механизма очистки корзины нет.
Пошаговое решение: автоматическое удаление товаров из корзины при ошибках заказа
1. Использование хука 'woocommerce_checkout_order_processed' с проверкой статуса
Добавим обработчик, который будет удалять товары из корзины, если заказ не был успешно создан или находится в статусе ошибки.
add_action('woocommerce_checkout_order_processed', 'wpin_clear_cart_on_order_error', 10, 3);function wpin_clear_cart_on_order_error($order_id, $posted_data, $order){ if (!$order instanceof WC_Order) { return; } // Проверяем статус заказа $status = $order->get_status(); // Если статус 'failed' или 'cancelled', очищаем корзину if (in_array($status, array('failed', 'cancelled'))) { WC()->cart->empty_cart(); }}2. Очистка корзины после неудачной попытки оплаты через хук 'woocommerce_payment_complete'
Иногда полезно очистить корзину, если платеж не прошел, чтобы избежать повторных попыток с теми же товарами.
add_action('woocommerce_payment_complete', 'wpin_clear_cart_after_payment');function wpin_clear_cart_after_payment($order_id) { $order = wc_get_order($order_id); if (!$order) { return; } // Если статус не 'completed', очищаем корзину if ($order->get_status() !== 'completed') { WC()->cart->empty_cart(); }}Проверка результата после внедрения кода
- Создайте тестовый заказ с ошибочными данными, например, неверным адресом или отключенным способом оплаты.
- Завершите попытку оформления, чтобы заказ перешёл в статус
failedилиcancelled. - Вернитесь на страницу корзины и убедитесь, что товары из неё были удалены автоматически.
- Проверьте успешный заказ — корзина должна очищаться стандартно после оплаты.
Частые ошибки и способы их исправления
- WC()->cart возвращает null или корзина не очищается: Убедитесь, что код вызывается в контексте сессии пользователя (фронтенд). Если код выполняется в админке, корзина пользователя не доступна.
- Код не срабатывает при статусах заказов: Проверьте, что статусы заданные в условии (
failed,cancelled) соответствуют статусам вашего магазина. Статусы можно посмотреть в WooCommerce → Настройки → Статусы заказов. - Конфликты с другими плагинами: Отключите плагины, которые могут модифицировать поведение корзины или заказов, чтобы исключить конфликт.
Практические советы по безопасности и производительности
- Код добавляйте в дочернюю тему или в отдельный плагин, чтобы не потерять изменения при обновлении.
- Не вызывайте
WC()->cart->empty_cart()на страницах без сессии пользователя — это может привести к ошибкам. - При большом трафике внимательно следите за нагрузкой вызова функции очистки корзины — она должна срабатывать только при необходимости.
Чек-лист для внедрения автоматического удаления товаров из корзины при ошибках заказа
- Добавить код в файл
functions.phpдочерней темы или создать отдельный плагин. - Проверить, что WooCommerce активен и загружен перед использованием функций.
- Протестировать сценарии с успешным и неуспешным заказом.
- Убедиться, что корзина очищается корректно только при ошибках.
- Отследить возможные конфликты с другими кастомизациями или плагинами.
Таблица сравнения способов очистки корзины при ошибках в WooCommerce
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Хук woocommerce_checkout_order_processed | Реагирует сразу после оформления заказа, можно проверить статус | Не всегда срабатывает при ошибках платежей вне WooCommerce | Подходит для базовой очистки при ошибочных заказах |
Хук woocommerce_payment_complete | Обрабатывает результат оплаты, можно очистить в случае неуспеха | Не срабатывает при отмененных заказах без попытки оплаты | Использовать в связке с первым методом для максимального охвата |
| Настройка сессии пользователя + JS | Можно реализовать мгновенную очистку на фронтенде | Сложнее в реализации, зависит от клиента | Дополнительно для UX, но не замена серверной логики |