На медленных магазинах корзина часто тормозит не из-за самого шаблона, а из-за лишних AJAX-запросов: обновление мини-корзины, пересчёт фрагментов, автоподгрузка купонов, скрипты темы и сторонних плагинов. Полностью рубить AJAX в WooCommerce обычно плохая идея: ломается часть интерфейса и растёт число ручных правок. Но отключить именно лишние запросы на странице корзины — рабочий сценарий, если задача понятная: ускорить страницу и убрать лишнюю сетевую активность.
Когда это действительно имеет смысл
Сначала стоит понять, что именно вы хотите отключить. В WooCommerce под словом AJAX обычно смешивают несколько разных вещей: обновление фрагментов корзины, действия в мини-корзине, отправку формы купона, пересчёт итогов при изменении количества и запросы сторонних расширений. Если проблема только в корзине, чаще всего достаточно убрать обновление cart fragments на фронтенде и не трогать checkout.
Типичный сценарий: пользователь открывает корзину, а в DevTools видно несколько запросов к /?wc-ajax=... или к admin-ajax.php. При этом страница не меняется визуально, но время до полной готовности растёт. В таком случае сначала отключают именно то, что не нужно на корзине, а не весь AJAX целиком.
Диагностика проблемы перед правкой кода
Перед изменениями проверьте, кто именно создаёт нагрузку. Это важно, потому что иногда виноват не WooCommerce, а тема или плагин доставки/оплаты.
Что смотреть в браузере
- Откройте DevTools → Network.
- Перезагрузите страницу корзины с включённой записью запросов.
- Отфильтруйте по
XHRилиFetch. - Посмотрите, повторяются ли запросы к
wc-ajax=get_refreshed_fragmentsили кadmin-ajax.php.
Если запросов много, но они идут от мини-корзины в шапке, это нормальное поведение для некоторых тем. Если же корзина сама по себе делает лишние запросы при каждом действии, можно оптимизировать точечно.
Что проверить на сервере
- Включён ли кэш страниц для магазина и не конфликтует ли он с WooCommerce-страницами.
- Нет ли тяжёлых фильтров на хуках
woocommerce_before_calculate_totalsилиwoocommerce_cart_calculate_fees. - Не добавляет ли тема собственный скрипт, который дергает корзину каждые несколько секунд.
Если на сервере всё чисто, а тормозит только фронтенд, тогда имеет смысл отключать фрагменты и лишние AJAX-действия именно на корзине.
Рабочая схема: отключаем лишние cart fragments только на корзине
Самый безопасный путь — не выключать WooCommerce AJAX глобально, а убрать обновление фрагментов мини-корзины там, где оно не нужно. Для этого можно использовать фильтр woocommerce_get_script_data и отключить данные для скрипта wc-cart-fragments на нужных страницах.
<?php
add_filter( 'woocommerce_get_script_data', function( $params, $handle ) {
if ( 'wc-cart-fragments' !== $handle ) {
return $params;
}
// Отключаем фрагменты только на странице корзины.
if ( function_exists( 'is_cart' ) && is_cart() ) {
return null;
}
return $params;
}, 10, 2 );Что делает этот код: WooCommerce перестаёт передавать данные для обновления фрагментов на странице корзины. В результате уменьшается число AJAX-запросов, а мини-корзина и другие места сайта продолжают работать на остальных страницах.
Если у вас тема использует мини-корзину прямо в шапке на странице корзины, проверьте, не исчезает ли там счётчик товаров. Это нормальный побочный эффект: вы сознательно отключили механизм обновления там, где он не нужен.
Если нужно убрать и лишние скрипты на корзине
Иногда ускорение даёт не только отключение фрагментов, но и снятие ненужных скриптов, которые WooCommerce подгружает автоматически. Делать это надо аккуратно: не трогайте скрипты, без которых ломается обновление количества или оформление заказа.
<?php
add_action( 'wp_enqueue_scripts', function() {
if ( ! function_exists( 'is_cart' ) || ! is_cart() ) {
return;
}
// Убираем только фрагменты корзины на самой корзине.
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
}, 100 );Этот вариант жёстче, чем фильтр выше. Он подходит, если тема или плагин всё равно продолжает подгружать wc-cart-fragments. Но перед применением обязательно проверьте, не завязан ли на него какой-то кастомный виджет в шапке.
Сравнение подходов
| Подход | Что делает | Риск | Когда использовать |
|---|---|---|---|
| Отключить фрагменты через фильтр | Убирает обновление cart fragments только на корзине | Низкий | Если нужно точечное ускорение |
| Dequeue/Deregister скрипта | Полностью снимает скрипт с загрузки на странице | Средний | Если фильтра недостаточно |
| Отключить AJAX глобально | Ломает часть поведения WooCommerce | Высокий | Почти никогда не стоит делать без тестов |
Пошаговое внедрение без сюрпризов
- Сделайте бэкап или откройте staging-копию сайта.
- Проверьте Network в браузере и зафиксируйте текущие запросы на корзине.
- Добавьте сначала вариант с фильтром
woocommerce_get_script_data. - Очистите кэш страницы, объектный кэш и CDN, если он есть.
- Снова откройте корзину и сравните список запросов.
- Если скрипт всё ещё грузится, переходите к
wp_dequeue_script.
Как проверить, что решение сработало
Проверка должна быть не на глаз, а по фактам.
- В Network стало меньше запросов к
wc-ajax=get_refreshed_fragments. - Страница корзины открывается без ошибок в консоли.
- Изменение количества товара по-прежнему пересчитывает итог.
- Купон применяется, если он предусмотрен вашей темой и настройками WooCommerce.
- Переход к оформлению заказа работает без зависаний.
Если после отключения фрагментов мини-корзина в шапке перестала обновляться на странице корзины, это ожидаемо. Важно, чтобы на остальных страницах сайта она продолжала работать.
Частые ошибки и как их исправить
Отключили AJAX глобально и сломали checkout
Такое происходит, когда пытаются убрать все запросы WooCommerce одним махом. Не отключайте admin-ajax.php на уровне сервера и не режьте все скрипты подряд. Работайте только с конкретным handle или фильтром.
Сняли не тот скрипт
Иногда в теме есть собственный скрипт мини-корзины, который зависит от wc-cart-fragments. После wp_dequeue_script проверьте шапку, сайдбар и мобильное меню. Если что-то отвалилось, вернитесь к более мягкому фильтру.
Не очистили кэш
Если на сайте есть page cache, Cloudflare или серверный кэш, вы можете смотреть старую версию страницы и думать, что код не работает. После правки очистите все уровни кэша, иначе диагностика будет ложной.
Путают проблему корзины с тяжёлыми хуками
Если запросов мало, но страница всё равно медленная, причина может быть в PHP-логике: пересчёт цен, доставка, купоны, сторонние поля оформления. В таком случае отключение AJAX почти ничего не даст, и нужно искать тяжёлые хуки через профилирование.
Практические советы по безопасности и производительности
Не редактируйте ядро WooCommerce и не вносите правки в файлы плагина напрямую. Используйте дочернюю тему, mu-plugin или собственный мини-плагин. Так изменения переживут обновления.
Если задача шире, чем одна корзина, имеет смысл посмотреть на общую чистку фронтенда: убрать лишние скрипты темы, отключить дубль-стили, сократить число сторонних виджетов. Для этого иногда удобнее использовать Clearfy Pro, но только если вы понимаете, какие именно опции включаете и зачем: https://wpshop.ru/plugins/clearfy?utm_source=wptool.ru&utm_medium=article&utm_campaign=kak-otklyuchit-ajax-v-woocommerce-dlya-uskoreniya-stranicy-korziny-i-ne-slomat-funkcional
И ещё один практический момент: если вы отключаете AJAX на корзине ради скорости, не забывайте тестировать мобильную версию отдельно. На мобильных устройствах некоторые темы сильнее завязаны на динамическое обновление блоков, и там побочные эффекты заметнее.