wpload.ru wordpress WPLoad.ru

WooCommerce: автоматическое очищение корзины при завершении заказа

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

В стандартном 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 очистка корзины на фронтендеПростая реализацияНенадежно, зависит от клиента и может быть заблокировано
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙