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

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

По умолчанию 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
Как избежать проблем при миграции WordPress с применением плагинов
17.01.2026
Как избежать конфликтов плагинов в WordPress: практические советы и примеры кода
06.12.2025
Как удалить или изменить URL авторских архивов в WordPress
11.02.2026
WooCommerce: как изменить статус заказа сразу после оплаты
18.05.2026
WooCommerce: как автоматически очищать корзину после успешной оплаты
08.05.2026