Диагностика проблемы: почему корзина не очищается после оплаты
В стандартной настройке WooCommerce корзина пользователя автоматически очищается после успешного завершения заказа. Однако в некоторых случаях корзина может не очищаться, что приводит к повторному отображению уже оплаченных товаров, что сбивает пользователей с толку и может привести к ошибкам при повторных заказах.
Основные причины проблемы:
- Кастомные плагины или темы, которые модифицируют поведение корзины.
- Ошибки в хук-системе WooCommerce, конфликтующие с очисткой.
- Проблемы с сессиями PHP или cookies, мешающие обновлению корзины.
Пошаговое решение: гарантируем очистку корзины после успешного заказа
1. Проверяем наличие конфликтов
Отключите все сторонние плагины, кроме WooCommerce, и переключитесь на стандартную тему Storefront или Reboot от WPShop (ссылка). Проверьте, очищается ли корзина после оплаты. Если да — причина в конфликте.
2. Добавляем явную очистку корзины через хук
Для надежной очистки корзины после успешного завершения заказа добавьте следующий код в 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. Можно заменить наprocessingили добавить оба для разных сценариев. - Вызываем метод очистки корзины
WC()->cart->empty_cart();.
3. Расширение: очистка для нескольких статусов заказов
add_action('woocommerce_thankyou', 'custom_clear_cart_after_payment_multiple_status', 10, 1);
function custom_clear_cart_after_payment_multiple_status($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if ($order && in_array($order->get_status(), array('processing', 'completed'))) {
WC()->cart->empty_cart();
}
}Проверка результата после внедрения
- Оформите тестовый заказ в магазине с включенным кодом.
- После успешной оплаты перейдите на страницу корзины — она должна быть пустой.
- Проверьте несколько статусов заказов, чтобы убедиться, что очистка срабатывает в нужных случаях.
Частые ошибки и как их исправить
1. Очистка корзины не срабатывает
- Код вставлен в неподходящий файл или тема не активна — проверьте правильность подключения.
- Статус заказа не совпадает с проверяемым в условии — добавьте
var_dump($order->get_status())для диагностики. - Конфликт с плагином кэширования — отключите кэш и проверьте повторно.
2. Очистка происходит слишком рано
- Если очистка запускается до завершения оплаты, используйте хук
woocommerce_order_status_completedвместоwoocommerce_thankyou.
Практические советы по безопасности и производительности
- Не храните в сессии большие объемы данных корзины — это может замедлить загрузку.
- Используйте кеширование корректно, исключая страницы корзины и оформления заказа.
- Не отключайте очистку корзины вручную в коде без веской причины — это может привести к логическим ошибкам в заказах.
Сравнение вариантов очистки корзины
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Стандартная очистка WooCommerce | Автоматическая очистка после успешного заказа | Не требует кода, работает "из коробки" | Может не сработать при кастомных изменениях |
Код с хуком woocommerce_thankyou | Явная очистка корзины после оплаты | Контролируемое поведение, легко настраивается | Зависит от статуса заказа, требует поддержки |
Код с хуком woocommerce_order_status_completed | Очистка при смене статуса заказа | Надежно для окончательных статусов | Может запаздывать, т.к. срабатывает позже |