Почему WooCommerce не очищает корзину после успешной оплаты?
По умолчанию WooCommerce очищает корзину после завершения заказа, но бывают ситуации, когда товар остается в корзине. Это может происходить из-за нестандартных настроек, конфликтов с плагинами, или если пользователь возвращается на сайт после оплаты через внешние платёжные системы без корректного завершения сессии.
Если корзина не очищается автоматически, это приводит к путанице у пользователей и может негативно повлиять на конверсию.
Диагностика проблемы с очисткой корзины WooCommerce
- Проверьте, используется ли нестандартный шаблон оформления заказа или кастомный плагин для платежей.
- Отключите временно все плагины, кроме WooCommerce, чтобы исключить конфликты.
- Проверьте логи ошибок сервера и WooCommerce на предмет проблем с сессиями или куки.
- Проверьте, не перезаписывается ли функция очистки корзины хуками в теме или плагинах.
Пошаговое решение: очистка корзины после успешной оплаты
Добавьте следующий код в файл 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().
Альтернативный вариант для статуса processing
Если платежи проходят с другим статусом (например, processing), замените проверку статуса:
if ($order && $order->has_status(array('completed', 'processing'))) {
WC()->cart->empty_cart();
}Проверка результата
- Создайте тестовый заказ с товарами в корзине.
- Завершите оплату через реальный или тестовый платежный шлюз.
- После перехода на страницу благодарности проверьте, что корзина пуста (можно посмотреть в интерфейсе сайта или вызвать
WC()->cart->get_cart_contents_count()через консоль разработчика).
Частые ошибки и их исправление
- Корзина не очищается, потому что статус заказа не совпадает. Проверьте, какой статус получает заказ после оплаты и прописывайте его в условии.
- Код не работает на странице благодарности. Убедитесь, что хук
woocommerce_thankyouне переопределяется вашей темой или плагинами. - Пользователи возвращаются на сайт с кэшированной страницей. Настройте заголовки кэширования, чтобы страница благодарности не кэшировалась, иначе корзина не обновится.
- Конфликт с плагинами кеширования. Исключите страницы оплаты и благодарности из кэширования.
Практические советы по безопасности и производительности
- Не используйте удаление корзины на основании только GET-параметров – это может привести к ошибкам или потере данных.
- Очищайте корзину только после подтверждения успешной оплаты, чтобы избежать удаления товаров при ошибках.
- Если используется сторонний платежный шлюз, проверяйте его документацию на события вебхуков или статусы заказа.
- Минимизируйте количество запросов и не вызывайте очистку корзины на каждый визит — только после оплаты.
Таблица сравнения способов очистки корзины после оплаты
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_thankyou | Очистка корзины сразу после загрузки страницы благодарности | Простой, работает для большинства сценариев | Зависит от статуса заказа, может не сработать при кэшировании |
| Вебхуки платежных шлюзов | Обработка события успешной оплаты с сервера платежного шлюза | Надёжно, не зависит от поведения пользователя | Сложнее реализовать, требует настройки API |
| JavaScript на странице благодарности | Удаление корзины через AJAX после загрузки страницы | Можно сделать визуальный эффект | Зависит от клиента, менее надёжно |