wpnotes.ru wordpress WP Notes

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

Если в WooCommerce товар добавляется в корзину, а потом исчезает после перехода на другую страницу, проблема обычно не в самом товаре и не в теме. Чаще всего ломается сессия корзины, конфликтует кэш, либо тема/плагин принудительно очищает корзину на определённом событии. Ниже — как быстро локализовать причину и что менять в первую очередь.

Когда это действительно проблема WooCommerce, а не браузера

Сценарий обычно выглядит так: пользователь добавил товар, открыл категорию, вернулся на главную или перешёл в блог — и корзина пустая. Если это происходит не у одного человека, а стабильно на одном и том же сайте, искать нужно в настройках кэша, сессиях WooCommerce и пользовательском коде.

Быстрая диагностика

  • Проверьте поведение в режиме инкогнито и в другом браузере.
  • Сравните работу на страницах без кэша и на страницах, которые кэшируются.
  • Посмотрите, не очищается ли корзина после входа в аккаунт, смены языка или перехода между доменом и поддоменом.
  • Отключите на время плагины оптимизации, минификации и кэширования.
  • Проверьте, не добавлен ли в тему или в functions.php код, который вызывает empty_cart() или меняет сессии WooCommerce.

Если корзина пропадает только у авторизованных пользователей, причина часто в конфликте с плагином кэширования или в неверной настройке cookie. Если проблема у всех, чаще виноват код темы, редиректы или агрессивный page cache.

Что именно ломает корзину WooCommerce

У WooCommerce корзина держится на сессии и cookie. Если страница отдается из кэша как статическая копия, а cookie пользователя не учитываются, сайт может показывать старое состояние корзины. Ещё один частый вариант — сторонний код очищает корзину при переходе на определённые страницы, например после добавления товара или при смене пользователя.

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

Пошаговое решение: что делать в правильном порядке

1. Исключите страницы WooCommerce из кэша

Минимум нужно исключить корзину, оформление заказа и страницу аккаунта. Если кэширует сервер, CDN или плагин, проверьте все уровни. Для большинства конфигураций достаточно, чтобы страницы /cart/, /checkout/ и /my-account/ не отдавались из общего кэша.

Если используете плагин кэширования, проверьте, что он уважает cookie WooCommerce. Обычно речь идёт о cookie вроде woocommerce_items_in_cart и wp_woocommerce_session_*. Не нужно вручную удалять их на каждом шаге — достаточно не кэшировать персонализированные страницы.

2. Проверьте, не очищает ли корзину кастомный код

Ищите в теме, дочерней теме и собственных плагинах вызовы empty_cart(), set_session(), wp_redirect() после добавления в корзину и обработчики на хуки WooCommerce. Иногда разработчик оставляет код для тестов, а потом забывает его убрать.

<?php
add_action( 'template_redirect', function () {
    if ( is_cart() && isset( $_GET['clear-cart'] ) ) {
        if ( function_exists( 'WC' ) && WC()->cart ) {
            WC()->cart->empty_cart();
        }
    }
} );

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

3. Сбросьте конфликтующие сессии и проверьте cookie

После изменения настроек кэша очистите все уровни кэша и удалите cookie сайта в браузере. Если проблема была в старой сессии, после этого поведение обычно меняется сразу. Если нет — идём дальше.

4. Проверьте редиректы между доменами

Если сайт открывается и с www, и без www, либо есть редирект между HTTP и HTTPS, корзина может теряться при переходе, если cookie настроены для одного варианта домена. Важно, чтобы основной домен был один, а все остальные варианты стабильно редиректились на него до загрузки WooCommerce-страниц.

Рабочий пример: не очищать корзину при обычной навигации

Если у вас есть кастомный код, который очищает корзину слишком агрессивно, лучше заменить его на явное действие по кнопке или параметру. Ниже пример безопаснее: корзина очищается только если пользователь явно открыл специальный URL с nonce.

<?php
add_action( 'template_redirect', function () {
    if ( ! function_exists( 'WC' ) || ! WC()->cart ) {
        return;
    }

    if ( empty( $_GET['clear-cart'] ) ) {
        return;
    }

    $nonce = isset( $_GET['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ) : '';

    if ( ! wp_verify_nonce( $nonce, 'clear_cart_action' ) ) {
        return;
    }

    WC()->cart->empty_cart();
} );

// Генерация ссылки для админки или личного кабинета.
$clear_url = wp_nonce_url( home_url( '/?clear-cart=1' ), 'clear_cart_action' );

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

Как проверить, что решение сработало

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

  • Добавьте товар в корзину и перейдите на главную, в каталог и в блог.
  • Обновите страницу корзины вручную.
  • Войдите в аккаунт и повторите тест.
  • Проверьте поведение в инкогнито и в обычном окне браузера.
  • Если есть кэш на сервере или CDN, убедитесь, что корзина не становится пустой после очистки кэша.

Дополнительно откройте инструменты разработчика и посмотрите, сохраняются ли cookie WooCommerce после добавления товара. Если cookie исчезают сразу после перехода, проблема почти наверняка в кэше, редиректе или стороннем скрипте.

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

Корзина очищается после установки плагина оптимизации

Некоторые плагины объединяют, откладывают или переписывают скрипты так, что WooCommerce теряет часть клиентской логики. Для проверки временно отключите оптимизацию JS и CSS, а потом включайте по одному параметру. Если после этого корзина перестала пропадать, оставьте исключения для скриптов WooCommerce.

Страницы WooCommerce попали под общий кэш

Это классическая причина. Корзина и оформление заказа должны быть исключены из кэширования. Если кэшируется HTML страницы корзины, пользователь может видеть чужое или устаревшее состояние.

Есть код, который вызывает очистку корзины на init или template_redirect

Такой код часто пишут без проверки контекста. Исправление простое: добавьте жёсткое условие, nonce или явный параметр, чтобы очистка происходила только по команде пользователя.

Сайт работает на нескольких доменах

Если магазин доступен и по основному домену, и по техническому адресу, cookie могут не совпадать. В результате корзина выглядит пустой после перехода. Решение — один канонический домен и корректный редирект на него.

Что можно улучшить дополнительно

Если проблема уже исправлена, имеет смысл проверить соседние настройки WooCommerce: кэш фрагментов корзины, исключения для страниц оформления и работу мини-корзины в шапке. Для магазинов с активной оптимизацией иногда полезно использовать инструменты, которые помогают чистить дубли и лишние скрипты без ручного вмешательства. Например, Clearfy Pro может быть уместен, если нужно аккуратно убрать лишние элементы и не сломать WooCommerce-логику: https://wpshop.ru/plugins/clearfy.

Но здесь важен принцип: сначала диагностируйте кэш и код, потом уже подключайте оптимизаторы. Иначе легко замаскировать причину, а не убрать её.

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

×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее