На небольших магазинах WooCommerce проблема часто выглядит одинаково: главная страница и карточки товаров открываются нормально, но в отчёте по производительности постоянно всплывает лишний AJAX-запрос ?wc-ajax=get_refreshed_fragments. Он нужен для синхронизации мини-корзины и некоторых тем, но на части проектов именно он даёт лишнюю нагрузку на сервер и добавляет задержку на фронтенде.
Полностью рубить этот механизм вслепую не стоит. Сначала нужно понять, действительно ли запрос нужен вашему шаблону, мини-корзине и сторонним плагинам. Если нет — его можно отключить точечно и оставить обновление корзины там, где оно реально используется.
Когда cart fragments становятся проблемой
Запрос get_refreshed_fragments обычно срабатывает на каждой загрузке страницы, если WooCommerce считает, что на сайте есть мини-корзина или виджет, который должен обновляться без перезагрузки. На практике это заметно в трёх сценариях:
- в теме есть мини-корзина в шапке, но она не используется на всех страницах;
- магазин работает на кэше, а AJAX-запрос всё равно идёт мимо него;
- сторонний плагин или кастомный скрипт держит фрагменты включёнными даже там, где они не нужны.
Если открыть DevTools → Network и обновить страницу, запрос обычно видно отдельно. Дополнительно его можно поймать в логах сервера или в профилировщике, если он создаёт заметную долю обращений.
Что именно проверять в первую очередь
Перед изменениями проверьте, где используется мини-корзина и есть ли на сайте элементы, которые завязаны на фрагменты WooCommerce. Если в шапке стоит иконка корзины с количеством товаров, а тема обновляет её через AJAX, отключение без замены сломает интерфейс. Если же мини-корзины нет, а запрос всё равно выполняется, это хороший кандидат на отключение.
- есть ли мини-корзина в шапке;
- обновляется ли счётчик товаров без перезагрузки;
- использует ли тема или плагин скрипт
wc-cart-fragments; - есть ли жалобы на лишнюю нагрузку от AJAX в мониторинге.
Диагностика: как понять, что запрос можно отключить
Самый практичный способ — посмотреть, подключён ли скрипт wc-cart-fragments на страницах, где он не нужен. Для этого достаточно открыть исходный код страницы или использовать вкладку Network/Performance в браузере. Если запрос идёт на каждой странице, а мини-корзина отсутствует, отключение обычно безопасно.
Ещё один полезный тест — временно переключиться на стандартную тему WooCommerce или на базовую тему WordPress и проверить, остаётся ли запрос. Если он исчезает, значит источник почти наверняка в теме или кастомной интеграции. Если остаётся, ищите плагин, который принудительно держит фрагменты активными.
Пошаговое решение без поломки корзины
Есть два рабочих подхода: отключить фрагменты полностью или отключить только загрузку скрипта на страницах, где он не нужен. Второй вариант безопаснее для магазина с мини-корзиной в шапке.
Вариант 1. Отключить cart fragments на всём сайте
Этот способ подходит, если у вас нет мини-корзины, а счётчик товаров не должен обновляться без перезагрузки. Код можно добавить в functions.php дочерней темы или в небольшой mu-plugin.
add_action( 'wp_enqueue_scripts', function () {
if ( function_exists( 'is_woocommerce' ) ) {
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
}
}, 100 );После этого WooCommerce перестанет подгружать скрипт, который инициирует обновление фрагментов. Но если тема или плагин напрямую ждут этот скрипт, часть интерфейса может перестать обновляться динамически.
Вариант 2. Отключить только на не-торговых страницах
Если мини-корзина нужна только на страницах магазина, лучше оставить её там и убрать лишний AJAX на остальном сайте. Это компромисс, который обычно не ломает UX.
add_action( 'wp_enqueue_scripts', function () {
if ( ! function_exists( 'is_woocommerce' ) ) {
return;
}
$need_cart_fragments = is_cart() || is_checkout() || is_shop() || is_product() || is_product_category() || is_product_tag();
if ( ! $need_cart_fragments ) {
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
}
}, 100 );Логика здесь простая: на страницах корзины, оформления заказа и каталога фрагменты остаются, а на обычных страницах сайта — нет. Если у вас мини-корзина есть в шапке на всём сайте, этот вариант нужно тестировать особенно внимательно.
Вариант 3. Спрятать запрос через фильтр WooCommerce
В некоторых случаях удобнее использовать фильтр woocommerce_cart_fragments_enabled. Он отключает механизм на уровне WooCommerce, а не только через dequeue скрипта.
add_filter( 'woocommerce_cart_fragments_enabled', function( $enabled ) {
if ( is_admin() ) {
return $enabled;
}
if ( function_exists( 'is_cart' ) && ( is_cart() || is_checkout() ) ) {
return $enabled;
}
return false;
} );Этот вариант стоит применять аккуратно: он влияет на логику WooCommerce шире, чем просто удаление одного скрипта. Если тема использует фрагменты для обновления мини-корзины, проверьте её поведение после изменения.
Сравнение подходов
| Подход | Когда использовать | Риск |
|---|---|---|
| Полное отключение скрипта | Мини-корзины нет, динамическое обновление не нужно | Может сломать счётчик корзины в теме |
| Отключение на части страниц | Корзина нужна только в магазине | Нужно проверить шапку и виджеты |
Фильтр woocommerce_cart_fragments_enabled | Нужен более системный контроль | Сильнее влияет на поведение WooCommerce |
Проверка результата после внедрения
После правки не ограничивайтесь визуальной проверкой корзины. Нужно убедиться, что запрос действительно исчез или перестал выполняться там, где вы его отключали.
- откройте DevTools → Network и обновите страницу;
- проверьте, что
get_refreshed_fragmentsбольше не вызывается на лишних страницах; - добавьте товар в корзину и убедитесь, что переход в корзину и оформление заказа работают;
- проверьте мини-корзину, если она есть в шапке;
- посмотрите ошибки JavaScript в консоли после обновления страницы.
Если у вас подключён кэш страницы, полезно протестировать и гостевой режим, и авторизованного пользователя. У WooCommerce поведение AJAX и кэша часто отличается именно для незалогиненных посетителей.
Частые ошибки и как их исправить
Отключили скрипт, но мини-корзина осталась в теме
Это самая частая ситуация. Визуально корзина есть, но счётчик не обновляется после добавления товара. Решение простое: либо вернуть wc-cart-fragments, либо заменить мини-корзину на статический элемент, который обновляется только после перехода в корзину.
Сломались сторонние виджеты
Некоторые темы и плагины используют фрагменты не только для корзины, но и для собственных блоков в шапке. Если после отключения появились пустые области или ошибки в консоли, проверьте, какой скрипт ждёт wc-cart-fragments. Иногда достаточно отключать его только на части страниц, а не глобально.
Код добавили в родительскую тему
Если правка лежит в functions.php родительской темы, она может пропасть после обновления. Для таких изменений лучше использовать дочернюю тему или mu-plugin. Это особенно важно, если магазин уже в продакшене и обновления темы идут регулярно.
Проверяли только в админке
В админке WooCommerce часть фронтенд-логики не воспроизводится. Тестировать нужно именно на публичной части сайта, в режиме инкогнито и без авторизации. Иначе можно пропустить проблему с кэшем или с условной загрузкой скриптов.
Что ещё можно сделать для ускорения
Если цель не только убрать один AJAX, но и разгрузить магазин в целом, проверьте связанные вещи: кэш страниц, количество сторонних скриптов в шапке, тяжёлые виджеты и лишние запросы WooCommerce на каталоге. Иногда отключение cart fragments даёт заметный эффект только в связке с нормальной настройкой кэша и минимизацией фронтенд-скриптов.
Для магазинов, где часто меняются товары, полезно не отключать всё подряд, а сначала убрать лишнее только на страницах, где корзина не нужна. Это даёт более предсказуемый результат и меньше шансов сломать интерфейс.
Если нужен более широкий аудит WooCommerce без ручной чистки каждого скрипта, можно использовать инструменты вроде Clearfy Pro для удаления лишних дублей и части служебных нагрузок, но даже в этом случае логику cart fragments лучше проверять отдельно и не полагаться на «автоматическое ускорение» без теста.