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

|

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

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

Проверить, что проблема именно в этом, просто: оформите тестовый заказ и отмените его в админке WooCommerce. Затем обновите страницу корзины на фронтенде под тем же пользователем. Если товары остались, значит, стандартного поведения очистки корзины нет.

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

Использование хука WooCommerce для отслеживания смены статуса заказа

Для автоматической очистки корзины после смены статуса заказа на "отменён" (cancelled) нужно добавить кастомный код в файл functions.php вашей активной темы или в отдельный плагин.

add_action('woocommerce_order_status_cancelled', 'clear_cart_after_order_cancelled');
function clear_cart_after_order_cancelled($order_id) {
    if (!is_user_logged_in()) {
        return; // Очистка корзины актуальна только для авторизованных пользователей
    }
    WC()->cart->empty_cart();
}

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

Обработка очистки корзины при отмене заказа через REST API или админку

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

Для этого можно воспользоваться пользовательским мета-полем в сессии, например, так:

add_action('woocommerce_order_status_cancelled', 'mark_cart_clear_needed');
function mark_cart_clear_needed($order_id) {
    $order = wc_get_order($order_id);
    $user_id = $order->get_user_id();
    if ($user_id) {
        update_user_meta($user_id, '_cart_clear_needed', 'yes');
    }
}

add_action('init', 'clear_cart_if_needed');
function clear_cart_if_needed() {
    if (!is_user_logged_in()) {
        return;
    }
    $user_id = get_current_user_id();
    $need_clear = get_user_meta($user_id, '_cart_clear_needed', true);
    if ($need_clear === 'yes') {
        WC()->cart->empty_cart();
        delete_user_meta($user_id, '_cart_clear_needed');
    }
}

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

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

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

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

Сравнение подходов очистки корзины после отмены заказа

МетодПлюсыМинусыПрименимость
Очистка сразу в хуке woocommerce_order_status_cancelledПростота реализацииРаботает только в сессии пользователя, не при админских измененияхЗалогиненные пользователи на сайте
Отметка в пользовательских мета + очистка при следующем посещенииНадёжно очищает корзину даже при смене статуса из админкиНужен дополнительный хуки и проверка при каждом визитеАвторизованные пользователи
JavaScript очистка корзины гостейРаботает для неавторизованных пользователейСложнее реализовать, требует интеграции с frontendГости сайта
Как удалить пустые категории и теги в WordPress из базы данных
25.11.2025
Как разделить длинный пост на страницы в WordPress: пошаговое руководство
05.04.2026
Как добавить автоматическое удаление старого контента в WordPress
22.03.2026
WooCommerce: как автоматически удалять отменённые и неактивные заказы
08.07.2026
Как сделать автоматический редирект с удалением WWW в WordPress
13.03.2026
×
-15%
на премиум плагин
Clearfy

Защитите сайт!

Включить Clearfy »