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

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

В стандартной настройке WooCommerce корзина пользователя автоматически очищается после успешного завершения заказа. Однако в некоторых случаях корзина может не очищаться, что приводит к повторному отображению уже оплаченных товаров, что сбивает пользователей с толку и может привести к ошибкам при повторных заказах.

Основные причины проблемы:

  • Кастомные плагины или темы, которые модифицируют поведение корзины.
  • Ошибки в хук-системе WooCommerce, конфликтующие с очисткой.
  • Проблемы с сессиями PHP или cookies, мешающие обновлению корзины.

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

1. Проверяем наличие конфликтов

Отключите все сторонние плагины, кроме WooCommerce, и переключитесь на стандартную тему Storefront или Reboot от WPShop (ссылка). Проверьте, очищается ли корзина после оплаты. Если да — причина в конфликте.

2. Добавляем явную очистку корзины через хук

Для надежной очистки корзины после успешного завершения заказа добавьте следующий код в functions.php вашей дочерней темы или в кастомный плагин:

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();
    }
}

Объяснение:

  • Хук woocommerce_thankyou вызывается после оформления заказа.
  • Проверяем, что статус заказа — completed. Можно заменить на processing или добавить оба для разных сценариев.
  • Вызываем метод очистки корзины WC()->cart->empty_cart();.

3. Расширение: очистка для нескольких статусов заказов

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

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

  • Оформите тестовый заказ в магазине с включенным кодом.
  • После успешной оплаты перейдите на страницу корзины — она должна быть пустой.
  • Проверьте несколько статусов заказов, чтобы убедиться, что очистка срабатывает в нужных случаях.

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

1. Очистка корзины не срабатывает

  • Код вставлен в неподходящий файл или тема не активна — проверьте правильность подключения.
  • Статус заказа не совпадает с проверяемым в условии — добавьте var_dump($order->get_status()) для диагностики.
  • Конфликт с плагином кэширования — отключите кэш и проверьте повторно.

2. Очистка происходит слишком рано

  • Если очистка запускается до завершения оплаты, используйте хук woocommerce_order_status_completed вместо woocommerce_thankyou.

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

  • Не храните в сессии большие объемы данных корзины — это может замедлить загрузку.
  • Используйте кеширование корректно, исключая страницы корзины и оформления заказа.
  • Не отключайте очистку корзины вручную в коде без веской причины — это может привести к логическим ошибкам в заказах.

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

ВариантОписаниеПлюсыМинусы
Стандартная очистка WooCommerceАвтоматическая очистка после успешного заказаНе требует кода, работает "из коробки"Может не сработать при кастомных изменениях
Код с хуком woocommerce_thankyouЯвная очистка корзины после оплатыКонтролируемое поведение, легко настраиваетсяЗависит от статуса заказа, требует поддержки
Код с хуком woocommerce_order_status_completedОчистка при смене статуса заказаНадежно для окончательных статусовМожет запаздывать, т.к. срабатывает позже
Как динамически изменить автозаголовки записей в WordPress
09.04.2026
WooCommerce: автоматическое удаление неактивных заказов
25.04.2026
WooCommerce: автоматическое удаление заказов по статусу и дате
10.05.2026
Как создать собственный виджет для WordPress с примерами кода
21.11.2025
Как настроить использование Transient API в WordPress для эффективного кэширования
26.03.2026