AJAX-обновление корзины в WooCommerce удобно до тех пор, пока не начинает мешать: ломает кастомные скрипты, создаёт лишние запросы, конфликтует с темой или даёт странное поведение на мобильных устройствах. В таких случаях чаще всего нужно не «чинить всё подряд», а точечно отключить именно AJAX-пересчёт и обновление мини-корзины, сохранив нормальную работу оформления заказа.
Ниже — рабочий сценарий: как понять, что проблема именно в AJAX, как отключить его без лишнего риска, чем отличаются варианты через код и через настройки, и что проверить после внедрения.
Когда отключение AJAX действительно нужно
Отключать AJAX стоит не «для ускорения вообще», а когда есть конкретный симптом. Например:
- после изменения количества товара корзина пересчитывается с задержкой или с ошибкой;
- в мини-корзине не обновляется сумма, пока не перезагрузишь страницу;
- кастомный JS на странице корзины конфликтует с WooCommerce events;
- на слабом хостинге слишком много фоновых запросов к
?wc-ajax=...; - в теме или плагине есть собственная логика корзины, и AJAX только мешает.
Если проблема в конфликте скриптов, отключение AJAX — нормальный способ локализовать источник. Если же сайт просто «тормозит», сначала смотрите в сторону кэша, тяжёлых скриптов и неоптимальной темы. Сам по себе AJAX не всегда главный виновник.
Диагностика: что именно у вас ломается
Перед правкой кода полезно понять, какой механизм вызывает проблему. В WooCommerce есть несколько связанных, но разных вещей: AJAX-обновление корзины, фрагменты мини-корзины и пересчёт totals. Их часто путают.
Проверьте сетевые запросы в браузере
Откройте страницу корзины, затем DevTools → Network и посмотрите, есть ли запросы к:
?wc-ajax=update_shipping_method?wc-ajax=get_refreshed_fragments?wc-ajax=update_order_review
Если ошибка возникает именно после этих запросов, проблема почти наверняка в AJAX-цепочке WooCommerce или в конфликте с темой/плагином.
Сравните поведение с отключёнными сторонними плагинами
На staging-сайте временно отключите плагины, которые вмешиваются в корзину: фильтры доставки, динамические скидки, конструкторы checkout, плагины мини-корзины. Если проблема исчезает, не спешите выключать AJAX глобально — возможно, достаточно исправить один конфликтующий плагин.
Проверьте консоль на JS-ошибки
Если в консоли есть ошибки вроде jQuery(...).wc_cart_fragments_refresh is not a function или Cannot read properties of undefined, сначала исправляйте источник ошибки. Отключение AJAX может скрыть симптом, но не устранить причину.
Как отключить AJAX-обновление корзины через код
Самый безопасный путь — сделать это в дочерней теме или через небольшой mu-plugin. Не редактируйте файлы самого WooCommerce.
Если задача — убрать AJAX-пересчёт корзины при изменении количества товара и обновлении мини-корзины, обычно достаточно отключить скрипт wc-cart-fragments на фронтенде. Это уменьшает количество фоновых запросов и убирает автоматическое обновление фрагментов.
<?php
add_action( 'wp_enqueue_scripts', function () {
if ( is_admin() ) {
return;
}
if ( function_exists( 'is_cart' ) && ( is_cart() || is_checkout() ) ) {
return;
}
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
}, 20 );Что делает этот код:
- не трогает админку;
- оставляет корзину и checkout в покое, если вам нужен AJAX именно там;
- убирает фрагменты мини-корзины на остальных страницах.
Если нужно отключить AJAX-обновление именно на странице корзины, а мини-корзину оставить, можно действовать точнее и не снимать скрипт глобально. В этом случае лучше отключать только поведение, которое вызывает лишние обновления, и проверять, не завязана ли тема на фрагменты корзины.
Отключение AJAX для кнопки «Обновить корзину»
В некоторых темах и кастомных сборках проблема не в фрагментах, а в том, что корзина пытается пересчитываться без перезагрузки после каждого изменения. Тогда можно принудительно оставить обычную отправку формы. WooCommerce не даёт универсального фильтра «выключить весь AJAX», потому здесь чаще применяется точечная правка темы или отключение скриптов, которые навешивают обработчики на кнопку обновления.
Если у вас кастомный код, проверьте, нет ли такого обработчика:
jQuery( function( $ ) {
$( document.body ).on( 'click', '.woocommerce-cart-form button[name="update_cart"]', function() {
// AJAX logic
} );
} );Именно его нужно убрать или заменить на стандартную отправку формы. Иначе WooCommerce будет продолжать вести себя «как будто AJAX включён», даже если вы отключили часть скриптов.
Сравнение вариантов: код, плагин, компромисс
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Код в дочерней теме / mu-plugin | Нужен точечный контроль | Прозрачно, можно откатить, без лишних зависимостей | Нужно понимать, что именно отключаете |
| Настройки темы / плагина | Тема уже даёт нужный переключатель | Быстро и без кода | Не всегда есть точная настройка, иногда влияет на весь сайт |
| Полное отключение фрагментов | Мини-корзина не критична | Меньше запросов, проще поведение | Может сломать live-обновление мини-корзины |
Если у вас задача не только убрать AJAX, но и почистить лишние скрипты, имеет смысл посмотреть в сторону Clearfy Pro: он полезен именно там, где нужно отключать ненужные элементы и не держать на сайте лишнюю нагрузку. Но если нужен один конкретный фикс, код обычно надёжнее и предсказуемее.
Пошаговое решение без лишнего риска
- Сделайте копию сайта или работайте на staging.
- Проверьте, что проблема воспроизводится именно на странице корзины или checkout.
- Отключите сторонние плагины, которые вмешиваются в корзину, и сравните поведение.
- Добавьте код отключения
wc-cart-fragmentsв дочернюю тему или mu-plugin. - Очистите кэш сайта, CDN и браузера.
- Проверьте корзину в режиме инкогнито и на мобильном устройстве.
Пример mu-plugin для безопасного внедрения
Если не хотите привязывать логику к теме, создайте файл, например wp-content/mu-plugins/disable-wc-cart-fragments.php:
<?php
/**
* Plugin Name: Disable WC Cart Fragments
*/
add_action( 'wp_enqueue_scripts', function () {
if ( is_admin() ) {
return;
}
if ( function_exists( 'is_cart' ) && ( is_cart() || is_checkout() ) ) {
return;
}
wp_dequeue_script( 'wc-cart-fragments' );
wp_deregister_script( 'wc-cart-fragments' );
}, 20 );mu-plugin удобен тем, что он не зависит от активной темы и не потеряется при обновлении.
Как проверить, что решение сработало
После внедрения не ограничивайтесь визуальной проверкой. Нужно убедиться, что поведение изменилось именно там, где вы ожидали.
- Откройте страницу магазина и проверьте, что запросы к
get_refreshed_fragmentsбольше не уходят. - Добавьте товар в корзину и убедитесь, что мини-корзина не обновляется через AJAX, если вы это отключали.
- Перейдите на страницу корзины и проверьте изменение количества товара.
- Нажмите «Обновить корзину» и убедитесь, что форма отправляется без ошибок.
- Проверьте checkout: доставка, купоны и пересчёт итогов должны работать штатно.
Если после отключения AJAX мини-корзина пустая или не обновляется, значит тема или плагин завязаны на wc-cart-fragments. Тогда либо возвращайте скрипт на страницы, где он нужен, либо заменяйте мини-корзину на более простой вариант без live-обновления.
Частые ошибки и как их исправить
Отключили скрипт, но запросы остались
Причина обычно в том, что код добавлен слишком поздно, либо скрипт регистрирует тема. Проверьте приоритет хука wp_enqueue_scripts и убедитесь, что код реально выполняется на фронтенде.
Сломалась мини-корзина в шапке
Это ожидаемо, если тема использует фрагменты WooCommerce для обновления счётчика и суммы. Решение: не отключать wc-cart-fragments на всех страницах, а оставить его там, где мини-корзина критична, либо заменить виджет на статичный блок.
После отключения AJAX не обновляется доставка
Значит, вы задели не только корзину, но и логику checkout. Проверьте, не отключили ли вы скрипты, которые нужны на странице оформления заказа. Для checkout лучше делать исключение, а не рубить всё подряд.
Кэш мешает увидеть результат
WooCommerce и кэш-плагины часто сохраняют старые версии скриптов и HTML. Очистите кэш страницы, объектный кэш, CDN и только потом тестируйте. Иначе можно решить, что код не работает, хотя на деле вы видите старую версию.
Практические советы по производительности и безопасности
Отключение AJAX имеет смысл, если оно реально уменьшает количество запросов и убирает конфликт. Но не стоит превращать это в «оптимизацию ради оптимизации».
- Не редактируйте файлы WooCommerce напрямую — обновление всё перетрёт.
- Храните такие правки в mu-plugin или дочерней теме.
- Проверяйте изменения на staging перед выкладкой на боевой сайт.
- Если у вас сложная корзина с динамическими скидками, сначала протестируйте сценарии купонов и доставки.
- Не отключайте скрипты на checkout без проверки: там часто завязаны важные расчёты.
Если проблема оказалась не в AJAX, а в лишних скриптах и дублях функциональности, лучше сначала убрать конфликтующие элементы, чем отключать механизм корзины целиком. В WooCommerce это почти всегда даёт более предсказуемый результат, чем «жёсткая» оптимизация вслепую.