В 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, это почти всегда лишний риск.