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

Почему корзина не очищается автоматически после оплаты

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

Например, если платеж прошёл в офлайн-режиме или через редирект на сторонний сайт, корзина может не сброситься автоматически.

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

  • Проверьте, очищается ли корзина сразу после успешного заказа на стандартном способе оплаты (например, «Оплата при получении»).
  • Проверьте работу плагинов кэширования (например, WP Rocket, LiteSpeed Cache), которые могут кэшировать страницы с корзиной.
  • Проверьте, нет ли конфликтов с плагинами, которые модифицируют поведение корзины или сессий (например, плагины для ускорения работы сайта, кастомные функции).

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

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

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

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

Объяснение:

  • woocommerce_thankyou вызывается при переходе на страницу благодарности после оплаты.
  • Проверяем, что заказ существует и имеет статус completed — это гарантирует, что оплата прошла успешно.
  • Очищаем корзину с помощью WC()->cart->empty_cart();.

Что делать, если ваш платежный шлюз использует другой статус заказа?

В WooCommerce статус оплаты может отличаться — это зависит от конфигурации платежного шлюза. Например, некоторые шлюзы ставят в статус processing после оплаты. В таком случае измените условие:

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

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

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

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

  • Корзина не очищается из-за кэширования: Убедитесь, что страницы /cart/, /checkout/ и /order-received/ не кешируются плагином кэширования. Добавьте исключения в настройках плагина.
  • Код не срабатывает для всех статусов заказов: Проверьте, какие статусы присваиваются заказу после оплаты, и добавьте их в условие.
  • Очищение корзины происходит слишком рано или поздно: Используйте хук woocommerce_thankyou, а не woocommerce_order_status_completed, чтобы гарантировать, что очистка происходит на странице благодарности.
  • Ошибка «Call to a member function empty_cart() on null»: Проверьте, что объект корзины доступен (WC()->cart), код должен выполняться на фронтенде, где инициализирован класс корзины.

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

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

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

Иногда удобнее использовать плагин, если вы не хотите писать код. Вот сравнительная таблица:

МетодПлюсыМинусы
Код на хуке woocommerce_thankyouПолный контроль, бесплатный, легко кастомизируетсяТребует базовых знаний PHP, нужно тестировать
Плагин «Clear Cart for WooCommerce»Простота установки, настройки из админкиМожет конфликтовать с другими плагинами, требует обновлений
Кастомный JavaScript на странице благодарностиМожно быстро добавить без PHPМенее надежно, зависит от браузера и кеша

Чек-лист для корректной работы автоматической очистки корзины

  • Добавлен и активирован код очистки корзины на хуке woocommerce_thankyou.
  • Проверены и учтены статусы заказа, используемые вашим платежным шлюзом.
  • Отключено кеширование страниц /cart/, /checkout/, /order-received/.
  • Проведено тестирование на тестовом заказе.
  • Проверена работа в разных браузерах и в режиме инкогнито.
WooCommerce: решение проблемы не сохраняются изменения атрибутов товаров
26.05.2026
Как избежать конфликтов плагинов в WordPress
06.12.2025
WooCommerce: не отображается описание товара после обновления — как исправить
13.05.2026
Как отключить автоматическое удаление старых записей через WP-Cron в WordPress
24.03.2026
Как автоматизировать управление ролями и правами в WordPress
02.03.2026