Статья A.S Groups

Cart Fragments WooCommerce: как убрать лишний admin-ajax и не сломать мини-корзину

Оптимизация WooCommerce Cart Fragments и admin-ajax для мини-корзины

Навигация по статье

Услуги A.S Groups

Нужен сайт, магазин или автоматизация?

Помогаю бизнесу запускать и дорабатывать WordPress-проекты: от посадочной страницы до WooCommerce, CRM и Telegram-уведомлений.

Обсудить проект Telegram
WordPress под ключ Лендинги, корпоративные сайты и структура под заявки. WooCommerce Интернет-магазины, каталог, оплата, доставка и интеграции. Доработка сайта Правки, скорость, формы, баги и развитие текущего проекта. CRM / Telegram / AI Автоматизация заявок, уведомлений и ручных процессов.

WooCommerce Cart Fragments — механизм классической мини-корзины, который обновляет её содержимое через AJAX без полной перезагрузки страницы. На старых магазинах именно запрос get_refreshed_fragments нередко оказывается среди самых частых обращений к admin-ajax.php.

Сам по себе Cart Fragments не является ошибкой. Проблема появляется, когда скрипт выполняется на страницах, где мини-корзина не используется, тема принудительно подключает его глобально или сервер не справляется с большим количеством динамических запросов.

Разберём, как работает wc-cart-fragments, что изменилось в современных версиях WooCommerce и как оптимизировать его без поломки корзины.

Что делает wc-cart-fragments

Классический Cart Fragments использует WordPress AJAX API для получения актуального HTML мини-корзины. Когда покупатель добавляет или удаляет товар, WooCommerce отправляет запрос и заменяет нужные фрагменты страницы свежими данными.

Официальная документация WooCommerce указывает несколько ситуаций, когда может выполняться обновление:

  • после событий wc_fragment_refresh или updated_wc_div;
  • после изменения корзины;
  • при восстановлении страницы из истории браузера;
  • периодически для давно открытой вкладки;
  • в отдельных сценариях WordPress Customizer.

Цель простая: пользователь должен видеть актуальное количество товаров и сумму даже на странице, которая сама по себе могла быть закэширована.

Почему get_refreshed_fragments создаёт нагрузку

Статическая страница хорошо обслуживается page cache или CDN. Но AJAX-запрос корзины персонализирован под сессию пользователя, поэтому его нельзя бездумно отдавать из общего кэша.

На посещаемом магазине это создаёт цепочку: браузер загружает страницу, JavaScript запускает обновление корзины, PHP поднимает WordPress и WooCommerce, читает сессию, формирует mini-cart и возвращает JSON.

Если такие запросы идут на каждой странице и от каждого посетителя, они могут заметно увеличивать PHP workers, CPU и обращения к базе. Особенно это видно на дешёвом shared-хостинге или при агрессивном бот-трафике.

Поэтому ускорение сайта нельзя сводить к установке кэширующего плагина. При оптимизации WordPress нужно смотреть реальные запросы, PHP-профиль и поведение корзины.

Что изменилось после WooCommerce 7.8

WooCommerce изменил глобальное подключение Cart Fragments начиная с версии 7.8. Скрипт больше не должен автоматически подключаться на каждом маршруте магазина только потому, что активен WooCommerce.

Теперь он в основном загружается, когда на странице действительно присутствует классический Cart Widget, когда сторонний скрипт объявил wc-cart-fragments зависимостью или когда тема/плагин подключает его вручную.

Это важный момент: если магазин работает на актуальной версии WooCommerce, а get_refreshed_fragments всё равно появляется абсолютно везде, сначала нужно найти кто именно возвращает глобальное подключение. Простое отключение скрипта маскирует причину.

Как проверить Cart Fragments в браузере

  1. Откройте сайт в приватном окне браузера.
  2. Запустите DevTools → Network.
  3. Отфильтруйте запросы по admin-ajax или fragment.
  4. Откройте обычную информационную страницу, где корзина не нужна.
  5. Повторите тест на каталоге, карточке товара и корзине.
  6. Добавьте товар и убедитесь, что mini-cart обновился.

Если запрос появляется только там, где работает классическая мини-корзина, это ожидаемое поведение. Если он идёт на каждой странице, проверьте тему, header builder, Elementor-виджеты и плагины корзины.

Не путайте Cart Fragments с Heartbeat API

Оба механизма могут обращаться к admin-ajax.php, но решают разные задачи. WordPress Heartbeat используется в админке для автосохранения, блокировки записей и фоновой синхронизации. Cart Fragments работает на фронтенде магазина и связан с корзиной.

Поэтому совет «отключить admin-ajax» технически неверен: это endpoint для разных функций. Нужно смотреть параметр action. Отдельно про Heartbeat разобрано в статье Heartbeat API WordPress и нагрузку admin-ajax.

Когда Cart Fragments можно ограничить

Если классическая мини-корзина нужна только на WooCommerce-страницах, выполнение fragments можно ограничить условно. В официальном developer guide WooCommerce приведён подход через фильтр woocommerce_get_script_data.

add_filter( 'woocommerce_get_script_data', function( $script_data, $handle ) {
    if ( 'wc-cart-fragments' === $handle ) {
        if ( is_woocommerce() || is_cart() || is_checkout() ) {
            return $script_data;
        }
        return null;
    }
    return $script_data;
}, 10, 2 );

Этот вариант не нужно копировать вслепую. Если mini-cart расположен в глобальном header и должен обновляться на блоге, лендинге или кастомной странице, ограничение приведёт к устаревшему количеству товаров.

Сначала определите реальные страницы, где нужна динамическая корзина, и только потом задавайте условия.

Почему полное dequeue может сломать магазин

В интернете часто советуют удалить wc-cart-fragments через wp_dequeue_script(). Это действительно убирает запросы, но цена может оказаться выше выигрыша.

После жёсткого отключения возможны симптомы:

  • счётчик корзины не меняется после Add to Cart;
  • сумма в header остаётся старой;
  • мини-корзина показывает товар после его удаления;
  • закэшированная страница отображает пустую корзину пользователю с товарами;
  • кастомная тема перестаёт реагировать на WooCommerce JS events.

Если магазин использует AJAX Add to Cart, обязательно проверяйте обновление header после каждого изменения.

Mini-Cart Block как современная альтернатива

WooCommerce рекомендует разработчикам переходить с классического Mini-Cart Widget на Mini-Cart Block. Блок использует более современный подход и не зависит от старого Cart Fragments API.

Для block theme переход обычно проще: mini-cart можно добавить в header через Site Editor. В classic theme возможны варианты через widget area или программную вставку блока, но нужно отдельно проверить стили и совместимость шаблона.

Переход особенно полезен, если старый header построен вокруг виджета, который вынуждает подключать fragments на всём сайте.

Page cache, CDN и мини-корзина

Основная причина существования динамического обновления — конфликт персональной корзины с общим page cache. Главная страница может быть одинаковой для тысяч посетителей, но корзина у каждого своя.

Нельзя просто закэшировать HTML mini-cart на CDN как общий фрагмент. Иначе один пользователь потенциально увидит состояние, которое не соответствует его сессии.

Безопасная архитектура разделяет:

  • общий HTML страницы — максимально кэшируемый;
  • персональные данные корзины — динамические;
  • cart и checkout — исключённые из полного page cache;
  • AJAX/Store API — не подменяемые общим HTML-кэшем.

Что проверить в теме и плагинах

Если fragments работает глобально, найдите регистрацию зависимости wc-cart-fragments в коде темы и активных плагинов. Отдельно проверьте header builder: визуально простой значок корзины может внутри использовать старый WooCommerce widget.

Также стоит проверить:

  • кастомный wp_enqueue_script;
  • плагины side cart и floating cart;
  • Elementor/WPBakery header templates;
  • старые child-theme overrides;
  • JS-код, вручную вызывающий wc_fragment_refresh;
  • зависимости собственных скриптов от wc-cart-fragments.

При доработке WooCommerce лучше убрать первопричину глобального подключения, чем накладывать ещё один сниппет поверх старого кода.

Как измерить эффект оптимизации

После изменений сравните не только PageSpeed. Cart Fragments — серверная динамика, поэтому важнее реальные показатели:

  • число запросов get_refreshed_fragments;
  • TTFB AJAX-ответа;
  • PHP CPU и количество занятых workers;
  • slow log PHP-FPM;
  • время SQL-запросов во время обновления корзины;
  • ошибки 429/502/504 под нагрузкой;
  • корректность mini-cart после add/remove.

Хорошая оптимизация уменьшает ненужные динамические запросы и при этом сохраняет пользовательскую функциональность.

Чек-лист безопасной оптимизации

  • обновите WooCommerce и проверьте поведение на staging;
  • найдите страницы, где реально загружается wc-cart-fragments;
  • определите, используется ли классический Mini-Cart Widget;
  • проверьте тему и плагины на ручную зависимость;
  • не отключайте весь admin-ajax.php;
  • если ограничиваете fragments — протестируйте все страницы с глобальным header;
  • рассмотрите Mini-Cart Block;
  • после изменений проверьте add/remove, cart, checkout и browser back;
  • сравните серверную нагрузку до и после.

Итог

wc-cart-fragments нужен классической мини-корзине WooCommerce для актуализации данных пользователя. В старых конфигурациях он действительно может создавать заметную нагрузку через admin-ajax.php, но современный WooCommerce уже не подключает его глобально без причины.

Поэтому правильная стратегия — не «выключить Cart Fragments», а выяснить, где и зачем он загружается, ограничить лишние сценарии и по возможности перейти на современный Mini-Cart Block.

Если магазин тормозит из-за AJAX, PHP workers или нестандартной корзины, A.S Groups может провести диагностику и точечную оптимизацию. Для оценки можно прислать ссылку на магазин и описание симптомов.

Следующий шаг

Нужно решить похожую задачу?

Предложить диагностику производительности WooCommerce и точечную оптимизацию cart fragments без отключения нужной функциональности.

Обсудить задачу

Источники

Обсуждение

Вопросы и комментарии

Можно уточнить детали статьи или поделиться своим опытом. Первый комментарий проходит проверку.

Оставить комментарий

Email не публикуется. Ссылки и HTML в тексте удаляются.

Мы используем приватную аналитику SlimStat, чтобы понимать, какие страницы полезны посетителям, и улучшать сайт. IP-адреса анонимизируются и хэшируются. Вы можете согласиться или отказаться от аналитики.
Cookies и конфиденциальность

Используем необходимые cookies, аналитику и данные форм, чтобы сайт работал корректно и заявки доходили.