Диагностика проблемы с удалением товаров из корзины после оплаты
По умолчанию WooCommerce очищает корзину после успешного оформления заказа. Но если используются кастомные платежные шлюзы или сложные сценарии оплаты, корзина может не опустошаться автоматически, что приводит к повторному отображению уже оплаченных товаров. Это сбивает пользователей и вызывает дублирование заказов.
Проверьте, сохраняется ли содержимое корзины после успешной оплаты. Для этого:
- Оформите заказ через основной способ оплаты.
- После редиректа на страницу успешного заказа вернитесь обратно на страницу корзины.
- Если товары остались, значит корзина не очищается автоматически.
Такой сбой чаще всего вызван отсутствием вызова метода очистки корзины WC()->cart->empty_cart() после подтверждения оплаты.
Пошаговое решение: как вручную очищать корзину после успешного заказа
1. Использование хука WooCommerce woocommerce_thankyou
Этот хук вызывается после успешного оформления заказа и подходит для очистки корзины. Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
add_action('woocommerce_thankyou', 'custom_empty_cart_after_payment');
function custom_empty_cart_after_payment($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
if ($order && $order->has_status('processing') || $order->has_status('completed')) {
WC()->cart->empty_cart();
}
}Этот код проверяет, что заказ существует и находится в статусе processing или completed, после чего очищает корзину.
2. Очистка корзины для кастомных платежных шлюзов
Если вы используете нестандартные платежные шлюзы, убедитесь, что они корректно меняют статус заказа на processing или completed. Если нет, можно добавить очистку корзины по событию смены статуса заказа:
add_action('woocommerce_order_status_changed', 'clear_cart_on_order_status_change', 10, 3);
function clear_cart_on_order_status_change($order_id, $old_status, $new_status) {
if (in_array($new_status, array('processing', 'completed'))) {
WC()->cart->empty_cart();
}
}Как проверить, что корзина очищается после оплаты
- Оформите тестовый заказ на сайте с любым доступным способом оплаты.
- После успешного заказа перейдите на страницу корзины.
- Корзина должна быть пустой.
- Если корзина не пустая, проверьте логи ошибок PHP и консоль браузера на наличие JS-ошибок.
- Попробуйте отключить другие плагины, чтобы исключить конфликт.
Частые ошибки и как их исправить
- Корзина не очищается при использовании кастомного шлюза: Проверьте, меняется ли статус заказа на
processingилиcompleted. Добавьте кастомный обработчик для своего статуса. - Ошибка «Call to a member function empty_cart() on null»: Убедитесь, что вызов
WC()->cartпроисходит в контексте сессии пользователя (например, на фронтенде), а не в админке. - Корзина очищается слишком рано: Используйте хуки срабатывающие после подтверждения оплаты, не раньше.
Практические советы по безопасности и производительности
- Не очищайте корзину на событиях, которые могут произойти до успешной оплаты, чтобы не потерять данные пользователя.
- Для высокой нагрузки кешируйте данные заказов, но не кешируйте страницы корзины, чтобы избежать несинхронизированного состояния.
- Проверяйте совместимость с плагинами кеширования, которые могут кэшировать страницу корзины и мешать обновлению состояния.
Сравнение способов очистки корзины после оплаты
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_thankyou | Очистка корзины после успешного заказа на странице благодарности | Простой, срабатывает после оплаты | Не работает при нестандартных платежах с задержкой обработки |
Хук woocommerce_order_status_changed | Очистка при смене статуса заказа на processing/completed | Универсальный для всех способов оплаты | Требует правильной настройки статусов в платежных шлюзах |
| Очистка на стороне клиента через JS | Удаление корзины через скрипты после редиректа | Работает при любых условиях | Менее надежно, зависит от браузера и может быть заблокировано |