Диагностика проблемы: почему товары остаются в корзине после покупки
В стандартной работе WooCommerce корзина пользователя очищается после успешного оформления заказа. Однако в некоторых случаях товары могут оставаться в корзине, что создаёт путаницу и снижает удобство пользователя. Основные причины:
- Кэширование страниц, из-за которого корзина не обновляется корректно.
- Сторонние плагины, которые вмешиваются в процесс очистки корзины.
- Некорректная работа хуков или кастомных функций, которые управляют корзиной.
- Заказы, созданные вне стандартного процесса WooCommerce (например, через REST API), без правильного триггера очистки корзины.
Пошаговое решение: автоматическая очистка корзины после оплаты
1. Проверка стандартного поведения WooCommerce
Убедитесь, что в вашей теме и плагинах нет переопределений, которые мешают стандартной очистке корзины. Для этого временно отключите все плагины, кроме WooCommerce, и переключитесь на дефолтную тему (например, Storefront).
2. Добавление кастомного кода для очистки корзины по хуку woocommerce_thankyou
Хук woocommerce_thankyou вызывается после успешной оплаты. Добавим функцию, которая очистит корзину пользователя после завершения заказа:
add_action('woocommerce_thankyou', 'clear_cart_after_payment');
function clear_cart_after_payment($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Проверяем статус заказа
if ($order->has_status('completed') || $order->has_status('processing')) {
WC()->cart->empty_cart();
}
}Этот код очищает корзину для текущего пользователя, если заказ находится в статусе completed или processing.
3. Решение для кэшированных страниц и гостевых пользователей
Если сайт использует кэширование (например, через плагин WP Rocket, LiteSpeed Cache или серверное кэширование), убедитесь, что страницы корзины и оформления заказа исключены из кэша. Иначе корзина не обновится сразу после оплаты.
Для гостевых пользователей (неавторизованных) WooCommerce хранит корзину в сессии и cookie. Иногда cookie не обновляются корректно. Можно добавить JavaScript для принудительного обновления корзины после оплаты, но это крайний случай.
Проверка результата после внедрения
- Создайте тестовый заказ на сайте под авторизованным пользователем.
- После успешной оплаты перейдите на страницу корзины и убедитесь, что она пуста.
- Повторите тест под гостевым пользователем (в другом браузере или режиме инкогнито).
- Проверьте работу при включённом кэшировании страниц.
Частые ошибки и как их исправить
- Код не срабатывает для гостевых пользователей: WC()->cart зависит от сессии, которая может не обновляться при кэшировании. Решение — исключить страницы корзины и оформления из кэша.
- Плагин безопасности блокирует очистку корзины: проверьте логи и временно отключите плагины безопасности для теста.
- Использование нестандартных статусов заказа: добавьте их в проверку
if ($order->has_status(...)). - Ошибка типа «Call to a member function empty_cart() on null»: убедитесь, что вызов происходит в нужном контексте, где доступен объект корзины WooCommerce.
Практические советы по безопасности и производительности
- Добавляйте кастомный код в дочернюю тему или в специально созданный плагин, чтобы не потерять при обновлении.
- Избегайте выполнения очистки корзины вне хука
woocommerce_thankyou, чтобы не удалять товары преждевременно. - При использовании кэширования исключите из кэша страницы с корзиной и оформления заказа, чтобы избежать рассинхронизации данных.
- Регулярно проверяйте совместимость ваших кастомных решений с обновлениями WooCommerce и WordPress.
Таблица сравнения подходов к очистке корзины WooCommerce
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Стандартное поведение WooCommerce | Работает из коробки, не требует кода | Может ломаться из-за кэша или плагинов | Простые сайты без агрессивного кэширования |
Код на хуке woocommerce_thankyou | Гарантированное очищение корзины после оплаты | Требует точной настройки и проверки | Сайты с нестандартными статусами, кастомным процессом оплаты |
| JavaScript-очистка корзины | Работает для гостевых пользователей при проблемах с сессиями | Усложняет код, возможны баги из-за асинхронности | Сложные случаи с кэшированием и гостевыми пользователями |