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

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

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

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

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

Основная идея решения

Нужно отследить событие отмены или неудачи оплаты и программно очистить корзину пользователя. В WooCommerce есть хук woocommerce_order_status_changed, который позволяет реагировать на изменение статуса заказа. Мы будем отлавливать переход в статус cancelled или failed и очищать корзину.

Пошаговая инструкция с примером кода

Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:

add_action('woocommerce_order_status_changed', 'clear_cart_on_order_cancelled_or_failed', 10, 4);
function clear_cart_on_order_cancelled_or_failed($order_id, $old_status, $new_status, $order) {
    if (in_array($new_status, ['cancelled', 'failed'])) {
        // Получаем ID пользователя, сделавшего заказ
        $user_id = $order->get_user_id();
        if ($user_id) {
            // Если пользователь авторизован, очищаем его корзину
            $user = get_user_by('ID', $user_id);
            if ($user) {
                // Используем WC_Session для очистки корзины текущего пользователя
                // Но так как это серверный код, очищаем корзину через WC_Cart только для текущего пользователя
                if (is_user_logged_in() && get_current_user_id() === $user_id) {
                    WC()->cart->empty_cart();
                } else {
                    // Для других пользователей очистка корзины не сработает напрямую
                    // Можно отправить уведомление или использовать другие механизмы
                }
            }
        } else {
            // Гость, очистка корзины невозможна программно с сервера
        }
    }
}

Обратите внимание, что WC()->cart->empty_cart() очищает корзину текущего пользователя, то есть того, кто совершает запрос. Если заказ отменён гостем или другим пользователем, корзина не очистится автоматически. Для гостевых пользователей и неактивных сессий можно рассмотреть вариант с JavaScript и cookie, но это выходит за рамки простой серверной логики.

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

  1. Создайте тестовый заказ, завершите оформление, но отмените платеж.
  2. Убедитесь, что после возврата на сайт корзина пользователя пустая.
  3. Для авторизованных пользователей сделайте несколько заказов с разными статусами, чтобы проверить, что очистка срабатывает только при статусах cancelled и failed.

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

  • Очистка не происходит для гостей: гостевая корзина хранится в сессии браузера, и сервер не может её очистить. Решение — либо уведомлять пользователя очистить корзину вручную, либо реализовать дополнительный JS скрипт для очистки localStorage и cookies.
  • Код не срабатывает из-за кеширования: если на сайте активно кеширование страниц, хуки WooCommerce могут не сработать корректно. Проверьте кеш-плагины, исключите страницы оформления заказа из кеша.
  • Очистка корзины происходит для всех статусов: убедитесь, что условие в коде проверяет именно нужные статусы cancelled и failed.

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

  • Не используйте очистку корзины на клиенте без проверки статуса заказа — это может привести к потере данных пользователя.
  • Ограничьте логику очистки только событиями, связанными с реальными изменениями статуса заказа.
  • Проверяйте, что корзина очищается только у того пользователя, который сделал заказ, чтобы не нарушать чужие сессии.
  • При использовании плагинов для оплаты убедитесь, что они правильно меняют статус заказа, чтобы наш хук сработал.

Варианты реализации: сравнение методов очистки корзины

МетодПлюсыМинусыКомпромисс
Очистка через woocommerce_order_status_changed (PHP)Надежно для авторизованных пользователей, работает на сервереНе работает для гостей, требует авторизацииПодходит для большинства магазинов с регистрацией
Очистка через JavaScript (client-side)Можно очистить корзину гостей, работает в браузереСложнее реализовать, требуется синхронизация со статусом заказаИспользовать вместе с серверной очисткой, для полного покрытия
Плагины автоматизации корзиныПростота установки, готовые функцииМогут влиять на производительность, ограничены настройкамиИспользовать, если нет ресурсов на кастомный код
Как сделать динамические виджеты в WordPress: полное руководство
06.11.2025
Как создать динамический meta title в WordPress с примерами кода
26.01.2026
Как отключить REST API WordPress для определённых пользователей
15.02.2026
Автозаполнение форм в WordPress: улучшение пользовательского опыта
15.11.2025
WooCommerce: как отключить автологин после регистрации пользователя
31.05.2026