Если на страницах каталога WooCommerce постоянно дергается ?wc-ajax=get_refreshed_fragments, это обычно не «ошибка», а штатное поведение мини-корзины и виджетов, которые обновляют фрагменты корзины через AJAX. На небольшом магазине это почти незаметно, но на страницах с высокой посещаемостью такие запросы быстро становятся лишней нагрузкой: больше обращений к серверу, больше работы PHP, больше шансов увидеть просадку по TTFB.
Ниже — разбор, как понять, что именно вызывает запросы, какие варианты отключения реально работают и как не сломать корзину, мини-корзину и оформление заказа.
Когда проблема действительно в AJAX корзины
Сначала стоит убедиться, что вы боретесь именно с причиной, а не с симптомом. В WooCommerce AJAX-запросы корзины чаще всего появляются из-за мини-корзины в шапке, блока корзины в сайдбаре, некоторых тем и плагинов кеширования, которые не умеют корректно работать с динамическими фрагментами.
Что смотреть в браузере и на сервере
Откройте DevTools в браузере, вкладку Network, и обновите страницу магазина. Если в списке запросов регулярно появляется wc-ajax=get_refreshed_fragments, а иногда ещё и запросы к ?wc-ajax=add_to_cart, значит WooCommerce обновляет фрагменты корзины на клиенте. Это нормально для функционала, но не всегда оправдано на страницах каталога.
На сервере полезно проверить логи медленных запросов или хотя бы нагрузку в панели хостинга. Если именно страницы магазина создают много однотипных AJAX-обращений, а не отдельные тяжёлые SQL-запросы, то отключение фрагментов даст более предсказуемый эффект, чем общая «оптимизация всего подряд».
Какие есть варианты решения
Для этой задачи обычно есть три пути: отключить фрагменты полностью, отключить их только на страницах магазина и категорий, либо оставить функционал, но убрать причины постоянного обновления. Последний вариант безопаснее, если у вас завязана мини-корзина в шапке и вы не хотите менять UX.
| Подход | Что делает | Когда подходит | Риск |
|---|---|---|---|
| Плагин | Отключает фрагменты и связанные скрипты | Нужен быстрый результат без кода | Может затронуть мини-корзину и сторонние виджеты |
| Код | Отключает только на выбранных страницах | Нужен контроль и предсказуемость | Нужно тестировать тему и плагины |
| Компромисс | Оставляет фрагменты только там, где они нужны | Есть шапка с мини-корзиной и важен UX | Чуть сложнее поддержка |
Пошаговое решение через код
Если задача точечная, лучше отключать AJAX-фрагменты не глобально, а только там, где они не нужны. Например, на страницах каталога, архивов товаров и отдельных лендингах без мини-корзины.
Добавьте код в functions.php дочерней темы или в небольшой mu-plugin. Для продакшена второй вариант надёжнее: код не потеряется при смене темы.
<?php
add_action( 'wp_enqueue_scripts', function() {
if ( is_admin() ) {
return;
}
// Отключаем фрагменты корзины только на страницах магазина и таксономиях товаров.
if ( function_exists( 'is_shop' ) && ( is_shop() || is_product_taxonomy() ) ) {
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
}
}, 20 );Этот вариант убирает основной скрипт, который вызывает обновление фрагментов. Но если тема или плагин отдельно подгружает мини-корзину через AJAX, одного этого кода может быть недостаточно. Тогда нужно проверить, нет ли дополнительных скриптов, которые завязаны на корзину WooCommerce.
Если вам нужно отключить фрагменты только на обычных страницах, но оставить на корзине и checkout, используйте более узкое условие:
<?php
add_action( 'wp_enqueue_scripts', function() {
if ( is_admin() ) {
return;
}
if ( function_exists( 'is_cart' ) && ( is_cart() || is_checkout() ) ) {
return;
}
if ( function_exists( 'is_woocommerce' ) && is_woocommerce() ) {
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
}
}, 20 );Если нужен вариант без кода
Иногда проще сначала проверить гипотезу через плагин оптимизации, а уже потом переносить логику в код. Это удобно, если у вас нет доступа к разработке или нужно быстро сравнить поведение до и после.
Например, в Clearfy Pro есть инструменты для отключения лишних функций WordPress и WooCommerce, которые часто создают ненужную нагрузку на фронтенде. Но даже в этом случае важно не включать всё подряд: сначала отключите только то, что связано с фрагментами корзины, затем проверьте, не пропала ли мини-корзина и не сломалось ли обновление количества товаров.
Если вы хотите использовать готовый инструмент, а не собирать набор разрозненных настроек, смотрите на то, можно ли отключить именно динамические фрагменты, а не весь WooCommerce AJAX целиком. Слишком грубое отключение обычно приводит к жалобам пользователей на «не обновляется корзина».
Как проверить, что решение сработало
Проверка нужна не только в браузере, но и по поведению магазина. После внедрения откройте страницу каталога в режиме инкогнито и выполните такой чек-лист:
- в Network больше не появляется
wc-ajax=get_refreshed_fragmentsпри обычной загрузке страницы; - кнопка
Добавить в корзинупо-прежнему работает; - корзина и checkout открываются без ошибок;
- если у вас есть мини-корзина в шапке, она либо обновляется другим способом, либо вы сознательно приняли её статичное поведение на страницах каталога;
- в консоли браузера нет ошибок JavaScript, связанных с
wc-cart-fragments.
Дополнительно можно сравнить количество запросов до и после через любой инструмент профилирования или хотя бы через вкладку Network. Важно смотреть не только число запросов, но и то, не появились ли новые ошибки из-за отключённого скрипта.
Частые ошибки и как их исправить
Отключили фрагменты, а мини-корзина стала пустой
Это означает, что тема использовала именно AJAX-обновление фрагментов для отображения количества товаров. В таком случае не отключайте скрипт на всех страницах. Ограничьте его только каталогом или найдите альтернативный способ обновления мини-корзины.
Сломалась кнопка добавления в корзину
Чаще всего проблема не в самом wc-cart-fragments, а в том, что вместе с ним отключили лишний скрипт или конфликтующий файл темы. Проверьте, не деактивировали ли вы случайно wc-add-to-cart или сторонний JS, который отвечает за обработчики клика.
Кэш-плагин продолжает отдавать старую версию страницы
Если кэш уже сохранил страницу с фрагментами, после изменений вы можете видеть старое поведение. Очистите кэш плагина, серверный кэш и, если используется CDN, сбросьте и его. Иначе вы будете тестировать не новый код, а старую копию HTML и JS.
Отключили всё на WooCommerce-страницах и потеряли checkout-логику
Это типичная ошибка при слишком широком условии. Не используйте грубое отключение на всех страницах магазина без исключений для cart и checkout. Для оформления заказа динамика часто нужна, и её отключение даёт больше проблем, чем пользы.
Что ещё стоит проверить вместе с AJAX корзины
Если цель — снизить нагрузку, не ограничивайтесь одним скриптом. Часто рядом с ним идут ещё несколько источников лишней динамики: виджеты мини-корзины, тяжёлые блоки в шапке, сторонние счётчики и плагинные скрипты, которые подгружаются на всех страницах.
- уберите мини-корзину с архивов, если она не нужна;
- проверьте, не подгружаются ли скрипты WooCommerce на страницах, где магазина нет;
- посмотрите, не конфликтует ли кэширование с динамическими блоками;
- не отключайте AJAX на checkout без отдельного теста;
- после изменений прогоните сценарий покупки от каталога до оплаты.
Если у вас магазин с высокой нагрузкой и много лишних фронтенд-скриптов, имеет смысл сначала убрать дубли и неиспользуемые функции через инструмент вроде Clearfy Pro, а уже затем точечно править кодом поведение WooCommerce. Это обычно даёт более чистый результат, чем попытка «ускорить всё» одним переключателем.
Практический итог для внедрения
Рабочая схема выглядит так: сначала фиксируете, какой именно запрос создаёт нагрузку, затем отключаете wc-cart-fragments только там, где он не нужен, и после этого проверяете корзину, checkout и мини-корзину в реальном сценарии покупки. Если что-то ломается, откатываете не весь блок, а только условие, которое оказалось слишком широким.
Такой подход безопаснее, чем глобально выключать AJAX в WooCommerce. Он оставляет рабочими важные части магазина и при этом убирает лишние запросы там, где они действительно не нужны.