WordPress Notes WP-1

Как отключить AJAX добавление в корзину WooCommerce на отдельных страницах

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

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

Когда это нужно и как выглядит проблема

Типичный симптом: на странице товара или в каталоге кнопка Добавить в корзину не делает обычный переход, а отправляет запрос в фоне. Это нормально для стандартного WooCommerce, но на некоторых проектах такой режим вызывает побочные эффекты:

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

Если проблема проявляется только на части страниц, не стоит отключать AJAX глобально. Это часто ухудшает UX на остальных разделах магазина.

Диагностика: что именно включено сейчас

Сначала проверьте, не решается ли задача настройкой WooCommerce или темой. В стандартной установке AJAX-добавление обычно связано с тем, что тема выводит кнопки каталога с классом ajax_add_to_cart и подключает соответствующий скрипт WooCommerce.

Что проверить в браузере

  • Откройте страницу с товаром или каталогом.
  • Нажмите Добавить в корзину и посмотрите вкладку Network в DevTools.
  • Если видите запрос к ?wc-ajax=add_to_cart, значит используется AJAX.
  • Если после клика идёт обычная загрузка страницы или переход на корзину, AJAX уже не участвует.

Что проверить в коде темы

Ищите в шаблонах каталога или карточки товара классы вроде ajax_add_to_cart, а также переопределения хуков WooCommerce, которые могут добавлять AJAX-поведение вручную. Иногда проблема не в WooCommerce, а в теме, которая повторно навешивает обработчики событий.

Пошаговое решение: отключить AJAX только на нужных страницах

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

<?php
/**
 * Plugin Name: Disable WooCommerce AJAX Add to Cart on Selected Pages
 */

add_action('wp', function () {
    if (!function_exists('is_product') || is_admin()) {
        return;
    }

    // Укажите ID страниц, где AJAX не нужен.
    $target_pages = array(12, 34, 56);

    if (!is_page($target_pages)) {
        return;
    }

    // Убираем стандартный скрипт AJAX add to cart.
    wp_dequeue_script('wc-add-to-cart');
    wp_deregister_script('wc-add-to-cart');

    // Если тема или шаблон выводит кнопки с AJAX-классом, можно убрать его фильтром.
    add_filter('woocommerce_loop_add_to_cart_args', function ($args, $product) {
        if (isset($args['class'])) {
            $args['class'] = str_replace('ajax_add_to_cart', '', $args['class']);
            $args['class'] = trim(preg_replace('/\s+/', ' ', $args['class']));
        }
        return $args;
    }, 10, 2);
});

Этот вариант подходит, если вы точно знаете, на каких страницах AJAX мешает. Важно: wp_dequeue_script() и wp_deregister_script() работают только если вызваны в правильный момент и если скрипт действительно подключается стандартным способом.

Если нужно отключить AJAX по условию, а не по ID

Например, только на странице категории, только для мобильных или только для определённой роли. Тогда логика может быть такой:

<?php
add_action('wp_enqueue_scripts', function () {
    if (!function_exists('is_product_category')) {
        return;
    }

    // Пример: отключаем AJAX только в категории "sale".
    if (is_product_category('sale')) {
        wp_dequeue_script('wc-add-to-cart');
    }
}, 100);

Здесь важен приоритет 100: если тема подключает скрипт поздно, ранний вызов может не сработать.

Сравнение подходов: плагин, код, компромисс

ПодходКогда подходитМинусы
Настройка темы или WooCommerceЕсли есть готовая опция отключения AJAXНе всегда есть точечная настройка
Код через wp_dequeue_script()Нужно отключить AJAX на конкретных страницахТребует проверки, не сломает ли это другие скрипты
Полное отключение AJAXЕсли AJAX не нужен нигдеУхудшает UX в каталоге и на карточках товара

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

Как проверить, что решение сработало

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

  • Откройте страницу в режиме инкогнито, чтобы исключить влияние кэша и расширений браузера.
  • В DevTools проверьте, что запрос ?wc-ajax=add_to_cart больше не появляется.
  • Нажмите кнопку добавления товара и посмотрите, происходит ли обычная загрузка страницы.
  • Проверьте мини-корзину, если она используется: она должна обновляться корректно или не зависеть от AJAX, если вы этого и добивались.
  • Если есть кэш-плагин, очистите кэш страницы и объектный кэш, если он используется.

Для более строгой проверки можно временно добавить логирование подключаемых скриптов:

<?php
add_action('wp_enqueue_scripts', function () {
    if (is_page(12)) {
        error_log('AJAX cart script should be disabled on page 12');
    }
}, 20);

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

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

Скрипт отключили, но AJAX всё равно работает

Причина обычно в том, что тема или плагин подключают свой обработчик отдельно от wc-add-to-cart. В таком случае нужно искать дополнительные скрипты и события, которые навешиваются на кнопку товара. Проверьте кастомные файлы темы и плагины, которые меняют поведение каталога.

Отключение срабатывает не на всех страницах

Частая причина — неверное условие. Например, вы используете is_page() там, где нужна is_product_category() или is_shop(). Ещё одна ошибка — запуск кода слишком рано, до того как WordPress понял, какая страница открыта.

Сломалась кнопка добавления в корзину

Если вы удалили класс ajax_add_to_cart, но не предусмотрели обычное поведение формы, кнопка может перестать работать как надо. В этом случае лучше не править HTML вручную, а отключать только скрипт, оставляя стандартную разметку WooCommerce.

После изменений кэш показывает старое поведение

Это особенно заметно на сайтах с page cache, CDN или серверным кэшированием. Очистите кэш на всех уровнях и проверьте страницу без кэша браузера. Если используется отдельный кэш для мобильной версии, проверьте и его.

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

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

Если на сайте много условной логики для WooCommerce, держите её в одном месте. Разрозненные куски кода в functions.php быстро превращаются в источник конфликтов. Для чистки и контроля технических настроек иногда удобно использовать инструменты вроде Clearfy Pro, но точечную логику отключения AJAX всё равно лучше держать в коде проекта: Clearfy Pro.

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

Когда лучше не отключать AJAX

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

Точечное отключение AJAX имеет смысл, когда есть конкретная страница, конкретный сценарий и понятная причина конфликта. Если причины нет, а вы просто «на всякий случай» убираете AJAX, это почти всегда лишний риск.

×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙