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

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

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

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

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

1. Используем хук woocommerce_thankyou

Этот хук вызывается после успешного завершения заказа и позволяет выполнить кастомный код.

2. Добавляем функцию очистки корзины

add_action('woocommerce_thankyou', 'clear_cart_after_payment', 10, 1);
function clear_cart_after_payment($order_id) {
    if (!$order_id) return;

    $order = wc_get_order($order_id);
    if (!$order) return;

    // Проверяем статус заказа — только для успешных оплат
    if ($order->get_status() === 'completed' || $order->get_status() === 'processing') {
        WC()->cart->empty_cart();
    }
}

В этом примере мы очищаем корзину только если заказ имеет статус completed или processing. Это исключает очистку при отмененных или ожидающих оплату заказах.

3. Регистрируем и тестируем решение

Добавьте код в файл functions.php активной темы или в кастомный плагин. Сделайте тестовый заказ и убедитесь, что после перенаправления на страницу благодарности корзина пуста.

Как проверить результат работы кода

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

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

  • Корзина не очищается после оплаты
    Причина: статус заказа не меняется на processing или completed (например, on-hold или pending). Проверьте статус заказа в админке и при необходимости добавьте дополнительные статусы в условие.
  • Ошибка, если пользователь не залогинен
    Функция WC()->cart доступна только для текущего пользователя. Если заказ оформлен гостем, возможно, корзина уже очищена или отсутствует. В этом случае убедитесь, что код не вызывает ошибок при пустой или неинициализированной корзине.
  • Очистка корзины до завершения страницы благодарности
    Хук woocommerce_thankyou срабатывает после создания заказа, но если платёж проходит через внешние сервисы с задержкой, корзина может очиститься слишком рано. Можно дополнительно использовать хук woocommerce_order_status_completed для более надежного срабатывания.

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

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

Дополнительный вариант: очистка корзины при смене статуса заказа

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

add_action('woocommerce_order_status_completed', 'clear_cart_on_order_completed');
function clear_cart_on_order_completed($order_id) {
    if (!is_admin()) {
        WC()->cart->empty_cart();
    }
}

Однако этот вариант работает только при активности сессии пользователя, поэтому предпочтительнее комбинировать оба метода.

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

МетодПлюсыМинусы
woocommerce_thankyouРаботает сразу после оплаты, просто реализуетсяВозможна очистка до подтверждения оплаты, зависит от статуса заказа
woocommerce_order_status_completedГарантированное подтверждение оплатыРаботает только при активной сессии пользователя
Комбинация обоихМаксимальная надежностьСложнее в реализации и тестировании
WooCommerce: как автоматически удалять товар из корзины после успешной оплаты
17.05.2026
Как создать автоматический импорт товаров из YML в WordPress
01.02.2026
Как создать автоматический импорт данных из JSON в WordPress с примерами кода
07.02.2026
Как добавить автоматический режим работы плагинов WordPress
28.01.2026
Как создать автоматический импорт сообщений из Telegram в WordPress
05.04.2026