Диагностика проблемы с «зависшими» товарами в корзине WooCommerce
В WooCommerce по умолчанию корзина сохраняется в сессии пользователя и в cookie, поэтому товары могут оставаться в ней даже после оплаты или длительного бездействия. Это приводит к тому, что пользователи видят в корзине старые товары, что может сбивать с толку и ухудшать UX.
Проверить наличие «зависших» товаров можно так:
- Откройте сайт в режиме инкогнито, добавьте товар в корзину, оплатите заказ;
- Вернитесь на сайт, откройте корзину — если товары остались, значит корзина не очищается автоматически.
Почему корзина WooCommerce не очищается после оплаты
- Стандартный функционал WooCommerce не сбрасывает корзину после успешной оплаты;
- Плагины кэширования или оптимизации могут сохранять старые данные корзины;
- Кастомные модификации или темы могут влиять на обработку сессии.
Пошаговое решение: автоматическая очистка корзины после оплаты
Добавим в functions.php дочерней темы или в кастомный плагин следующий код, который очищает корзину при смене статуса заказа на "завершён" или "обработан":
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;
// Проверяем статус заказа
$status = $order->get_status();
if ( in_array( $status, array( 'completed', 'processing' ) ) ) {
WC()->cart->empty_cart();
}
}Этот хук срабатывает на странице благодарности, когда пользователь возвращается после оплаты. Если заказ в статусе completed или processing, корзина очищается.
Альтернативный вариант: очищать корзину сразу после смены статуса заказа
add_action( 'woocommerce_order_status_completed', 'clear_cart_on_order_completed' );
add_action( 'woocommerce_order_status_processing', 'clear_cart_on_order_completed' );
function clear_cart_on_order_completed( $order_id ) {
if ( ! is_user_logged_in() ) return;
// Очистка корзины пользователя, сделавшего заказ
WC()->cart->empty_cart();
}Однако этот способ работает только если заказ создаёт залогиненный пользователь, и корзина активна в его сессии.
Проверка результата
- Добавьте товар в корзину под учётной записью пользователя;
- Оформите заказ и перейдите к оплате;
- После успешной оплаты вернитесь на страницу корзины — она должна быть пустой;
- Повторите тест в режиме инкогнито, чтобы проверить поведение для гостей.
Частые ошибки и как их исправить
- Ничего не происходит после оплаты — убедитесь, что код добавлен в правильное место, и что хук
woocommerce_thankyouсрабатывает. Возможен конфликт с кэшированием. - Корзина не очищается для гостей — корзина у гостя хранится в cookie, очистить её программно сложно, лучше использовать JS для очистки cookie после успешного заказа.
- Очистка корзины происходит слишком рано — используйте статусы заказа
completedилиprocessing, чтобы избежать удаления товара до оплаты.
Практические советы по безопасности и производительности
- Не храните важные данные корзины в cookie без шифрования.
- Избегайте очистки корзины на фронтенде через JS без проверки статуса заказа.
- Проверьте совместимость с плагинами кэширования (например, WP Super Cache, W3 Total Cache) — они могут кешировать страницы с корзиной.
Чек-лист внедрения автоматической очистки корзины после оплаты
- Добавить код очистки корзины на хук
woocommerce_thankyouв functions.php; - Проверить, что в вашей теме или плагинах нет конфликтов с сессиями и кэшированием;
- Протестировать очистку корзины для авторизованных пользователей;
- Добавить JS-скрипт для очистки cookie корзины у гостей (если требуется);
- Мониторить логи ошибок и поведение на продакшене.
Сравнение способов очистки корзины после оплаты
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_thankyou | Очистка корзины на странице благодарности | Простой, срабатывает после оплаты | Не работает, если пользователь не возвращается на сайт |
Хуки статуса заказа processing/completed | Очистка корзины при смене статуса заказа | Срабатывает независимо от возврата пользователя | Работает только для залогиненных пользователей |
| JS очистка cookie корзины | Удаление данных корзины у гостей через JavaScript | Работает для гостей | Менее надежно, зависит от браузера |