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

Диагностика проблемы: почему товары остаются в корзине после отмены оплаты

В стандартной установке WooCommerce товары, добавленные в корзину, остаются там до тех пор, пока пользователь вручную не очистит корзину или не завершит покупку. При отмене или неудаче оплаты система не удаляет товары автоматически, что может привести к путанице и некорректному учету.

Проблема особенно заметна в случаях, когда пользователи пытаются оплатить заказ, но по разным причинам процесс прерывается (отмена в платежной системе, сбой соединения, возврат платежа). В результате корзина остается заполненной, и пользователю приходится самостоятельно очищать её, что ухудшает UX и может снижать конверсию.

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

1. Используем хук для отслеживания статуса заказа

WooCommerce предоставляет хуки для обработки изменения статуса заказа. Для удаления товаров из корзины после отмены оплаты нужно отследить переход заказа в статус «отменён» (cancelled) или «неоплачен» (failed).

2. Добавляем код в 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; // Очистка корзины для гостей не имеет смысла
    }
    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    // Получаем ID пользователя, связанного с заказом
    $user_id = $order->get_user_id();
    if ($user_id !== get_current_user_id()) {
        return; // Убедимся, что это текущий пользователь
    }

    // Получаем объект корзины
    WC()->cart->empty_cart();
}

Данный код очищает корзину текущего пользователя при изменении статуса заказа на отменённый или неудачный. Обратите внимание, что очистка работает только для авторизованных пользователей, так как для гостей корзина хранится в сессии и не связана с заказом.

3. Как настроить очистку корзины для гостей

Для гостей можно использовать дополнительный механизм — например, настроить временное хранение корзины и очищать её с помощью куков и JS, либо использовать плагин, который умеет работать с гостевой корзиной.

Но универсального решения в коде нет из-за особенностей работы сессий WooCommerce для незарегистрированных пользователей.

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

  1. Авторизуйтесь на сайте как пользователь.
  2. Добавьте товар в корзину и оформите заказ.
  3. Имитируйте отмену оплаты (например, вручную измените статус заказа в админке на "Отменён" или "Неудачный").
  4. Вернитесь на сайт под этим же пользователем и проверьте, что корзина пуста.

Если корзина очищена, значит код работает корректно.

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

  • Корзина не очищается для гостя: корзина у гостей хранится в сессии и не связана с заказом, поэтому код очистки должен быть реализован отдельно с использованием куков или JS.
  • Функция WC()->cart->empty_cart() не работает в админке: данный код должен выполняться в контексте фронтенда, например, при посещении пользователем сайта. Если нужно очищать корзину из админки, придется реализовать дополнительный механизм передачи события пользователю.
  • Очистка корзины происходит у другого пользователя: убедитесь, что в коде проверяется, что $user_id === get_current_user_id(), чтобы не очищать случайно чужие корзины.

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

  • Используйте проверку прав доступа и авторизации, чтобы не допустить очистку корзины у неавторизованных пользователей.
  • Избегайте выполнения очистки корзины в хуках, которые срабатывают в админке или в REST API-запросах, чтобы не появилось побочных эффектов.
  • Для улучшения UX можно после очистки корзины выводить уведомление с пояснением, почему корзина была очищена.

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

ВариантОписаниеПлюсыМинусы
Код на PHP для авторизованных пользователейХук на смену статуса заказа, очистка корзины через WC()->cart->empty_cart()Простой, надёжный для пользователей с аккаунтомНе работает для гостей
Использование куков и JS для гостейУправление корзиной через куки/локальное хранилище, очистка при отмене оплатыПоддержка гостейСложнее в реализации, зависит от JS
Плагины для управления корзинойГотовые решения с расширенными возможностямиБыстрое внедрение, поддержка разных сценариевМожет влиять на производительность, требует обновлений
WooCommerce: как отключить автологин после регистрации пользователя
15.09.2026
Как удалить кеш и оптимизировать WordPress без плагинов
08.09.2026
Руководство по созданию собственного REST API в WordPress
08.09.2026
WooCommerce: как установить отрицательные цены на товары
27.09.2026
WooCommerce: как отключить автологин после регистрации пользователя
22.08.2026
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »