WPBono

WooCommerce: как автоматически удалять товары из корзины после оплате

Диагностика проблемы: почему товары остаются в корзине после оформления заказа

По умолчанию WooCommerce очищает корзину после успешного оформления заказа, однако в ряде случаев товары могут оставаться в корзине у пользователя. Это происходит, если на сайте используются кастомные способы оплаты, нестандартные плагины оформления заказа или кэширование корзины на стороне клиента. Также проблемы возникают при нестабильной работе JavaScript или когда пользователь повторно открывает страницу с корзиной после оплаты.

Чтобы убедиться, что корзина не очищается автоматически, можно проверить после успешного завершения заказа, остались ли товары в WC()->cart. Если корзина не очищается, пользователи могут случайно повторять оплату или испытывать путаницу.

Пошаговое решение: автоматическое удаление товаров из корзины после оплаты

1. Использование хука woocommerce_thankyou

Этот хук вызывается после успешного создания заказа и загрузки страницы благодарности. В нем можно очистить корзину программно.

add_action('woocommerce_thankyou', 'wpbono_clear_cart_after_payment', 10, 1); 
function wpbono_clear_cart_after_payment($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    if ($order && $order->get_status() === 'completed') {
        WC()->cart->empty_cart();
    }
}

Обратите внимание, что проверка статуса заказа важна: корзина должна очищаться только после подтверждения оплаты, то есть для статуса completed. Можно расширить проверку на другие статусы, например processing.

2. Очистка корзины при смене статуса заказа через webhook или cron

Если на сайте используются сторонние платежные шлюзы и статус заказа меняется асинхронно, очищать корзину нужно при смене статуса заказа.

add_action('woocommerce_order_status_completed', 'wpbono_clear_cart_on_order_complete');
function wpbono_clear_cart_on_order_complete($order_id) {
    if (!is_admin() && WC()->cart) {
        WC()->cart->empty_cart();
    }
}

Этот код сработает, когда заказ будет отмечен как завершённый, не только на странице благодарности.

Проверка результата после внедрения

  • Оформите заказ на тестовом сайте WooCommerce с включенными выше хуками.
  • На странице "Спасибо за заказ" проверьте, что корзина пуста (перейдите в корзину, она должна быть пустой).
  • Попробуйте обновить страницу «Спасибо» — корзина останется пустой.
  • Если используете кэширование, проверьте работу на разных браузерах и с отключенным кэшем.

Частые ошибки и как их исправить

  • Корзина не очищается после оплаты: Проверьте, что в коде правильно получаете объект заказа и проверяете статус. Если оплата проходит в несколько этапов, используйте хук смены статуса, а не только woocommerce_thankyou.
  • Очистка корзины происходит слишком рано: Не очищайте корзину при статусах pending или failed. Убедитесь, что проверка статуса корректна.
  • Кэш браузера мешает обновлению корзины: Добавьте заголовки для предотвращения кэширования страниц с корзиной или используйте JavaScript для обновления состояния корзины.
  • Ошибка при вызове WC()->cart->empty_cart() в административной части: Добавьте проверку if (!is_admin() && WC()->cart) перед вызовом функции.

Практические советы по безопасности и производительности

  • Не очищайте корзину без проверки статуса оплаты — это может привести к потере товаров, если пользователь не оплатил заказ.
  • Если сайт работает с кэшированием (например, через плагин WP Rocket или серверный nginx), убедитесь, что страницы корзины и благодарности не кэшируются.
  • Для улучшения UX можно добавить AJAX-обработчик, который обновит корзину после оплаты без перезагрузки страницы.
  • Если используете нестандартные платежные шлюзы, убедитесь, что они корректно меняют статус заказа, и обработчик очищения корзины срабатывает именно при успешной оплате.

Сравнение вариантов очистки корзины

МетодПлюсыМинусы
Хук woocommerce_thankyouПростой, срабатывает на странице благодарностиНе сработает если статус заказа меняется позже
Хук смены статуса woocommerce_order_status_completedГарантирует очистку после подтверждения оплатыНе сработает сразу на странице благодарности
JavaScript очистка корзиныОбновляет UX без перезагрузкиЗависит от клиента, не безопасен для критичных операций
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше