Если корзина в WooCommerce ведёт себя нестабильно после обновления страницы, проблема обычно не в самом браузере. Чаще всего ломается сохранение сессии, конфликтует кэш, некорректно настроены cookie или тема/плагин вмешиваются в работу AJAX и fragments. В итоге пользователь добавляет товар, обновляет страницу — и видит пустую корзину либо старое состояние.
Ниже разберём, как быстро локализовать причину и что делать, если корзина сбрасывается именно при обновлении страницы, а не при переходе на другой шаг оформления.
Как выглядит проблема на практике
Типичный сценарий такой: товар добавляется в корзину, мини-корзина обновляется, но после F5 или перехода по внутренней ссылке количество товаров пропадает. Иногда проблема проявляется только у гостей, а у авторизованных пользователей корзина работает нормально. Это важная подсказка: в таком случае чаще всего виноваты cookie, кэширование или настройка домена/HTTPS.
Что проверить в первую очередь
- Сохраняется ли корзина у авторизованного пользователя и у гостя одинаково.
- Не включён ли кэш для страниц
/cart/,/checkout/и страниц с корзиной в шапке. - Совпадает ли домен сайта в
Настройки → Общиес фактическим адресом в браузере. - Нет ли редиректов между
httpиhttps, а также междуwwwи безwww. - Не ломает ли тему вывод мини-корзины через устаревшие шаблоны WooCommerce.
Диагностика: где именно теряется корзина
Начинать лучше не с кода, а с проверки сессии и cookie. WooCommerce хранит состояние корзины через свои cookie и сессионные данные. Если браузер не получает или не отправляет нужные cookie, корзина будет вести себя как новая после каждого обновления.
Откройте DevTools в браузере и проверьте:
- есть ли cookie WooCommerce после добавления товара;
- не блокируются ли они политикой
SameSiteили сторонним скриптом; - не меняется ли домен страницы между действиями;
- не подставляет ли кэш старую HTML-версию мини-корзины.
Если у вас включён серверный или плагинный кэш, временно исключите из него корзину, оформление заказа и страницу аккаунта. Для теста полезно также открыть сайт в приватном окне и без расширений браузера.
Пошаговое решение без лишних рисков
1. Исключите корзину и оформление заказа из кэша
Это базовый шаг. Страницы корзины и оформления заказа не должны отдаваться как статический HTML из кэша, иначе пользователь будет видеть устаревшее состояние. Если кэшируется мини-корзина в хедере, её тоже нужно исключить или перевести на корректное обновление fragments.
Если используете серверный кэш, проверьте правила исключений на уровне плагина, Nginx, Varnish или CDN. Для Cloudflare и похожих сервисов важно не только исключить URL, но и убедиться, что не кэшируются ответы с cookie WooCommerce.
2. Проверьте домен, HTTPS и cookie path
Частая причина сброса корзины — сайт открывается то с www, то без него, либо часть запросов уходит по http. Для WooCommerce это разные контексты cookie. В Настройки → Общие адрес WordPress и адрес сайта должны совпадать с реальным каноническим адресом.
Если сайт уже переведён на HTTPS, убедитесь, что не осталось смешанного контента и старых редиректов в .htaccess или конфиге сервера.
3. Сбросьте сессии WooCommerce после исправлений
После изменения домена, HTTPS или cookie-политики старые сессии могут мешать тесту. В админке WooCommerce есть инструменты состояния, где можно очистить временные данные и сессии. Это не лечит причину, но помогает проверить, что проблема не в старом мусоре.
4. Уберите конфликтующий код темы или плагина
Иногда корзину ломает кастомный код, который вмешивается в woocommerce_add_to_cart_fragments, woocommerce_before_calculate_totals или в шаблоны мини-корзины. Если после обновления страницы пропадает только виджет корзины, а сама корзина в /cart/ сохраняется, проблема почти наверняка в fragments или шаблоне темы.
Для быстрой проверки временно переключитесь на стандартную тему и отключите плагины, которые меняют корзину, оформление заказа, кэш или оптимизацию JS.
Рабочий пример: принудительно обновить fragments корзины
Если мини-корзина в шапке показывает старое состояние после обновления, можно проверить, не ломается ли обновление fragments. Ниже пример, который добавляет в fragments актуальное количество товаров и HTML корзины. Код не решает проблемы кэша сам по себе, но помогает исключить ошибку в теме.
add_filter( 'woocommerce_add_to_cart_fragments', function( $fragments ) {
ob_start();
?>
<span class="header-cart-count"><?php echo WC()->cart ? WC()->cart->get_cart_contents_count() : 0; ?></span>
<?php
$fragments['span.header-cart-count'] = ob_get_clean();
ob_start();
woocommerce_mini_cart();
$fragments['div.widget_shopping_cart_content'] = ob_get_clean();
return $fragments;
} );Если после этого счётчик и мини-корзина начинают обновляться корректно, значит проблема была в шаблоне или в том, как тема выводила корзину. Если же состояние всё равно сбрасывается после F5, ищите причину в кэше, cookie или сессии.
Когда нужен более жёсткий контроль сессии
Иногда корзина сбрасывается из-за того, что WooCommerce не успевает корректно создать сессию для гостя. Это бывает на нестабильных конфигурациях, при агрессивной оптимизации JS или при вмешательстве в cookie. В таких случаях полезно проверить, создаётся ли сессионная cookie на первом действии пользователя.
add_action( 'wp_loaded', function() {
if ( function_exists( 'WC' ) && WC()->session ) {
WC()->session->set_customer_session_cookie( true );
}
} );Использовать такой код стоит осторожно и только после диагностики. Он не заменяет нормальную настройку кэша и домена, а лишь помогает убедиться, что сессия создаётся вовремя. Если проблема вызвана сторонним кэшем, этот приём не должен быть основным решением.
Сравнение подходов
| Подход | Когда уместен | Минус |
|---|---|---|
| Исключить корзину из кэша | Корзина сбрасывается после F5 у гостей | Нужно правильно настроить исключения на всех уровнях |
| Исправить домен и HTTPS | Есть переходы между www/non-www или http/https | Может потребоваться очистка старых сессий |
| Починить fragments в теме | Мини-корзина показывает старые данные | Не решает проблемы с серверным кэшем |
Проверка результата после внедрения
После правок не ограничивайтесь одним тестом. Проверьте корзину в нескольких сценариях:
- гость добавляет товар, обновляет страницу и видит тот же состав корзины;
- авторизованный пользователь делает то же самое;
- корзина сохраняется после перехода между страницами и возврата назад;
- мини-корзина и страница
/cart/показывают одинаковые данные; - в DevTools cookie WooCommerce не исчезают после F5.
Если используете CDN, повторите тест с отключённым кэшем на стороне CDN или в режиме обхода кэша. Иначе можно ошибочно решить, что всё исправлено, хотя на продакшене проблема останется.
Частые ошибки и как их исправить
Кэш исключили только для /cart/, но забыли про мини-корзину
Это частая причина ложного успеха. Страница корзины работает, а иконка в шапке всё равно показывает старое значение. Нужно проверять не только URL, но и HTML-фрагменты, которые подставляются в шапке через AJAX.
Сайт открывается по разным адресам
Если часть ссылок ведёт на www, а часть — без него, WooCommerce может считать это разными контекстами. Исправляется единым каноническим адресом сайта и проверкой редиректов на уровне сервера.
Оптимизатор JS ломает fragments
Некоторые плагины объединяют или откладывают скрипты так, что wc-cart-fragments не отрабатывает вовремя. В таком случае нужно исключить скрипты WooCommerce из отложенной загрузки и проверить, не отключён ли AJAX-обновитель мини-корзины.
Старая тема переопределяет шаблоны WooCommerce
Если тема содержит устаревшие копии шаблонов из woocommerce/, они могут конфликтовать с текущей версией плагина. Сначала сравните переопределённые шаблоны с актуальными файлами WooCommerce, затем обновите или уберите лишние копии.
Что делать, если проблема проявляется только у части пользователей
Если корзина сбрасывается не у всех, а только у некоторых посетителей, смотрите на региональные CDN-правила, блокировщики рекламы, корпоративные прокси и браузерные настройки cookie. В таких случаях полезно собрать минимальный набор логов: какой URL открыт, какие cookie установлены, какой ответ отдаёт сервер на /cart/ и не меняется ли домен в цепочке редиректов.
Для магазинов с высокой нагрузкой лучше не пытаться лечить это «ускорителями» наугад. Сначала убедитесь, что WooCommerce-страницы исключены из кэша, а потом уже оптимизируйте остальной фронтенд. Если нужен общий аудит лишних дублей, кэша и мусорных скриптов, здесь может помочь Clearfy Pro, но только как инструмент для чистки и контроля, а не как замена нормальной настройки WooCommerce.
Короткий чек-лист перед релизом
- Корзина и оформление заказа исключены из кэша.
- Единый домен и HTTPS настроены без смешанных редиректов.
- Мини-корзина обновляется через актуальные fragments.
- Сторонние плагины оптимизации не ломают
wc-cart-fragments. - После очистки сессий корзина сохраняется у гостя и у авторизованного пользователя.
Если все пункты закрыты, а корзина всё равно сбрасывается после обновления страницы, проблема уже не типовая. Тогда стоит смотреть серверные логи, цепочку редиректов и конкретные плагины, которые вмешиваются в cookie или AJAX-запросы WooCommerce.