В WooCommerce AJAX-добавление в корзину удобно не всегда. На простых товарах оно ускоряет покупку, но на части магазинов начинает мешать: не обновляется мини-корзина, не срабатывают кастомные проверки, ломается поведение вариативных товаров или появляется конфликт с темой. В таких случаях лучше отключать AJAX не глобально, а точечно — только для нужных товаров или категорий.
Когда это действительно нужно
Типичный сценарий: на карточке товара кнопка Добавить в корзину срабатывает без перезагрузки, но после этого пользователь не видит изменения цены, не получает нужное уведомление или не может корректно выбрать опции. Ещё один частый случай — магазин использует дополнительные проверки перед добавлением в корзину, и AJAX-обработчик обходит часть логики темы или плагина.
Что обычно ломается
- не обновляется мини-корзина в шапке;
- не показываются сообщения WooCommerce после добавления;
- не срабатывают ограничения по роли, складу или минимальному количеству;
- вариативный товар ведёт себя нестабильно в каталоге;
- кнопка в каталоге добавляет товар, но пользователь не понимает, что произошло.
Диагностика проблемы
Сначала проверьте, где именно включён AJAX. В стандартном WooCommerce AJAX-добавление чаще всего работает в каталоге для простых товаров. Если проблема проявляется только на отдельных карточках, не спешите отключать его везде — возможно, достаточно убрать AJAX только для конкретного типа товара или категории.
Полезно проверить три вещи:
- какой тип товара используется: простой, вариативный, внешний;
- есть ли у товара кастомные поля, связанные с валидацией;
- не переопределяет ли тема шаблон кнопки
add-to-cartили скрипты корзины.
Если после отключения всех плагинов кроме WooCommerce проблема исчезает, значит конфликт не в самом AJAX, а в обработчике темы или расширения. Это важно: в таком случае лучше не лечить симптом глобальным отключением, а ограничить его только для проблемных товаров.
Варианты решения: плагин, код или компромисс
| Подход | Когда подходит | Минус |
|---|---|---|
| Плагин | Нужно быстро отключить AJAX для всего магазина | Меньше контроля, лишняя зависимость |
| Код | Нужно отключить AJAX только для части товаров | Требует проверки после обновлений темы |
| Компромисс | Отключить AJAX только в каталоге, оставить на карточке | Нужно аккуратно тестировать UX |
Пошаговое решение через код
Ниже пример, который отключает AJAX-добавление в корзину только для товаров из определённой категории. Это удобнее, чем выключать поведение для всего магазина.
<?php
add_filter( 'woocommerce_loop_add_to_cart_link', 'wpnews_disable_ajax_add_to_cart_for_category', 10, 2 );
function wpnews_disable_ajax_add_to_cart_for_category( $html, $product ) {
if ( ! $product instanceof WC_Product ) {
return $html;
}
// Например, отключаем AJAX для товаров из категории 'custom-products'.
if ( has_term( 'custom-products', 'product_cat', $product->get_id() ) ) {
$html = str_replace( 'ajax_add_to_cart', '', $html );
}
return $html;
}
Этот вариант убирает AJAX-класс у кнопки в каталоге. В результате WooCommerce перестаёт отправлять товар асинхронно и использует обычный переход. Для части магазинов этого достаточно, особенно если проблема возникает именно в листинге товаров.
Если нужно отключить AJAX для всех товаров в каталоге, можно использовать более прямой фильтр:
<?php
add_filter( 'woocommerce_loop_add_to_cart_args', 'wpnews_disable_ajax_add_to_cart_globally' );
function wpnews_disable_ajax_add_to_cart_globally( $args ) {
if ( isset( $args['class'] ) ) {
$args['class'] = str_replace( 'ajax_add_to_cart', '', $args['class'] );
}
return $args;
}
Этот способ проще, но он уже влияет на весь каталог. Если у вас есть отдельные товары, где AJAX работает нормально, лучше не использовать глобальный вариант без необходимости.
Если нужно отключить AJAX только для отдельных товаров
Иногда удобнее ориентироваться не на категорию, а на список ID товаров. Это полезно, когда проблема касается нескольких конкретных карточек и не затрагивает весь раздел.
<?php
add_filter( 'woocommerce_loop_add_to_cart_args', 'wpnews_disable_ajax_for_specific_products', 10, 2 );
function wpnews_disable_ajax_for_specific_products( $args, $product ) {
$disabled_products = array( 123, 456, 789 );
if ( $product instanceof WC_Product && in_array( $product->get_id(), $disabled_products, true ) ) {
if ( isset( $args['class'] ) ) {
$args['class'] = str_replace( 'ajax_add_to_cart', '', $args['class'] );
}
}
return $args;
}
Как проверить, что решение сработало
После внедрения не ограничивайтесь визуальной проверкой кнопки. Нужно убедиться, что WooCommerce действительно перестал использовать AJAX там, где вы этого добивались.
- Откройте каталог в режиме инкогнито и нажмите
Добавить в корзинуу нужного товара. - Проверьте, происходит ли обычная перезагрузка страницы или переход на корзину.
- Убедитесь, что мини-корзина обновляется корректно после ручного обновления страницы.
- Посмотрите, не исчезли ли сообщения WooCommerce о добавлении товара.
- Проверьте товар с вариациями отдельно: для них поведение может отличаться от простых товаров.
Если у вас включён кэш страниц, очистите его после изменения кода. Иначе можно увидеть старую версию кнопки и сделать ложный вывод, что фильтр не работает.
Частые ошибки и как их исправить
Скрипт отключили, но AJAX всё равно работает
Частая причина — тема или плагин добавляют собственную кнопку с классом ajax_add_to_cart вне стандартных шаблонов WooCommerce. В этом случае фильтр на PHP может не затронуть кастомный вывод. Нужно проверить шаблон карточки товара и разметку кнопки.
Сломались вариативные товары
Если вы отключили AJAX слишком агрессивно, а тема рассчитывала на асинхронное обновление, вариативный товар может начать вести себя нестабильно. Обычно помогает ограничить изменение только каталогом, а на странице товара оставить стандартную логику WooCommerce.
После правки кнопка стала выглядеть странно
Такое бывает, если в class остались лишние пробелы или удаление строки затронуло другие CSS-классы. Лучше использовать точечную замену ajax_add_to_cart, а не переписывать весь набор классов вручную.
Изменение пропало после обновления темы
Если код был вставлен прямо в файл темы, обновление могло его затереть. Для таких правок безопаснее использовать дочернюю тему или небольшой mu-plugin. Это особенно важно, если магазин активно обновляется.
Практические советы по безопасности и производительности
Отключение AJAX само по себе не ускоряет магазин автоматически. Иногда оно даже делает поведение понятнее, но добавляет лишнюю перезагрузку страницы. Поэтому решение стоит принимать по конкретной проблеме, а не «на всякий случай».
- не отключайте AJAX глобально, если он нужен для нормального UX в части каталога;
- проверяйте изменения на staging-окружении, а не сразу на боевом сайте;
- если правите код вручную, храните его в дочерней теме или mu-plugin;
- после изменений очистите кэш плагина, сервера и CDN, если он используется;
- не смешивайте несколько фильтров, которые одновременно меняют кнопку
Add to cart, без теста на разных типах товаров.
Если задача шире и вам нужно не только отключить AJAX, но и убрать лишние дубли, сообщения или другие элементы интерфейса WooCommerce, имеет смысл сначала описать сценарий целиком. В некоторых проектах часть таких правок удобнее собрать в отдельный набор оптимизаций, а не размазывать по теме и плагинам.
В итоге рабочая схема простая: сначала локализуйте, где именно AJAX мешает, затем отключайте его точечно и обязательно проверяйте поведение на реальных товарах. Для WooCommerce это почти всегда надёжнее, чем глобальный «рубильник».