WooCommerce

Пустая корзина WooCommerce: почему 0 товаров на checkout

МаксимИнженер по WordPress · 10+ лет с WordPress и WooCommerce10 мин чтения71 просмотр

В шапке товар есть, на checkout — «0 позиций». Чаще виноваты кэш и сессия, не сам WooCommerce. Шесть причин по порядку — не «смените тему на другую».

В статье
  • Два разных случая — не путать
  • Причина 1. Кэш отдаёт чужую «пустую» корзину
  • Причина 2. Cookie и HTTPS (сессия не создаётся)
  • Причина 3. AJAX-фрагменты корзины (admin-ajax)

Нужна помощь — доработка WooCommerce.

Пустая корзина WooCommerce: почему 0 товаров на checkout

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

Два разных случая — не путать

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

Причина 1. Кэш отдаёт чужую «пустую» корзину

Исключения кэша для корзины WooCommerce
Cart, checkout и «Мой аккаунт» должны быть в исключениях кэша — иначе гость видит чужой ноль.

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 (сессия не создаётся)

Cookie сессии WooCommerce
Смешанный HTTP/HTTPS или www/без www — WooCommerce не держит сессию.

WooCommerce хранит корзину в сессии PHP + cookie. Если сайт открывают и по http://, и по https://, или адрес в настройках WordPress не совпадает с тем, что в браузере (www / без www) — cookie не приклеиваются, корзина «обнуляется» на каждом шаге.

Чек-лист:

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

Причина 3. AJAX-фрагменты корзины (admin-ajax)

AJAX фрагменты корзины WooCommerce
Запрос wc-ajax или admin-ajax должен возвращать HTML мини-корзины за доли секунды.

Обновление счётчика в шапке и мини-корзины идёт через 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
После обновления Elementor виджет корзины часто отстаёт от шорткода WooCommerce.

Корзина, сверстанная в 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.

Как искать:

  1. Staging + WP_DEBUG_LOG.
  2. Поиск по коду темы/дочерней: empty_cart, woocommerce_cart, session.
  3. Health Check → troubleshooting: отключить всё кроме WooCommerce — если корзина ожила, включать плагины пачками по 5.

Конфликт «кэш + лишние плагины» — в материале про аудит плагинов.

Причина 6. Object Cache / Redis без группы WooCommerce

Пустой checkout при работающей мини-корзине
На checkout «0 товаров» при живой сессии — часто Redis или другой object cache без корректной группы.

Redis Object Cache ускоряет сайт, но при неверной конфигурации сессии WooCommerce «залипают» или не синхронизируются между воркерами PHP-FPM. Признаки: случайная пустая корзина, пропадает только у части пользователей.

Решение — настройка по документации плагина (группа woocommerce, не кэшировать сессии агрессивно) или временное отключение object cache на проверку. На shared без Redis эта причина реже.

Чек-лист починки за вечер

  1. Инкognito: один товар → корзина → checkout. Зафиксировать, где именно «0».
  2. Исключения кэша для cart/checkout/account и wc-ajax.
  3. Сверить URL в настройках WordPress и cookie после добавления в корзину.
  4. Network: фрагменты корзины без 403/500.
  5. Сравнить страницу корзины Elementor vs. шорткод WooCommerce.
  6. Если не помогло — staging, отключение плагинов, просмотр логов и кастомных хуков.

Перед обновлением WooCommerce или темы — свежий бэкап (как выбрать). Письма после заказа проверьте отдельно — WooCommerce не шлёт письма. После релиза WordPress 7.0 — чек-лист обновления с пунктом про корзину и оплату.

Когда звать спеца

Если на staging с одним WooCommerce корзина работает, а на бою с полным набором плагинов — нет, нужен точечный разбор хуков и кэша (обычно 1–4 часа). Доработка WooCommerce или контакты — опишите проблему («мини-корзина / checkout / оба») и что меняли перед поломкой; оценка за 20 минут.

Поделиться: Telegram VK
Сложный случай?

Опишите ситуацию — поможем

Только WordPress. Если статья не закрыла вопрос — напишите, посмотрим конкретно ваш сайт.

Если есть — поможет быстрее оценить задачу.
Необязательно · до 10 МБ · PNG, JPG, PDF, ZIP
Удобный канал связи

URL сайта и краткое описание задачи. Чем больше деталей, тем точнее оценка.

Не передаём третьим лицам · Политика