Почему корзина не очищается автоматически после оплаты
По умолчанию 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/. - Проведено тестирование на тестовом заказе.
- Проверена работа в разных браузерах и в режиме инкогнито.