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

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

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

Как понять, что корзина не очищается автоматически?

  • Заказ изменен в админке на статус "Отменён", но у пользователя в корзине остаются товары.
  • После отмены заказа пользователь возвращается на сайт и видит те же товары в корзине.
  • Повторное оформление заказа с теми же товарами без добавления новых.

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

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

Добавляем хук в functions.php или в кастомный плагин

add_action('woocommerce_order_status_cancelled', 'auto_clear_cart_after_cancelled_order', 10, 1);

function auto_clear_cart_after_cancelled_order($order_id) {
    if (!is_admin()) {
        return;
    }

    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    // Получаем ID пользователя, если есть
    $user_id = $order->get_user_id();

    if ($user_id) {
        // Очистка корзины пользователя через сессию
        // Прямого доступа к сессии другого пользователя нет, поэтому используем мета
        delete_user_meta($user_id, '_woocommerce_persistent_cart');
    }

    // Если нужно, очистим корзину текущего пользователя (например, если админ отменил заказ из фронтенда)
    if (is_user_logged_in()) {
        WC()->cart->empty_cart();
    }
}

Объяснение: При смене статуса заказа на "cancelled" удаляется сохранённая корзина пользователя из метаданных, которая отвечает за "постоянную" корзину, и очищается корзина в сессии текущего пользователя.

Особенности реализации

  • Если пользователь не вошёл в систему, очистить корзину сложно, так как сессия связана с браузером.
  • Для гостевых заказов корзина очищается при следующем визите после очистки сессии.
  • Удаление мета корзины помогает предотвратить восстановление старых товаров в корзину при повторном входе пользователя.

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

  1. Создайте тестовый заказ с авторизованным пользователем.
  2. Перейдите в панель администратора WooCommerce и измените статус заказа на "Отменён".
  3. Авторизуйтесь под тем же пользователем на сайте и откройте страницу корзины.
  4. Корзина должна быть пустой.
  5. Для гостевого пользователя отмените заказ и обновите страницу — корзина должна очиститься после обновления сессии.

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

  • Очистка корзины не происходит для гостевых пользователей. Решение: гостевая корзина хранится в сессии браузера, ее нельзя очистить с сервера напрямую. Можно предложить пользователю очистить корзину вручную или установить ограничение на время хранения корзины.
  • Корзина остается после отмены, если используется кеширование страниц. Отключите кеширование для страниц корзины и оформления заказа или добавьте исключения в настройки CDN/плагинов кеша.
  • Ошибка доступа к WC()->cart в админке. WC()->cart доступна только на фронтенде. Для очистки постоянной корзины используйте delete_user_meta, как показано в примере.

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

  • Не очищайте корзину без проверки статуса заказа — ограничивайте действие хуков только нужными статусами.
  • Удаление метаданных корзины лучше выполнять только для авторизованных пользователей, чтобы избежать случайного удаления данных.
  • Избегайте вызова WC()->cart->empty_cart() в админке — используйте только для текущей сессии фронтенда.
  • Если у вас много заказов и пользователей, частое удаление мета может нагружать базу — кешируйте результат или оптимизируйте запросы.

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

МетодПлюсыМинусыКогда использовать
delete_user_meta('_woocommerce_persistent_cart')Удаляет постоянную корзину, работает для авторизованных пользователейНе влияет на гостевые корзины, требует авторизацииДля очистки сохранённых корзин после отмены заказа
WC()->cart->empty_cart()Очищает корзину текущей сессииДоступен только на фронтенде, не работает для других пользователейДля очистки корзины текущего пользователя после действий на сайте
Очистка через JavaScript и кукиРаботает для гостей, можно очистить локальные корзиныЗависит от браузера, нельзя гарантировать очисткуКогда нужно очистить гостевые корзины
Как создать уникальный REST API endpoint в WordPress: подробное руководство с примерами
01.12.2025
WooCommerce: не отправляются письма о статусах заказов — как исправить
03.05.2026
Автоматизация работы с фильтром запросов в WordPress
28.11.2025
WooCommerce: как автоматически очищать корзину после отмены заказа
29.05.2026
Автоматическое отключение плагинов в WordPress по условиям
31.03.2026