Если в WooCommerce кнопка «Добавить в корзину» срабатывает, но мини-корзина, счётчик товаров или содержимое корзины не меняются до полной перезагрузки страницы, почти всегда проблема не в самом WooCommerce. Чаще всего ломается связка между AJAX-запросом, кэшем страницы и скриптами темы или плагина оптимизации.
Ниже — рабочий порядок проверки: от быстрой диагностики до точечной правки кэша и шаблонов. Без общих советов вроде «очистите всё» — только то, что реально помогает локализовать проблему.
Как выглядит проблема на практике
Типичный сценарий такой: пользователь нажимает «В корзину», товар добавляется в WooCommerce, но:
- мини-корзина в шапке не меняет количество;
- иконка корзины не обновляет бейдж;
- страница категории показывает старое состояние корзины;
- после обновления страницы всё внезапно становится правильно.
Это особенно заметно на сайтах с полностраничным кэшем, CDN или агрессивной оптимизацией JS. WooCommerce использует AJAX и cookies сессии, а кэш может отдавать пользователю уже готовую HTML-страницу, где корзина «застыла» в старом состоянии.
Диагностика: что проверить до правок
1. Есть ли кэш именно на страницах магазина
Проверьте, кэшируются ли страницы каталога, карточки товара и корзины. Для WooCommerce обычно нельзя кэшировать /cart/, /checkout/ и /my-account/. Если эти страницы отдаются из кэша, проблемы с AJAX и сессиями почти гарантированы.
Если используется плагин кэширования, найдите в его настройках исключения по URL. Если кэш на уровне сервера или CDN, проверьте правила bypass cache для cookie WooCommerce.
2. Не ломает ли оптимизация JavaScript
Частая причина — отложенная загрузка или объединение скриптов. Скрипты WooCommerce, отвечающие за обновление корзины, могут загрузиться слишком поздно или не выполниться из-за ошибки в другом JS-файле.
Откройте консоль браузера и посмотрите на ошибки. Если есть ошибка в JavaScript, сначала исправляйте её, а не кэш.
3. Обновляются ли cookies WooCommerce
После добавления товара в корзину должны меняться cookies вроде woocommerce_items_in_cart и wp_woocommerce_session_*. Если они не меняются, запрос может блокироваться, скрипт не выполняется или ответ AJAX не доходит до браузера.
Проверить это можно в DevTools: вкладка Application или Storage, затем Cookies.
Пошаговое решение для кэшируемого сайта
Шаг 1. Исключите страницы корзины и оформления заказа из кэша
Это базовая настройка. Даже если мини-корзина работает через AJAX, сами страницы корзины и checkout должны быть динамическими.
Если вы настраиваете кэш вручную на сервере, логика должна быть примерно такой: не отдавать кэш для URL корзины, оформления заказа и личного кабинета, а также для пользователей с активной WooCommerce-сессией.
Шаг 2. Убедитесь, что WooCommerce-скрипты не отложены слишком агрессивно
Если плагин оптимизации умеет откладывать JS, добавьте в исключения скрипты WooCommerce и скрипты темы, которые обновляют мини-корзину. В зависимости от сборки это могут быть wc-cart-fragments, woocommerce, wc-add-to-cart.
Не нужно отключать всю оптимизацию. Обычно достаточно исключить только проблемные файлы.
Шаг 3. Проверьте, не используется ли устаревший механизм fragments без необходимости
На некоторых сайтах мини-корзина завязана на wc-cart-fragments. Если тема или плагин выводит корзину в шапке, но обновление fragments ломается кэшем, можно либо корректно настроить исключения, либо перевести шапку на более предсказуемый шаблонный вывод.
Если вы не уверены, сначала проверьте, действительно ли проблема в fragments. Не отключайте этот скрипт «наугад» — можно сломать обновление корзины в шапке.
Шаг 4. Добавьте серверное исключение для страниц WooCommerce
Если у вас есть доступ к конфигу кэша или к серверной логике, полезно исключать страницы WooCommerce по cookies. Для Nginx, Varnish или CDN это делается по-разному, но принцип один: если есть активная сессия корзины, страница не должна кэшироваться как обычная публичная.
На уровне WordPress можно хотя бы пометить страницы WooCommerce как некэшируемые для некоторых сценариев. Например, если у вас кастомный кэш-плагин или собственная логика, используйте фильтр woocommerce_cart_hash_key только если понимаете, зачем меняете поведение корзины. Для большинства задач достаточно правильных исключений кэша, а не вмешательства в хэш корзины.
Пример: исключаем WooCommerce-страницы из кэша в коде
Если вы пишете собственную интеграцию кэша или хотите добавить дополнительный заголовок для страниц магазина, можно использовать проверку на WooCommerce-страницы и активную корзину.
<?php
add_action('template_redirect', function () {
if (function_exists('is_woocommerce') && (is_cart() || is_checkout() || is_account_page())) {
if (!defined('DONOTCACHEPAGE')) {
define('DONOTCACHEPAGE', true);
}
}
});
Этот код не «чинит» кэш сам по себе, но помогает совместимым решениям понять, что страницу нельзя сохранять как статическую. Используйте его только если ваш стек кэширования учитывает константу DONOTCACHEPAGE.
Пример: безопасно обновляем мини-корзину после AJAX
Если проблема в том, что тема не перерисовывает мини-корзину после добавления товара, можно подписаться на стандартные события WooCommerce и обновить нужный блок вручную.
<script>
jQuery(function($) {
$(document.body).on('added_to_cart removed_from_cart', function() {
$(document.body).trigger('wc_fragment_refresh');
});
});
</script>
Это не замена нормальной настройке кэша, а способ восстановить обновление фрагментов, если тема не делает этого сама. Если после этого мини-корзина всё равно не меняется, ищите ошибку в JS или конфликт с оптимизацией.
Что проверить после внедрения
Проверка должна быть не «на глаз», а по конкретным признакам:
- добавьте товар в корзину на странице каталога;
- убедитесь, что бейдж корзины меняется без полной перезагрузки;
- откройте DevTools и проверьте, что запросы WooCommerce проходят без 4xx/5xx;
- посмотрите cookies: должны обновляться значения, связанные с корзиной и сессией;
- перейдите на страницу корзины и убедитесь, что она не отдается из кэша.
Если есть CDN, проверьте ответ заголовков. Для динамических страниц не должно быть признаков публичного кэша там, где он мешает работе корзины.
Сравнение подходов: плагин, код или настройка сервера
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Настройка плагина кэша | Если проблема в обычном page cache | Быстро, без правки темы | Не всегда решает конфликт JS |
| Код в теме или mu-plugin | Если нужно точечно отключить кэш или обновить fragments | Контроль над логикой | Нужна аккуратность и тестирование |
| Правка сервера/CDN | Если кэшируется на уровне Nginx, Varnish или Cloudflare | Решает корень проблемы | Требует доступа и понимания инфраструктуры |
Частые ошибки и как их исправить
Кэш очищен, но проблема осталась
Значит, дело не только в кеше страницы. Проверьте JS-ошибки, отложенную загрузку скриптов и исключения для WooCommerce-файлов.
Отключили все оптимизации, и корзина заработала
Это хороший тест, но плохое постоянное решение. Включайте оптимизацию обратно по одной опции и найдите конкретный конфликтующий параметр: defer, delay JS, combine JS или lazy load скриптов.
Исключили только /cart/, а мини-корзина всё равно не обновляется
Мини-корзина живёт на обычных страницах каталога и товара, а не только на корзине. Если кэшируется шапка или fragments не выполняются, проблема останется.
Скрипт обновления fragments добавили, но он не срабатывает
Проверьте, что jQuery загружен, нет ошибок в консоли и ваш код выполняется после подключения WooCommerce-скриптов. Для темы лучше подключать такой код через wp_enqueue_script, а не вставлять в шаблон хаотично.
Практические советы по безопасности и производительности
Не отключайте кэш для всего сайта только ради корзины. Для WooCommerce это почти всегда лишняя потеря производительности. Лучше:
- исключить только динамические страницы;
- не кэшировать пользователей с активной корзиной;
- не объединять и не откладывать критичные WooCommerce-скрипты без проверки;
- следить за ошибками в консоли после обновления темы или плагинов;
- тестировать изменения в режиме инкогнито и с чистыми cookies.
Если вам нужно быстро убрать типовые проблемы с дублями, мусором и лишними запросами в WordPress, иногда проще начать с аккуратной оптимизации через Clearfy Pro: https://wpshop.ru/plugins/clearfy?utm_source=wptemp.ru&utm_medium=article&utm_campaign=woocommerce-ajax-korzina-kesh-problema. Но даже в этом случае логику WooCommerce-кэша всё равно нужно проверять вручную.
В рабочем проекте лучший результат обычно даёт не один «магический» переключатель, а связка из трёх вещей: корректные исключения кэша, чистые JS-исключения и проверка cookies/запросов в браузере. Тогда корзина перестаёт зависеть от случайного поведения темы и начинает обновляться предсказуемо.