Диагностика проблемы: почему товары автоматически удаляются из корзины после отмены оплаты
По умолчанию WooCommerce очищает корзину пользователя после отмены или неудачной оплаты заказа. Это происходит из-за встроенного механизма, который считает, что пользователь завершил процесс покупки или отказался от него. В результате товары в корзине исчезают, и пользователь вынужден добавлять их заново, что негативно сказывается на пользовательском опыте и конверсии.
Как проверить, что проблема связана с очисткой корзины
- Добавьте товар в корзину в режиме гостя или авторизованного пользователя.
- Перейдите к оформлению заказа и инициируйте оплату, но отмените или не завершайте её.
- Вернитесь на сайт и проверьте содержимое корзины — если корзина пуста, значит сработала автоматическая очистка.
Пошаговое решение: отключение автоматического удаления товаров из корзины
Для изменения стандартного поведения WooCommerce понадобится переопределить событие, которое очищает корзину при отмене оплаты. Сделать это можно через добавление кода в файл functions.php вашей дочерней темы или в собственный плагин.
1. Отключаем очистку корзины после отмены оплаты
WooCommerce вызывает метод empty_cart() в событии woocommerce_order_status_cancelled или woocommerce_order_status_failed. Нужно убрать этот хук.
remove_action('woocommerce_order_status_cancelled', array(WC()->cart, 'empty_cart'));
remove_action('woocommerce_order_status_failed', array(WC()->cart, 'empty_cart'));Однако напрямую так не сработает, потому что эти хуки привязаны к объекту WC_Cart в момент инициализации. Поэтому лучше использовать фильтр для контроля.
2. Используем пользовательский фильтр для контроля очистки корзины
Добавьте следующий код, который перехватывает очистку корзины и блокирует её после отмены оплаты:
add_action('woocommerce_order_status_cancelled', 'disable_cart_clear_on_cancelled', 20);
add_action('woocommerce_order_status_failed', 'disable_cart_clear_on_failed', 20);
function disable_cart_clear_on_cancelled($order_id) {
// Оставляем корзину без изменений
}
function disable_cart_clear_on_failed($order_id) {
// Оставляем корзину без изменений
}Вместо вызова WC()->cart->empty_cart() в стандартном обработчике, эти функции ничего не делают, предотвращая очистку.
3. Более надежный способ — переопределить функцию очистки корзины при смене статуса заказа
Добавьте фильтр, который предотвращает очистку корзины после неудачной оплаты:
add_filter('woocommerce_empty_cart_after_payment_failure', '__return_false');Этот фильтр отключает очистку корзины именно после неудачной оплаты.
Проверка результата после внедрения решения
- Добавьте товар в корзину и перейдите к оплате.
- Инициируйте оплату и отмените её или дождитесь отказа.
- Вернитесь на сайт и убедитесь, что товары в корзине остались сохранены.
- Также проверьте, что успешная оплата по-прежнему очищает корзину.
Частые ошибки и как их исправить
- Код не работает и корзина всё равно очищается: возможно, код добавлен в неподходящее место, либо тема/плагин переопределяют поведение. Проверьте, что код выполняется после инициализации WooCommerce, например, через хук
init. - Корзина не очищается после успешной оплаты: фильтр
woocommerce_empty_cart_after_payment_failureне должен влиять на успешные платежи. Проверьте, что код не отключает очистку корзины для статусаcompleted. - Кэширование мешает проверке: если на сайте используется кэширование страниц или объектный кеш, очистите кэш, чтобы увидеть изменения.
Практические советы по безопасности и производительности
- Избегайте редактирования файлов ядра WooCommerce — используйте дочернюю тему или плагин для добавления кода.
- Проверяйте работу кода на тестовом сайте перед запуском в продакшен.
- Контролируйте размер корзины — если товары остаются в корзине долго, это может увеличить нагрузку на сессию пользователя.
- Если используете сторонние плагины оплаты, убедитесь, что они совместимы с изменённым поведением корзины.
Сравнение вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление хука очистки корзины | Простота реализации | Может не сработать из-за особенностей инициализации WC_Cart |
Фильтр woocommerce_empty_cart_after_payment_failure | Надёжно блокирует очистку после неудачной оплаты | Не влияет на другие статусы заказа |
| Переопределение обработчиков статусов заказа | Гибкость в настройке | Требует понимания внутренней логики WooCommerce |