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

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

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

  • Конфликты с плагинами кэширования (например, WP Super Cache, W3 Total Cache).
  • Ошибки в обработчиках хуков, связанных с завершением заказа.
  • Кастомный код, который не корректно очищает сессию пользователя.
  • Особенности работы WooCommerce и сессий PHP в многосерверных конфигурациях.

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

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

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

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->has_status('completed') || $order->has_status('processing')) {
        WC()->cart->empty_cart();
    }
}

Этот код очищает корзину, если заказ перешёл в статус processing или completed.

2. Учитываем разные статусы заказов и сценарии оплаты

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

add_action('woocommerce_thankyou', 'clear_cart_on_various_status', 10, 1);
function clear_cart_on_various_status($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    $accepted_statuses = array('completed', 'processing', 'on-hold');
    if (in_array($order->get_status(), $accepted_statuses)) {
        WC()->cart->empty_cart();
    }
}

3. Очистка корзины после успешного возврата с платежного шлюза

Если используется редирект с внешнего шлюза, иногда стоит дополнительно очищать корзину по событию template_redirect на странице order-received:

add_action('template_redirect', 'clear_cart_on_order_received');
function clear_cart_on_order_received() {
    if (is_order_received_page()) {
        WC()->cart->empty_cart();
    }
}

function is_order_received_page() {
    return is_page('checkout') && isset($_GET['key']) && isset($_GET['order-received']);
}

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

После добавления кода:

  1. Оформите тестовый заказ с разными способами оплаты.
  2. Убедитесь, что после редиректа на страницу благодарности корзина очищена — товары должны исчезнуть.
  3. Проверьте функционал на мобильных и десктопных устройствах, а также в разных браузерах.
  4. Если используется кэширование, очистите кэш сайта и браузера перед проверкой.

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

  • Ошибка: Корзина не очищается, если заказ в статусе on-hold.
    Решение: Добавьте этот статус в список разрешённых для очистки, если это логично для вашего магазина.
  • Ошибка: Очистка корзины происходит до успешной оплаты.
    Решение: Убедитесь, что очистка запускается только после подтверждения заказа, например, на странице thankyou и после смены статуса заказа.
  • Ошибка: Конфликты с плагинами кэширования мешают очистке корзины.
    Решение: Исключите страницы корзины, оформления заказа и благодарности из кэширования.
  • Ошибка: Очистка корзины не срабатывает при использовании сторонних платежных шлюзов.
    Решение: Проверьте, вызываются ли хуки WooCommerce после оплаты, либо реализуйте дополнительную логику через вебхуки платежного шлюза.

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

  • Не добавляйте очистку корзины в хуки, которые вызываются слишком часто (например, init), чтобы не создавать лишнюю нагрузку.
  • Используйте проверку статуса заказа, чтобы избежать преждевременной очистки корзины.
  • Если вы используете WPBono или Clearfy Pro — проверьте их настройки кэширования и оптимизации, чтобы избежать конфликтов с сессиями WooCommerce.
  • При интеграции с платежными шлюзами следите за получением корректных статусов заказа через API, чтобы очистка корзины была точной.

Таблица сравнения вариантов очистки корзины после оплаты

МетодПреимуществаНедостаткиПример кода
Хук woocommerce_thankyouНадежный, срабатывает на странице благодарностиНе работает, если пользователь не попадает на страницу thankyouПоказан в разделе «Пошаговое решение»
Хук template_redirect на странице order-receivedРаботает при возврате с платежного шлюзаЗависит от URL и параметровПоказан в разделе «Пошаговое решение»
Обработка вебхуков платежного шлюзаСамый точный способ отслеживать оплатуСложнее реализовать, требуется API шлюзаЗависит от конкретного шлюза
WooCommerce: как исключить определённые товары из применения купонов
23.06.2026
WooCommerce: как установить уникальный код для отложенных заказов
30.05.2026
WooCommerce: как настроить отправку уведомлений о заказах в Telegram
30.04.2026
WooCommerce: как автоматически удалять товар из корзины после оплаты
16.06.2026
Как изменить вывод метаданных в WordPress без изменения темы
24.01.2026