Если в корзине или на checkout WooCommerce сайт дергает лишние AJAX-запросы, это обычно видно не по скорости «в целом», а по мелким сбоям: мигает мини-корзина, пересчитывается доставка без причины, ломаются кастомные поля, а в DevTools сыпятся запросы к ?wc-ajax=.... В таких случаях не нужно отключать всё подряд. Задача обычно точечная: убрать только те AJAX-механизмы, которые мешают конкретному магазину, и не задеть обновление итогов заказа, купоны и оплату.
Когда проблема действительно в AJAX, а не в теме или плагине
Сначала стоит понять, что именно вы хотите отключить. В WooCommerce под AJAX часто попадают разные вещи: обновление мини-корзины, подгрузка фрагментов корзины, пересчет доставки, обновление итогов на checkout, запросы от сторонних плагинов. Если выключить не тот слой, можно получить пустую корзину, неработающий купон или зависающий блок оплаты.
Типичные симптомы
- На странице корзины постоянно идут запросы к
wc-ajax=get_refreshed_fragments. - После изменения количества товара страница пересчитывается с задержкой и визуальными рывками.
- На checkout сторонний скрипт отправляет запросы при каждом вводе символа в поле.
- В консоли браузера появляются ошибки после отключения кэша или оптимизатора JS.
Что проверить до правок
Откройте DevTools → Network и отфильтруйте запросы по wc-ajax и admin-ajax.php. Посмотрите, кто их инициирует. Если запрос идет из темы или плагина доставки, отключение WooCommerce AJAX не решит проблему. Если же лишние запросы идут от мини-корзины, фрагментов корзины или автопересчета, тогда точечная правка уместна.
| Подход | Что делает | Риск |
|---|---|---|
| Плагин оптимизации | Может отключить фрагменты, мини-корзину, лишний JS | Нужно тестировать совместимость с темой и оплатой |
| Код в теме или mu-plugin | Точечно убирает нужные AJAX-обработчики | Можно сломать обновление корзины, если отключить лишнее |
| Отключение всего AJAX | Убирает динамику почти полностью | Чаще всего слишком грубо для WooCommerce |
Пошаговое решение: отключаем только лишние AJAX-фрагменты
Самый безопасный сценарий — не трогать checkout целиком, а убрать обновление фрагментов корзины там, где оно не нужно. Обычно это помогает на страницах, где мини-корзина и виджеты создают лишние запросы, но не влияет на оформление заказа напрямую.
1. Отключите фрагменты корзины на неключевых страницах
Если запросы get_refreshed_fragments идут с каждой страницы, можно отключить их вне корзины и checkout. Это уменьшает нагрузку и убирает лишние обращения к серверу.
<?php
add_action( 'wp_enqueue_scripts', function () {
if ( function_exists( 'is_cart' ) && function_exists( 'is_checkout' ) ) {
if ( ! is_cart() && ! is_checkout() ) {
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
}
}
}, 20 );
Этот код лучше добавлять в дочернюю тему или в небольшой mu-plugin, а не в основной файл темы. Так правка не потеряется при обновлении.
2. Уберите автопересчет, если его добавила тема
Некоторые темы и плагины навешивают обработчики на поля доставки, купонов или количества товара и отправляют AJAX при каждом изменении. Если это не критично для вашего сценария, можно отключить конкретный скрипт темы или плагина через wp_dequeue_script. Здесь уже нужен точный handle, который вы увидите в исходниках страницы или в списке подключенных скриптов.
<?php
add_action( 'wp_enqueue_scripts', function () {
if ( function_exists( 'is_checkout' ) && is_checkout() ) {
wp_dequeue_script( 'theme-checkout-ajax' );
wp_dequeue_script( 'custom-shipping-calculator' );
}
}, 100 );
Имена theme-checkout-ajax и custom-shipping-calculator здесь примерные. Их нужно заменить на реальные handle из вашей установки. Если handle не совпадает, код ничего не сделает — это нормально, но и эффекта не будет.
3. Если нужен только обычный пересчет корзины, оставьте checkout AJAX в покое
На странице оформления заказа AJAX часто нужен для обновления доставки, налогов и итоговой суммы. Полное отключение здесь обычно приводит к тому, что пользователь меняет адрес, а сумма не пересчитывается до ручной перезагрузки. Это уже не оптимизация, а регрессия.
Поэтому в большинстве магазинов разумнее отключать только:
- фрагменты мини-корзины вне cart/checkout;
- лишние скрипты темы, которые дублируют логику WooCommerce;
- автообновление виджетов, не влияющих на оплату.
Если нужно отключить AJAX только на корзине
Иногда проблема локализована именно на странице корзины: там стоит тяжелый виджет, а обновление фрагментов создает лишнюю нагрузку. В этом случае можно отключить скрипт точечно только на cart, но сначала убедитесь, что мини-корзина в шапке не завязана на этот же механизм.
<?php
add_action( 'wp_enqueue_scripts', function () {
if ( function_exists( 'is_cart' ) && is_cart() ) {
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
}
}, 20 );
После этого проверьте, не исчезает ли счетчик товаров в шапке после добавления товара в корзину. Если исчезает, значит тема использует фрагменты корзины для обновления мини-корзины, и отключение нужно пересмотреть.
Как проверить, что решение сработало
Проверка должна быть не «страница открылась», а набором конкретных действий. Иначе можно пропустить скрытую поломку, которая проявится только у покупателя.
- Откройте корзину и checkout в режиме инкогнито.
- В DevTools → Network убедитесь, что количество запросов к
wc-ajax=get_refreshed_fragmentsуменьшилось или они исчезли там, где вы их отключали. - Измените количество товара и проверьте, пересчитывается ли итог.
- Добавьте купон и убедитесь, что скидка применяется корректно.
- Смените адрес доставки и проверьте обновление стоимости доставки и налогов.
- Протестируйте оплату в тестовом режиме, если платежный шлюз завязан на AJAX-обновления checkout.
Если после отключения фрагментов мини-корзина перестала обновляться, а это важно для магазина, значит решение надо сузить: отключать не сам wc-cart-fragments, а только конфликтующий скрипт темы или плагина.
Частые ошибки и как их исправить
Отключили не тот handle
Самая частая проблема: код написан правильно, но handle скрипта взят из головы. В результате ничего не меняется. Исправление простое — откройте исходник страницы, список подключенных скриптов или используйте Query Monitor, чтобы увидеть реальные имена.
Сломали мини-корзину в шапке
Если тема обновляет мини-корзину через wc-cart-fragments, ее отключение уберет динамическое число товаров и сумму. В таком случае либо оставьте фрагменты на главной и каталоге, либо замените мини-корзину на вариант без AJAX.
Отключили AJAX на checkout полностью
Это часто ломает пересчет доставки, особенно если магазин работает с адресными тарифами. Если checkout перестал обновлять сумму, верните базовую логику WooCommerce и отключайте только сторонние обработчики.
Код добавили в файл темы без резервной копии
После обновления темы правка может исчезнуть. Для таких изменений безопаснее использовать дочернюю тему или mu-plugin. Это не только удобнее, но и проще для отката.
Практика безопасности и производительности
Если вы отключаете AJAX ради ускорения, не забывайте про кэш и JS-оптимизацию. Иногда лишние запросы создают не WooCommerce, а конфликт минификации, отложенной загрузки или объединения скриптов. Перед правкой проверьте, не ломает ли оптимизатор порядок загрузки JS.
Для магазинов с активной кастомизацией полезно держать отдельный тестовый стенд и сравнивать поведение корзины до и после. Это особенно важно, если у вас подключены платежные модули, доставка по API или сторонние виджеты.
Если нужен более широкий аудит дублей, лишних скриптов и технической чистки сайта, иногда удобнее сначала убрать системный мусор через Clearfy Pro: Clearfy Pro. Но даже в этом случае точечную проверку AJAX-запросов все равно придется делать вручную.
Что делать, если после правки проблема осталась
Тогда причина, скорее всего, не в WooCommerce AJAX как таковом. Проверьте:
- скрипты темы, которые пересчитывают корзину отдельно от WooCommerce;
- плагины доставки и оплаты, которые делают собственные запросы;
- ошибки JavaScript в консоли;
- конфликты с кэшированием HTML или JS-оптимизацией;
- кастомные поля checkout, которые отправляют данные через
admin-ajax.php.
Если запросы идут не из WooCommerce, а из стороннего кода, отключение wc-cart-fragments даст только частичный эффект. В этом случае нужно уже точечно отключать конкретный скрипт или пересматривать логику плагина.