Если на сайте WooCommerce в отчётах браузера или в Lighthouse всплывает запрос к wc-ajax=get_refreshed_fragments, это не всегда баг. Но на небольших и средних магазинах он часто становится лишней нагрузкой: запрос идёт почти на каждой странице, даже там, где корзина не нужна. В итоге страдает время ответа, а иногда ещё и кэширование страниц.
Ниже — рабочий сценарий: как отключить cart fragments там, где они не нужны, и не сломать корзину в тех местах, где она действительно используется.
Когда проблема действительно в cart fragments
Сначала стоит убедиться, что вы боретесь именно с этой причиной, а не с общим медленным хостингом или тяжёлой темой. Откройте DevTools → Network и обновите страницу. Если видите повторяющийся запрос к ?wc-ajax=get_refreshed_fragments, значит WooCommerce пытается синхронизировать мини-корзину через AJAX.
Типичные симптомы:
- на главной и в блоге есть запросы WooCommerce, хотя корзина там не используется;
- страницы хуже кэшируются из-за динамического фрагмента;
- в шапке есть иконка корзины, но она не меняется на страницах без покупки;
- после установки нескольких плагинов нагрузка на фронтенд выросла, а причина неочевидна.
Что именно делает cart fragments
WooCommerce использует скрипт wc-cart-fragments, чтобы обновлять мини-корзину и связанные элементы без перезагрузки страницы. Это удобно, когда корзина отображается в шапке на всём сайте. Но если мини-корзина не нужна на каждой странице, постоянный AJAX-запрос становится лишним.
Важно: не путайте отключение cart fragments с отключением AJAX в WooCommerce вообще. Здесь задача уже точнее — убрать только обновление фрагментов там, где оно не даёт пользы.
Как отключить cart fragments точечно
Самый безопасный вариант — не рубить скрипт глобально, а отключать его только на тех страницах, где мини-корзина не используется. Для этого удобно добавить код в дочернюю тему или в небольшой mu-plugin.
<?php
add_action( 'wp_enqueue_scripts', function () {
if ( ! function_exists( 'is_woocommerce' ) ) {
return;
}
$disable_on = array( 'is_front_page', 'is_home' );
foreach ( $disable_on as $condition ) {
if ( function_exists( $condition ) && $condition() ) {
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
break;
}
}
}, 20 );Этот пример отключает скрипт на главной и на странице записей. Логику можно расширить под свой сайт: например, убрать фрагменты на страницах блога, в справке, на лендингах и оставить их только в каталоге, корзине и оформлении заказа.
Если у вас мини-корзина встроена в шапку и должна обновляться на всех страницах, такой способ применять нельзя без проверки. В этом случае лучше искать другой источник нагрузки: часто это не сам WooCommerce, а тема или сторонний виджет корзины.
Альтернатива через фильтр
В некоторых сценариях удобнее отключить загрузку скрипта через фильтр WooCommerce. Это менее универсально, но иногда чище, если вы хотите управлять поведением без ручного dequeue.
<?php
add_filter( 'woocommerce_enqueue_cart_fragments', function( $enqueue ) {
if ( is_front_page() || is_home() ) {
return false;
}
return $enqueue;
} );Фильтр стоит применять только после проверки в вашей версии WooCommerce. Если он не срабатывает, не пытайтесь «додумать» несуществующий хук — лучше используйте вариант с wp_dequeue_script(), он предсказуемее.
Пошаговая настройка без поломки корзины
- Сделайте резервную копию файлов темы или подготовьте дочернюю тему.
- Проверьте, где именно отображается мини-корзина: в шапке, в сайдбаре, в мобильном меню.
- Определите страницы, где она не нужна: главная, блог, лендинги, служебные страницы.
- Добавьте код отключения только для этих шаблонов.
- Очистите кэш сайта, CDN и кэш браузера.
- Снова откройте страницу и проверьте Network.
Если сайт использует кэш-плагин, после изменения кода обязательно сбросьте кэш. Иначе вы можете смотреть на старую версию страницы и сделать неверный вывод, что ничего не изменилось.
Как проверить, что решение сработало
Проверка должна быть не «на глаз», а по факту.
- в DevTools → Network больше нет запроса
get_refreshed_fragmentsна отключённых страницах; - в исходном коде страницы отсутствует подключение
wc-cart-fragmentsтам, где вы его убрали; - мини-корзина продолжает работать на страницах, где она нужна;
- добавление товара в корзину не ломает переход в
/cart/и/checkout/; - кэш-плагин не помечает весь сайт как динамический из-за этого скрипта.
Если хотите проверить быстро, откройте страницу в режиме инкогнито и сравните список сетевых запросов до и после изменения. На кэшированных страницах разница обычно видна сразу.
Сравнение подходов
| Подход | Когда подходит | Компромисс |
|---|---|---|
| Отключить глобально | Мини-корзина нигде не нужна | Можно сломать UX в шапке и на страницах магазина |
| Отключить точечно | Корзина нужна только в каталоге и checkout | Нужно аккуратно выбрать условия |
| Оставить как есть | Мини-корзина критична на всех страницах | Сохраняется лишний AJAX-трафик |
Частые ошибки и как их исправить
Скрипт отключили, а запрос остался
Частая причина — код добавили не туда или условие не сработало. Проверьте, что код выполняется на фронтенде, а не только в админке. Ещё одна причина — другой плагин заново подключает тот же скрипт.
Сломалась мини-корзина в шапке
Значит, вы отключили cart fragments на странице, где шапка реально зависит от них. Верните скрипт для каталога, товара, корзины и оформления заказа, а отключайте только там, где корзина не используется.
После правки ничего не изменилось
Почти всегда виноват кэш: серверный, плагина, CDN или браузера. Очистите все уровни кэширования и повторите проверку в приватном окне.
Использовали готовый сниппет без проверки темы
Некоторые темы выводят мини-корзину нестандартно. Тогда точечное отключение скрипта может быть недостаточно: нужно проверить, не завязан ли шаблон шапки на AJAX-обновление счётчика товаров.
Что ещё стоит проверить для производительности
Если вы уже трогаете cart fragments, имеет смысл посмотреть и на соседние узкие места. Иногда запросы WooCommerce — только верхушка проблемы.
- не грузится ли на всех страницах тяжёлый виджет корзины из темы;
- не подключён ли лишний JS от плагина доставки или оплаты;
- не мешает ли кэш-плагин динамическим блокам в шапке;
- не дублируется ли мини-корзина в мобильном меню и в хедере одновременно.
Если нужен более широкий аудит WooCommerce-оптимизации, удобно сначала убрать лишние скрипты и только потом переходить к кэшированию и настройке шаблонов. В ряде проектов это даёт больший эффект, чем попытка «ускорить всё сразу».
Для магазинов на базе темы Bono или других WooCommerce-тем иногда полезно проверить, не добавляет ли сама тема отдельный AJAX-обновляемый блок корзины. В таких случаях правка только в WooCommerce не решает проблему полностью.