Если в 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. Это быстрее, чем пытаться лечить симптом наугад.