Диагностика проблемы с удалением товаров из корзины после оплаты
В WooCommerce стандартное поведение корзины сохраняет товары до тех пор, пока пользователь явно их не удалит или не очистит корзину. Иногда возникает задача — автоматически очищать корзину после успешной оплаты, чтобы избежать повторных заказов с теми же товарами или путаницы для пользователя при следующем визите.
Проблема особенно актуальна, если в магазине не используется сессия пользователя или если корзина не сбрасывается автоматически при завершении заказа. Это может привести к дублированию товаров в корзине и ошибкам при оформлении последующих заказов.
Пошаговое решение: добавляем автоматическое удаление товаров из корзины
1. Используем хук woocommerce_thankyou
Этот хук вызывается после успешного завершения заказа и позволяет выполнить кастомный код.
2. Добавляем функцию очистки корзины
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->get_status() === 'completed' || $order->get_status() === 'processing') {
WC()->cart->empty_cart();
}
}
В этом примере мы очищаем корзину только если заказ имеет статус completed или processing. Это исключает очистку при отмененных или ожидающих оплату заказах.
3. Регистрируем и тестируем решение
Добавьте код в файл functions.php активной темы или в кастомный плагин. Сделайте тестовый заказ и убедитесь, что после перенаправления на страницу благодарности корзина пуста.
Как проверить результат работы кода
- Сделайте тестовый заказ с тестовым товаром и пройдите процесс оплаты (можно использовать Sandbox режим платежного шлюза).
- После успешной оплаты перейдите на страницу благодарности — корзина должна быть автоматически очищена.
- Обновите страницу корзины — она должна быть пустой.
Частые ошибки и как их исправить
- Корзина не очищается после оплаты
Причина: статус заказа не меняется наprocessingилиcompleted(например,on-holdилиpending). Проверьте статус заказа в админке и при необходимости добавьте дополнительные статусы в условие. - Ошибка, если пользователь не залогинен
ФункцияWC()->cartдоступна только для текущего пользователя. Если заказ оформлен гостем, возможно, корзина уже очищена или отсутствует. В этом случае убедитесь, что код не вызывает ошибок при пустой или неинициализированной корзине. - Очистка корзины до завершения страницы благодарности
Хукwoocommerce_thankyouсрабатывает после создания заказа, но если платёж проходит через внешние сервисы с задержкой, корзина может очиститься слишком рано. Можно дополнительно использовать хукwoocommerce_order_status_completedдля более надежного срабатывания.
Практические советы по безопасности и производительности
- Используйте проверку статуса заказа, чтобы не очищать корзину при неоплаченных или отмененных заказах.
- Не добавляйте тяжелых вычислений в хук
woocommerce_thankyou, чтобы не замедлять загрузку страницы благодарности. - Для сайтов с кешированием страниц настройте исключения на странице корзины и оформления заказа, чтобы изменения корзины сразу отражались.
Дополнительный вариант: очистка корзины при смене статуса заказа
Для большей надежности можно использовать хук woocommerce_order_status_completed, который срабатывает при смене статуса заказа на completed. Пример:
add_action('woocommerce_order_status_completed', 'clear_cart_on_order_completed');
function clear_cart_on_order_completed($order_id) {
if (!is_admin()) {
WC()->cart->empty_cart();
}
}
Однако этот вариант работает только при активности сессии пользователя, поэтому предпочтительнее комбинировать оба метода.
Сравнение вариантов очистки корзины
| Метод | Плюсы | Минусы |
|---|---|---|
woocommerce_thankyou | Работает сразу после оплаты, просто реализуется | Возможна очистка до подтверждения оплаты, зависит от статуса заказа |
woocommerce_order_status_completed | Гарантированное подтверждение оплаты | Работает только при активной сессии пользователя |
| Комбинация обоих | Максимальная надежность | Сложнее в реализации и тестировании |