Товар в мини-корзине есть, на странице оформления — «0 позиций» и пустой список. Или «Добавить в корзину» срабатывает, счётчик в шапке не меняется. В практике на Flatsome, Elementor и кастомных темах это чаще сессия, кэш или фрагменты корзины, чем «сломался WooCommerce». Ниже — шесть причин по частоте и чек-лист за вечер.
Два разных случая — не путать

- Мини-корзина полная, checkout пустой — типично после обновления темы, кастомного хука на
woocommerce_cart_itemили другого шаблона checkout (кейс в портфолио: Flatsome + YITH, починка за 1,5 часа). - Нигде не копится — «Добавить в корзину» без ошибки, но количество 0 — сессия, cookie, кэш страницы или AJAX-фрагменты.
- Тормозит, но не пустая — это другой интент, см. медленный WooCommerce.
Причина 1. Кэш отдаёт чужую «пустую» корзину

WP Rocket, LiteSpeed Cache, W3 Total Cache, встроенный кэш Beget/Timeweb — если в кэш попадает /cart/, /checkout/ или /my-account/, гость видит сохранённую пустую страницу. Мини-корзина в шапке может обновляться по AJAX, а checkout — из кэша: отсюда классика «в шапке 2 товара, на оформлении 0».
Что сделать:
- Исключить из полного кэша: корзину, checkout, account,
wc-ajax=*,add-to-cart(точные пути зависят от ЧПУ — сверить в настройках WooCommerce → Дополнительно). - Отключить кэш для cookie
woocommerce_items_in_cart/wp_woocommerce_session_*— в LiteSpeed и WP Rocket это отдельная галочка. - Проверить в режиме инкognito: добавить товар → сразу открыть checkout без промежуточных вкладок.
Если после очистки кэша всё ожило — не включайте агрессивный «кэшировать всё» ради PageSpeed: сломаете магазин снова.
Причина 2. Cookie и HTTPS (сессия не создаётся)

WooCommerce хранит корзину в сессии PHP + cookie. Если сайт открывают и по http://, и по https://, или адрес в настройках WordPress не совпадает с тем, что в браузере (www / без www) — cookie не приклеиваются, корзина «обнуляется» на каждом шаге.
Чек-лист:
- Настройки → Общие: адреса WordPress и сайта — одинаковые, с
https://, тот же хост, что в браузере. - 301 с http на https и с лишнего зеркала (www ↔ без www) — одно правило на весь сайт.
- В DevTools → Application → Cookies: после «Добавить в корзину» есть
woocommerce_items_in_cart=1(имена могут отличаться при кастомном префиксе). - Не блокировать cookie расширениями «анти-трекер» при тесте — иначе ошибочный вывод.
Причина 3. AJAX-фрагменты корзины (admin-ajax)

Обновление счётчика в шапке и мини-корзины идёт через wc-ajax=get_refreshed_fragments или legacy admin-ajax.php?action=woocommerce_get_refreshed_fragments. Плагин безопасности, старый кэш, «оптимизатор» или конфликт с Elementor может резать или замедлять этот запрос — кнопка «сработала», визуально пусто.
Проверка: DevTools → Network → добавить товар → найти wc-ajax или admin-ajax. Ответ 200 с HTML фрагментов — норма. 403, 500, таймаут 30+ сек — искать виновника (отключать security/оптимизаторы по одному на staging).
На shared-хостинге иногда помогает отключение «объединения JS» для файлов WooCommerce в настройках кэша — скрипт cart-fragments должен выполниться после добавления товара.
Причина 4. Elementor / кастомный виджет корзины

Корзина, сверстанная в Elementor, не всегда подписана на те же хуки, что стандартный шорткод [woocommerce_cart]. После обновления Elementor Pro или темы виджет может показывать статичную вёрстку без привязки к сессии.
- Сравнить: стандартная страница корзины WooCommerce (назначена в настройках магазина) vs. страница, собранная в Elementor.
- Временно подставить шорткод
[woocommerce_cart]на тестовой странице — если там товары есть, проблема в виджете/шаблоне, не в данных. - Проверить, не дублируется ли страница checkout (старый шорткод + новый block checkout) — два URL с разным поведением путают и клиентов, и поддержку.
Разбор ускорения Elementor без поломки корзины — отдельная статья.
Причина 5. Кастомный код и приоритет хуков
Типичный сценарий из практики: в functions.php или mu-plugin висит фильтр на woocommerce_cart_item_quantity, woocommerce_add_to_cart или сброс корзины при смене валюты/языка. После обновления темы приоритет хука (10 → 20) меняется — корзина обнуляется только на checkout.
Как искать:
- Staging +
WP_DEBUG_LOG. - Поиск по коду темы/дочерней:
empty_cart,woocommerce_cart,session. - Health Check → troubleshooting: отключить всё кроме WooCommerce — если корзина ожила, включать плагины пачками по 5.
Конфликт «кэш + лишние плагины» — в материале про аудит плагинов.
Причина 6. Object Cache / Redis без группы WooCommerce

Redis Object Cache ускоряет сайт, но при неверной конфигурации сессии WooCommerce «залипают» или не синхронизируются между воркерами PHP-FPM. Признаки: случайная пустая корзина, пропадает только у части пользователей.
Решение — настройка по документации плагина (группа woocommerce, не кэшировать сессии агрессивно) или временное отключение object cache на проверку. На shared без Redis эта причина реже.
Чек-лист починки за вечер
- Инкognito: один товар → корзина → checkout. Зафиксировать, где именно «0».
- Исключения кэша для cart/checkout/account и wc-ajax.
- Сверить URL в настройках WordPress и cookie после добавления в корзину.
- Network: фрагменты корзины без 403/500.
- Сравнить страницу корзины Elementor vs. шорткод WooCommerce.
- Если не помогло — staging, отключение плагинов, просмотр логов и кастомных хуков.
Перед обновлением WooCommerce или темы — свежий бэкап (как выбрать). Письма после заказа проверьте отдельно — WooCommerce не шлёт письма. После релиза WordPress 7.0 — чек-лист обновления с пунктом про корзину и оплату.
Когда звать спеца
Если на staging с одним WooCommerce корзина работает, а на бою с полным набором плагинов — нет, нужен точечный разбор хуков и кэша (обычно 1–4 часа). Доработка WooCommerce или контакты — опишите проблему («мини-корзина / checkout / оба») и что меняли перед поломкой; оценка за 20 минут.



