Диагностика проблемы с товарами в корзине после отмены оплаты
В WooCommerce часто возникает ситуация, когда пользователь начинает оформление заказа, добавляет товар в корзину, но отменяет оплату (например, закрывает платежную страницу или платеж проваливается). В таких случаях товар остаётся в корзине и блокирует возможность повторного оформления, особенно если товар ограничен по количеству или является уникальным. Это ухудшает пользовательский опыт и может вести к потере продаж.
Проверить наличие проблемы просто: откройте сайт, добавьте в корзину товар, перейдите к оплате, а затем отмените её (например, закройте вкладку). После возврата на сайт проверьте, остался ли товар в корзине. Если да — проблема налицо.
Как автоматически удалять товар из корзины после отмены оплаты в WooCommerce
Основной подход
WooCommerce не предоставляет встроенного события для "отмены оплаты", но можно отслеживать отменённые или проваленные заказы и очищать корзину соответствующего пользователя.
Реализуем это через хук woocommerce_order_status_cancelled и woocommerce_order_status_failed. При переходе заказа в эти статусы мы удалим товары из корзины пользователя, если он залогинен.
Пример кода для functions.php темы или кастомного плагина
add_action('woocommerce_order_status_cancelled', 'clear_cart_after_order_cancelled', 10, 1);
add_action('woocommerce_order_status_failed', 'clear_cart_after_order_cancelled', 10, 1);
function clear_cart_after_order_cancelled($order_id) {
if (!is_user_logged_in()) {
return; // Очистка корзины для гостей требует иной логики
}
$user_id = get_current_user_id();
if (!$user_id) {
return;
}
// Получаем объект WC_Cart для текущего пользователя
// В стандартном WooCommerce нет прямого способа очистить корзину другого пользователя,
// поэтому очищаем корзину текущего пользователя, если это он
if (get_current_user_id() === $user_id) {
WC()->cart->empty_cart();
}
}
Этот код сработает, если пользователь остаётся залогинен и находится на сайте после отмены оплаты. Для гостей требуется более сложный подход с использованием сессионных данных или JavaScript.
Решение для гостей (неавторизованных пользователей)
Для неавторизованных пользователей очистку корзины можно сделать через frontend, проверяя статус заказа через AJAX или cookie. Например, можно добавить параметр в URL после неудачной оплаты и при загрузке страницы запускать JS, очищающий корзину:
<script>
document.addEventListener('DOMContentLoaded', function() {
if (window.location.search.indexOf('payment=failed') !== -1) {
fetch('/?wc-ajax=empty_cart')
.then(response => response.json())
.then(data => console.log('Cart cleared'));
}
});
</script>
Для этого нужно разрешить AJAX действие empty_cart в WooCommerce:
add_action('wp_ajax_empty_cart', 'empty_cart_ajax');
add_action('wp_ajax_nopriv_empty_cart', 'empty_cart_ajax');
function empty_cart_ajax() {
if (WC()->cart) {
WC()->cart->empty_cart();
wp_send_json_success('Cart emptied');
} else {
wp_send_json_error('Cart not available');
}
wp_die();
}
Проверка результата после внедрения
- Добавьте товар в корзину как авторизованный пользователь и выполните оплату с последующей отменой или провалом.
- Перезагрузите страницу или вернитесь на сайт — корзина должна очиститься автоматически.
- Для гостей откройте страницу с параметром
?payment=failedв URL после отмены — корзина должна очиститься через AJAX. - Проверьте в админке WooCommerce, что заказ получил статус
cancelledилиfailed.
Частые ошибки и их исправление
- Корзина не очищается для гостей: стандартный WC_Cart работает только для текущей сессии. Решение — применять JS + AJAX очистку, как в примере выше.
- Код не срабатывает, если пользователь не на сайте: очистка корзины происходит только при посещении страницы. Для полной автоматизации нужна интеграция с системами сессий и куки, либо уведомления клиента.
- WC()->cart возвращает null: убедитесь, что код выполняется на фронтенде, где инициализирован объект корзины WooCommerce.
- Очистка корзины при смене статуса заказа не работает: проверьте, что хук подключён правильно и что статус действительно меняется на
cancelledилиfailed.
Практические советы по безопасности и производительности
- Не очищайте корзину без проверки статуса заказа — это может привести к потере данных пользователя.
- Для гостей не храните чувствительные данные в URL (например, идентификаторы заказов) — используйте безопасные токены.
- Минимизируйте количество AJAX-запросов — вызывайте очистку только при необходимости.
- Добавьте логирование действий очистки корзины для отладки и мониторинга.
Сравнение способов очистки корзины после отмены оплаты
| Метод | Плюсы | Минусы | Рекомендуемый сценарий |
|---|---|---|---|
| Хуки WooCommerce (cancelled, failed) | Прямое реагирование на статус заказа, для авторизованных пользователей | Не работает для гостей, требует нахождения пользователя на сайте | Авторизованные пользователи |
| AJAX + JS очистка корзины | Работает для гостей, можно запускать по событию на фронтенде | Зависит от клиента, требует внедрения JS | Гости и неавторизованные пользователи |
| Серверные скрипты для очистки сессий | Автоматическое удаление корзины вне зависимости от клиента | Сложно реализовать, требует работы с сессиями и БД | Большие проекты с кастомной логикой |