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

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

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

Часто встречаемые симптомы:

  • Корзина не очищается автоматически после перехода на страницу благодарности;
  • Пользователь видит старые товары в корзине при повторном посещении;
  • Несоответствие между статусом заказа и содержимым корзины.

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

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

1. Использование правильного хука для очистки корзины

Самый надежный способ — использовать хук woocommerce_thankyou, который срабатывает после успешного оформления заказа.

add_action('woocommerce_thankyou', 'custom_clear_cart_after_payment', 10, 1);
function custom_clear_cart_after_payment($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if ($order->get_status() === 'completed' || $order->get_status() === 'processing') {
        WC()->cart->empty_cart();
    }
}

Данный код очищает корзину, если заказ в статусе completed или processing.

2. Учет пользовательских статусов и методов оплаты

Если у вас есть нестандартные статусы или платежные шлюзы, дополните проверку:

add_action('woocommerce_thankyou', 'custom_clear_cart_after_payment', 10, 1);
function custom_clear_cart_after_payment($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    $valid_statuses = array('completed', 'processing', 'custom-paid-status');
    if (in_array($order->get_status(), $valid_statuses)) {
        WC()->cart->empty_cart();
    }
}

3. Очистка корзины для пользователей, неавторизованных или в гостях

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

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

  • Создайте тестовый заказ с оплатой (лучше использовать тестовый платежный шлюз или режим Sandbox);
  • После успешной оплаты перейдите на страницу благодарности;
  • Проверьте содержимое корзины: она должна быть пустой;
  • Обновите страницу или вернитесь на сайт под тем же пользователем — корзина должна оставаться пустой;
  • Проверьте, что для других статусов заказа корзина не очищается.

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

Ошибка 1: Хук не срабатывает, корзина не очищается

  • Причина: нестандартный платежный шлюз не переводит заказ в один из проверяемых статусов;
  • Решение: добавьте ваш статус в массив $valid_statuses, или используйте хук, который срабатывает именно после оплаты вашего платежного метода.

Ошибка 2: Очистка корзины происходит слишком рано

  • Причина: вызов empty_cart() происходит до загрузки сессии или до обработки платежа;
  • Решение: используйте именно хук woocommerce_thankyou, который гарантировано вызывается после оплаты.

Ошибка 3: Конфликты с кэшированием

  • Причина: кеширование страниц мешает обновлению состояния корзины;
  • Решение: отключите кэширование корзины и страниц WooCommerce на уровне плагинов и серверного кэша.

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

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

Сравнение вариантов очистки корзины

МетодОписаниеПлюсыМинусы
Хук woocommerce_thankyou + empty_cart()Очищает корзину после успешного оформления заказаНадежно, стандартный способ, поддерживается WooCommerceТребует правильных статусов заказа
Очистка при смене статуса заказаУдаление корзины при переходе заказа в статус 'completed'Гибкий контрольСложнее в реализации, возможны задержки
JavaScript очистка на странице благодарностиОчистка через скрипт в браузереПростота внедренияМенее надежно, зависит от клиента
Как создать собственный шорткод в WordPress
02.11.2025
WooCommerce: как автоматически очищать корзину после успешной оплаты
08.05.2026
Как установить границы для вещественных пользователей при регистрации в WordPress
13.12.2025
WooCommerce: как автоматически удалять товар из корзины после оплаты
05.05.2026
Как установить ограничения на число публикаций в WordPress
06.04.2026