Как отключить AJAX корзины в WooCommerce без конфликтов

В WooCommerce AJAX-корзина удобна не всегда. На части проектов она начинает мешать кешированию, конфликтует с темой, провоцирует лишние запросы к wc-ajax или просто ведёт себя нестабильно на мобильных устройствах. В таких случаях лучше отключать именно тот механизм, который создаёт проблему, а не ломать весь фронтенд магазина.

Ниже разберём точечный сценарий: как отключить AJAX-обновление корзины и мини-корзины, не затрагивая оформление заказа и другие важные части WooCommerce.

Когда AJAX корзины действительно стоит отключать

Отключение имеет смысл, если вы видите один или несколько симптомов:

  • после добавления товара в корзину страница ведёт себя нестабильно или дёргается;
  • мини-корзина не обновляется после AJAX-запроса;
  • кеш-плагин отдаёт устаревшее состояние корзины;
  • в консоли браузера появляются ошибки JavaScript, связанные с wc-cart-fragments;
  • на проекте не нужна динамическая мини-корзина, а важнее предсказуемая работа и кеширование.

Если проблема проявляется только в одной теме или одном плагине, сначала ищите конфликт. Но если задача именно в отказе от AJAX-логики, лучше отключать её адресно.

Диагностика: что именно ломается

Перед изменениями проверьте, какой механизм создаёт проблему. В WooCommerce чаще всего участвуют два слоя:

1. Скрипт wc-cart-fragments

Он отвечает за обновление фрагментов корзины, включая мини-корзину. На сайтах с агрессивным кешированием этот скрипт может вызывать лишние запросы и конфликтовать с оптимизацией JS.

2. AJAX-добавление товара в корзину

Это поведение кнопки «В корзину» без перезагрузки страницы. Иногда оно мешает кастомной логике темы или стороннего плагина, особенно если после добавления товара должен запускаться свой сценарий редиректа или аналитики.

Проверка перед правкой простая:

  • откройте DevTools → Network;
  • добавьте товар в корзину;
  • посмотрите, есть ли запросы к ?wc-ajax=add_to_cart и ?wc-ajax=get_refreshed_fragments;
  • сравните поведение на чистой теме и на текущей теме.
ПодходЧто меняетКогда подходит
Плагин оптимизацииМожет отключить фрагменты и часть скриптовЕсли нужен быстрый результат без кода
Код в теме / mu-pluginТочечное отключение нужного скриптаЕсли нужен контроль и минимум побочных эффектов
Полное отключение AJAX в шаблонеМеняет поведение кнопки добавления в корзинуЕсли AJAX не нужен вообще

Пошаговое решение через код

Самый безопасный вариант — отключить только обновление фрагментов корзины на фронтенде. Это не ломает WooCommerce целиком и обычно достаточно, если проблема связана именно с мини-корзиной и лишними запросами.

Шаг 1. Отключить wc-cart-fragments на фронтенде

add_action( 'wp_enqueue_scripts', function() {
    if ( is_admin() ) {
        return;
    }

    if ( function_exists( 'is_woocommerce' ) && ( is_woocommerce() || is_cart() || is_checkout() ) ) {
        return;
    }

    wp_dequeue_script( 'wc-cart-fragments' );
    wp_deregister_script( 'wc-cart-fragments' );
}, 20 );

Что делает этот код:

  • не трогает админку;
  • оставляет скрипт на страницах магазина, корзины и оформления заказа, где он может быть нужен;
  • убирает фрагменты на обычных страницах, где они часто только создают нагрузку.

Если вам нужно отключить фрагменты вообще везде, можно убрать условие с is_woocommerce(), но это уже более жёсткий вариант. На живом магазине я бы начинал именно с точечного отключения.

Шаг 2. Отключить AJAX-добавление в корзину для архивов товаров

Если проблема не в мини-корзине, а в самом добавлении товара без перезагрузки, можно отключить AJAX-кнопку в каталоге:

add_filter( 'woocommerce_loop_add_to_cart_link', function( $html, $product, $args ) {
    if ( ! is_a( $product, 'WC_Product' ) ) {
        return $html;
    }

    // Возвращаем обычную ссылку без AJAX-классов.
    $url = $product->add_to_cart_url();
    $text = $product->add_to_cart_text();

    return sprintf(
        '<a href="%s" rel="nofollow" data-product_id="%d" class="button product_type_%s">%s</a>',
        esc_url( $url ),
        (int) $product->get_id(),
        esc_attr( $product->get_type() ),
        esc_html( $text )
    );
}, 10, 3 );

Этот вариант полезен, когда AJAX-кнопка конфликтует с кастомным редиректом, аналитикой или нестандартной логикой темы. Но применять его стоит аккуратно: для вариативных товаров и товаров с дополнительными опциями поведение может отличаться.

Шаг 3. Если нужен только отказ от фрагментов, но не от AJAX-кнопки

Иногда достаточно убрать именно обновление мини-корзины, а саму AJAX-добавку оставить. Тогда не трогайте кнопку «В корзину», а отключайте только скрипт фрагментов. Это обычно лучший компромисс для кешируемых сайтов.

Проверка результата после внедрения

После правки не ограничивайтесь визуальной проверкой. Нужно убедиться, что поведение изменилось именно там, где вы ожидали.

  • Откройте страницу каталога в режиме инкогнито.
  • Добавьте товар в корзину.
  • Проверьте, нет ли лишнего запроса к get_refreshed_fragments.
  • Если AJAX-добавление отключали полностью, убедитесь, что после клика происходит обычная навигация или редирект, а не частичное обновление блока.
  • Проверьте корзину и оформление заказа отдельно: они должны работать без ошибок.
  • Если используется кеш, очистите его и повторите тест.

Дополнительно можно проверить исходный код страницы: если вы отключали wc-cart-fragments, соответствующий скрипт не должен грузиться на обычных страницах.

Частые ошибки и как их исправить

Скрипт отключили слишком рано

Если вызвать wp_dequeue_script() до того, как WooCommerce зарегистрировал скрипт, ничего не произойдёт. Поэтому и нужен приоритет 20 или выше на wp_enqueue_scripts.

Отключили фрагменты на checkout и сломали мини-корзину

На корзине и оформлении заказа фрагменты могут быть нужны для корректного отображения состояния заказа. Если после правки там появились проблемы, верните исключение для этих страниц.

Смешали отключение AJAX и редирект после добавления

Если тема или плагин рассчитывают на AJAX-ответ, а вы принудительно вернули обычную ссылку, часть пользовательского сценария может сломаться. В таком случае сначала проверьте, не проще ли отключить только wc-cart-fragments, а не весь AJAX.

Кеш-плагин продолжает отдавать старую корзину

Даже после отключения фрагментов кеш может мешать, если мини-корзина выведена в области, которую плагин кеширует без исключений. Проверьте настройки исключений для корзины, checkout и пользовательских cookies WooCommerce.

Практические советы по безопасности и производительности

Если вы вносите код в тему, лучше не править functions.php напрямую на боевом сайте. Практичнее использовать дочернюю тему или небольшой mu-plugin. Так изменение не потеряется при обновлении.

Для проектов, где важны и SEO, и чистота фронтенда, полезно дополнительно проверить, не создаёт ли тема лишние скрипты и дубли разметки. В таких случаях часто помогает связка точечной настройки WooCommerce и инструмента для чистки фронтенда, например Clearfy Pro, если он уже используется в проекте. Но саму логику корзины всё равно лучше контролировать кодом, а не надеяться на общий «ускоритель».

Ещё один практический момент: если вы отключаете AJAX-корзину ради кеширования, сначала убедитесь, что на сайте нет сценариев, где пользователь должен видеть мгновенное обновление мини-корзины без перезагрузки. Для магазинов с простым каталогом это обычно не критично, а для сложных витрин — уже может быть заметно.

Что выбрать на практике

Если нужен короткий ориентир:

  • мешает только мини-корзина и лишние запросы — отключайте wc-cart-fragments;
  • ломается именно добавление товара без перезагрузки — убирайте AJAX-кнопку в каталоге;
  • нужна предсказуемая работа с кешем — оставляйте обычную навигацию и тестируйте корзину в инкогнито;
  • есть конфликт с темой — сначала проверьте, не переопределяет ли она шаблоны WooCommerce и JS-обработчики.

Такой подход даёт контролируемый результат: вы не отключаете WooCommerce целиком, а убираете только тот слой, который мешает конкретному проекту.

Как закрыть дубли страниц в WordPress через robots.txt и .htaccess
30.08.2026