Проблема: остаточные товары в корзине после успешной оплаты
В стандартной работе WooCommerce после успешного оформления заказа корзина пользователя очищается. Однако в некоторых случаях, например, при использовании нестандартных платежных шлюзов или кастомных сценариев оформления заказа, товары могут оставаться в корзине. Это вызывает путаницу у покупателей и может негативно влиять на конверсию.
Диагностика проблемы
Для начала убедитесь, что корзина действительно не очищается после успешной оплаты. Проверьте следующие моменты:
- Откройте браузер в режиме инкогнито и оформите тестовый заказ.
- Наблюдайте, остались ли товары в корзине после оплаты.
- Проверьте консоль браузера и логи сервера на предмет ошибок JavaScript и PHP.
- Проверьте, нет ли конфликтов с плагинами кеширования или оптимизации (например, Clearfy Pro, если установлен).
Причины могут быть следующими:
- Плагин платежного шлюза не вызывает стандартные хуки WooCommerce.
- Кэширование страниц корзины или оформления заказа.
- Кастомные доработки в файлах темы или плагинах, которые блокируют очистку.
Пошаговое решение: автоматическая очистка корзины после успешного заказа
WooCommerce использует функцию wc_empty_cart() для очистки корзины. Чтобы гарантировать очистку, добавим обработчик на хук woocommerce_thankyou, который срабатывает после завершения заказа.
add_action('woocommerce_thankyou', 'custom_clear_cart_after_payment', 10, 1);
function custom_clear_cart_after_payment($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
if ($order && $order->has_status('completed')) {
WC()->cart->empty_cart();
}
}Этот код очищает корзину, если статус заказа — completed. Для некоторых магазинов стоит дополнительно проверить и processing:
if ($order && in_array($order->get_status(), ['processing', 'completed'])) {
WC()->cart->empty_cart();
}Добавьте этот код в файл functions.php вашей дочерней темы или используйте сниппет-плагин.
Проверка результата
После внедрения:
- Очистите кеш сайта и браузера.
- Оформите тестовый заказ под разными статусами (processing, completed).
- Убедитесь, что после перенаправления на страницу благодарности корзина пуста.
- Проверьте, что товары не остаются в корзине при повторном заходе на сайт.
Частые ошибки и как их исправить
- Код не срабатывает из-за неправильного статуса заказа. Проверьте, какие статусы присваиваются вашим заказам, и добавьте их в условие.
- Конфликты с кешированием. Отключите кеширование страниц корзины и оформления заказа, или используйте исключения в плагинах кеша.
- Корзина не очищается из-за кеша браузера. Добавьте заголовки, запрещающие кеширование страниц корзины и оплаты.
- Использование нестандартных плагинов, которые не вызывают хук
woocommerce_thankyou. В таком случае попробуйте добавить очистку корзины на другие хуки, например,woocommerce_order_status_completed.
Практические советы по безопасности и производительности
- Не вызывайте очистку корзины слишком рано, чтобы не потерять данные при ошибках в оплате.
- Проверяйте статус заказа, чтобы очистить корзину только после успешной оплаты.
- Избегайте дублирования кода очистки, если у вас несколько хуков срабатывают на одно и то же событие.
- Если используете плагин Clearfy Pro, добавьте исключения для страниц корзины и оформления, чтобы избежать кеширования этих динамических страниц.
Сравнение вариантов очистки корзины
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_thankyou | Очистка после успешного заказа на странице благодарности | Прост в реализации, работает с большинством платежей | Не срабатывает при нестандартных переходах |
Хук woocommerce_order_status_completed | Очистка при смене статуса заказа на "завершен" | Гарантирует очистку после подтверждения оплаты | Может сработать позже, чем нужно |
| Отключение кеширования страниц корзины | Избегает проблем с устаревшими данными в корзине | Улучшает корректность данных | Снижает скорость загрузки, требует настройки кеша |