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

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

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

Проверьте, существует ли проблема у вас, открыв в браузере консоль разработчика (F12) и вкладку Network. После оформления заказа убедитесь, что запросы на удаление сессий и очистку корзины выполняются. Если корзина не очищается, то запросы либо не отправляются, либо обработчик не срабатывает.

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

Шаг 1. Используем хук woocommerce_thankyou для очистки корзины

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

add_action('woocommerce_thankyou', 'custom_clear_cart_after_order', 20, 1);
function custom_clear_cart_after_order( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

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

    // Очистка корзины
    WC()->cart->empty_cart();

    // Очистка сессии пользователя
    if ( WC()->session ) {
        WC()->session->destroy_session();
    }
}

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

Шаг 2. Отключаем потенциально конфликтующие плагины и проверяем тему

Если после добавления кода проблема не исчезла, временно отключите все плагины, кроме WooCommerce, и переключитесь на стандартную тему (например, Storefront). Проверьте поведение корзины. Если очистка работает, значит проблема в конфликте. Включайте плагины и тему по одному, чтобы выявить виновника.

Шаг 3. Принудительно удаляем сессии на сервере

Если проблема связана с хранением старых сессий, можно использовать WP-Cron для периодической очистки сессий WooCommerce:

if ( ! wp_next_scheduled( 'custom_wc_cleanup_sessions' ) ) {
    wp_schedule_event( time(), 'hourly', 'custom_wc_cleanup_sessions' );
}

add_action( 'custom_wc_cleanup_sessions', 'custom_wc_cleanup_sessions_function' );
function custom_wc_cleanup_sessions_function() {
    global $wpdb;
    $session_lifetime = 48 * HOUR_IN_SECONDS; // 48 часов

    $time_limit = time() - $session_lifetime;

    $wpdb->query( $wpdb->prepare(
        "DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
        $time_limit
    ) );
}

Этот код добавляет задачу, которая раз в час удаляет устаревшие сессии, уменьшая нагрузку и предотвращая накопление мусора.

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

  • Оформите тестовый заказ на сайте.
  • После перехода на страницу «Спасибо за заказ» убедитесь, что корзина пуста (через интерфейс и в консоли браузера).
  • Проверьте таблицу wp_woocommerce_sessions в базе данных — записи для сессии должны обновляться или удаляться со временем.
  • Повторите тест с разными ролями пользователей и без авторизации.

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

  • Код очистки корзины не срабатывает: возможно, хук woocommerce_thankyou переопределён в теме или плагинах. Используйте отладку через error_log, чтобы проверить вызов функции.
  • Очистка сессий не происходит: убедитесь, что у вас включена стандартная сессия WooCommerce (WC()->session не равен null), иначе код очистки не выполнится.
  • Удаление сессий приводит к ошибкам в заказах: не удаляйте сессии сразу, делайте это с задержкой (например, только для сессий старше 48 часов).
  • Пользователи видят старую корзину после оформления заказа: проверьте кеширование страниц и отключите кеширование для страниц корзины и оформления заказа.

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

  • Не используйте принудительное удаление сессий в реальном времени — это может привести к потере данных. Лучше делать это с помощью WP-Cron с интервалом не чаще часа.
  • Включите Object Cache (например, Redis) для ускорения работы с сессиями WooCommerce. Можно настроить с помощью плагина Clearfy.
  • Отключите кеширование страниц корзины и оформления заказа в вашем плагине кеша или серверной конфигурации, чтобы избежать конфликтов с сессиями.
  • Регулярно проверяйте базу данных на предмет устаревших сессий и ревизий, чтобы поддерживать производительность.

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

МетодПлюсыМинусы
Хук woocommerce_thankyouПрост в реализации, срабатывает сразу после заказаМожет конфликтовать с темами/плагинами
WP-Cron для очистки сессийУдаляет устаревшие сессии, снижает нагрузкуНе удаляет сессии мгновенно, требует настроенного Cron
Отключение кеширования страниц корзины/чекаутаИзбегает отображения устаревших данныхМожет снизить производительность сайта
Как удалить метаданные из изображений в WordPress для ускорения сайта
03.02.2026
Как добавить фильтр по мета-полям в админке WordPress
01.03.2026
WooCommerce: как автоматически очищать корзину и сессии после оформления заказа
14.05.2026
Как добавить поддержку PHP в визуальный редактор WordPress
11.03.2026
Как защитить WordPress от bruteforce-атак: практические методы и примеры
24.01.2026