WooCommerce: как автоматически удалять товар из корзины после отмены оплаты

Диагностика проблемы с товарами в корзине после отмены оплаты

В 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();
}

Проверка результата после внедрения

  1. Добавьте товар в корзину как авторизованный пользователь и выполните оплату с последующей отменой или провалом.
  2. Перезагрузите страницу или вернитесь на сайт — корзина должна очиститься автоматически.
  3. Для гостей откройте страницу с параметром ?payment=failed в URL после отмены — корзина должна очиститься через AJAX.
  4. Проверьте в админке WooCommerce, что заказ получил статус cancelled или failed.

Частые ошибки и их исправление

  • Корзина не очищается для гостей: стандартный WC_Cart работает только для текущей сессии. Решение — применять JS + AJAX очистку, как в примере выше.
  • Код не срабатывает, если пользователь не на сайте: очистка корзины происходит только при посещении страницы. Для полной автоматизации нужна интеграция с системами сессий и куки, либо уведомления клиента.
  • WC()->cart возвращает null: убедитесь, что код выполняется на фронтенде, где инициализирован объект корзины WooCommerce.
  • Очистка корзины при смене статуса заказа не работает: проверьте, что хук подключён правильно и что статус действительно меняется на cancelled или failed.

Практические советы по безопасности и производительности

  • Не очищайте корзину без проверки статуса заказа — это может привести к потере данных пользователя.
  • Для гостей не храните чувствительные данные в URL (например, идентификаторы заказов) — используйте безопасные токены.
  • Минимизируйте количество AJAX-запросов — вызывайте очистку только при необходимости.
  • Добавьте логирование действий очистки корзины для отладки и мониторинга.

Сравнение способов очистки корзины после отмены оплаты

МетодПлюсыМинусыРекомендуемый сценарий
Хуки WooCommerce (cancelled, failed)Прямое реагирование на статус заказа, для авторизованных пользователейНе работает для гостей, требует нахождения пользователя на сайтеАвторизованные пользователи
AJAX + JS очистка корзиныРаботает для гостей, можно запускать по событию на фронтендеЗависит от клиента, требует внедрения JSГости и неавторизованные пользователи
Серверные скрипты для очистки сессийАвтоматическое удаление корзины вне зависимости от клиентаСложно реализовать, требует работы с сессиями и БДБольшие проекты с кастомной логикой
Как удалить неиспользуемые таксономии в WordPress без плагина
18.04.2026
WooCommerce: как отключить автологин после регистрации пользователя
17.05.2026
WooCommerce: как установить ограничение на число товаров в корзине
03.05.2026
Как создать динамический фильтр по таксономии в WordPress: практические примеры и код
09.04.2026
Как сделать просмотр видео в AJAX на WordPress
26.02.2026