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

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

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

Проблема особенно актуальна для магазинов с гостевыми заказами или при использовании кэширования страниц, где данные корзины могут некорректно обновляться.

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

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

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

1. Добавляем код для очистки корзины при завершении заказа

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

add_action('woocommerce_thankyou', 'clear_cart_after_checkout', 10, 1);
function clear_cart_after_checkout($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Проверяем, что заказ оплачен
    if ($order->is_paid()) {
        WC()->cart->empty_cart();
    }
}

Этот хук срабатывает на странице благодарности после оформления заказа. Мы проверяем, что заказ оплачен, и вызываем метод empty_cart() для очистки корзины.

2. Исправляем очистку корзины для случаев с кэшированием

Если на сайте используется кэширование (например, плагин WP Rocket, LiteSpeed Cache или серверное кэширование), данные корзины могут не обновляться сразу. Чтобы избежать этого, добавьте заголовки, запрещающие кэширование для страниц корзины и оплаты:

function disable_cache_for_cart_and_checkout() {
    if (is_cart() || is_checkout()) {
        nocache_headers();
    }
}
add_action('template_redirect', 'disable_cache_for_cart_and_checkout');

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

Иногда у гостей корзина хранится в сессии, и очистка в момент woocommerce_thankyou не работает корректно. В этом случае можно добавить дополнительное удаление через JavaScript на странице благодарности:

add_action('woocommerce_thankyou', 'clear_cart_js_script');
function clear_cart_js_script() {
    if (WC()->cart->is_empty()) return;
    ?>
    <script type="text/javascript">
        fetch('<?php echo admin_url('admin-ajax.php'); ?>?action=clear_cart_ajax', {method: 'POST'}).then(() => {
            console.log('Cart cleared');
        });
    </script>
    <?php
}

add_action('wp_ajax_clear_cart_ajax', 'clear_cart_ajax_callback');
add_action('wp_ajax_nopriv_clear_cart_ajax', 'clear_cart_ajax_callback');
function clear_cart_ajax_callback() {
    WC()->cart->empty_cart();
    wp_die();
}

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

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

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

  • Корзина не очищается из-за кэширования страниц: убедитесь, что для страниц корзины и оплаты отключено кэширование, либо используйте фрагменты AJAX для динамического обновления.
  • Код добавлен в неправильное место: добавляйте код в functions.php дочерней темы или в отдельный плагин, чтобы избежать потери при обновлении темы.
  • Метод empty_cart() не вызывается: проверьте, что объект WC()->cart доступен — иногда хук woocommerce_thankyou срабатывает до инициализации корзины, тогда используйте хуки, связанные с сессией или AJAX.
  • Очистка корзины мешает плагинам оплаты или подпискам: протестируйте на тестовой среде и при необходимости исключайте очистку для определённых типов заказов.

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

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

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

МетодПреимуществаНедостатки
Хук woocommerce_thankyou + empty_cart()Простота, срабатывает сразу после оплатыНе всегда работает при кэшировании; иногда корзина не инициализирована
Отключение кэширования страниц корзины и оплатыОбеспечивает актуальность данныхУвеличивает нагрузку на сервер, особенно при большом трафике
AJAX-запрос для очистки корзины на странице благодарностиРаботает для гостевых пользователей, обходит проблемы с кэшированиемНужна дополнительная реализация, зависит от JavaScript
Автоматический импорт данных из Excel в WordPress
06.12.2025
Как удалить автоматические повторяющиеся посты в WordPress
27.03.2026
Как удалить и заблокировать IP-адреса в WordPress
11.02.2026
Как создать собственный виджет WordPress своими руками
20.11.2025
Как настроить автоматический редирект в WordPress при изменении URL
18.02.2026