Диагностика проблемы: корзина не очищается после успешного оформления заказа
В стандартном WooCommerce корзина очищается автоматически после успешного оформления заказа. Однако в ряде случаев, например, при использовании определённых плагинов кеширования, кастомных хуков или нестандартных сценариев оплаты, корзина может не опустошаться. Это приводит к тому, что пользователи видят старые товары в корзине при следующем посещении сайта, что негативно сказывается на UX и может вызывать путаницу.
Как проверить, что корзина не очищается
- Оформите заказ как гость или авторизованный пользователь.
- После перехода на страницу благодарности (thank you page) обновите страницу или перейдите обратно в корзину.
- Если товары остались — проблема налицо.
Пошаговое решение: добавление кастомного кода для очистки корзины
Для надёжного очищения корзины после завершения заказа можно добавить следующий код в файл functions.php вашей дочерней темы или в кастомный плагин. Этот код обеспечит очистку корзины по событию успешного оформления заказа.
add_action('woocommerce_thankyou', 'custom_clear_cart_after_order');
function custom_clear_cart_after_order($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(), array('completed', 'processing'))) {
WC()->cart->empty_cart();
}Почему именно hook woocommerce_thankyou?
Этот хук срабатывает при переходе на страницу благодарности сразу после оформления заказа. Это оптимальное место для очистки корзины, так как заказ уже подтверждён и данные сохранены, но пользователь ещё на сайте.
Проверка результата после внедрения
- Оформите заказ тестовым пользователем.
- Убедитесь, что после загрузки страницы благодарности корзина пустая.
- Обновите страницу корзины — товары не должны отображаться.
- Проверьте на разных браузерах и в режиме инкогнито.
Частые ошибки и как их исправить
- Корзина не очищается: возможно, вы используете кэширование страниц (например, плагин LiteSpeed Cache или серверное кэширование), которое блокирует выполнение PHP кода. Решение — исключить страницу благодарности из кэширования.
- Очистка корзины происходит слишком рано: если использовать хук
woocommerce_order_status_completed, корзина может очиститься до того, как пользователь увидит подтверждение. Лучше оставить очистку наwoocommerce_thankyou. - Ошибки PHP после добавления кода: проверьте синтаксис, используйте отладчик или логи ошибок WordPress.
Практические советы по безопасности и производительности
- Не добавляйте кастомный код напрямую в основную тему — используйте дочернюю или плагин, чтобы избежать потери при обновлении.
- Минимизируйте вызовы WC()->cart в хуках, чтобы не создавать лишних нагрузок.
- Исключите страницу оформления заказа и корзины из кеширования, чтобы изменения в корзине отображались корректно.
- При использовании CDN или плагинов кеширования убедитесь, что куки WooCommerce и PHP-сессии корректно обрабатываются.
Таблица сравнения способов очистки корзины
| Метод | Преимущества | Недостатки |
|---|---|---|
Хук woocommerce_thankyou с empty_cart() | Надежный, срабатывает сразу после заказа | Может не работать при кэшировании страниц |
Хук woocommerce_order_status_completed | Чистит корзину после смены статуса | Корзина очищается поздно, UX может пострадать |
| JavaScript очистка корзины на фронтенде | Простая реализация | Ненадежно, зависит от клиента и может быть заблокировано |