Почему нужно отключать AJAX для некоторых товаров в WooCommerce
AJAX добавление товаров в корзину в WooCommerce улучшает UX — страница не перезагружается, пользователь видит обновления мгновенно. Однако для некоторых товаров (например, с вариациями, индивидуальными настройками или внешними ссылками) AJAX может приводить к ошибкам или некорректному поведению. В таких случаях стоит отключить AJAX для выбранных товаров.
Диагностика: как понять, что AJAX мешает
Основные признаки проблем с AJAX добавлением в корзину:
- При клике на кнопку «В корзину» ничего не происходит или появляется ошибка JavaScript;
- Товар с вариациями не добавляется корректно без перезагрузки;
- Пользователь не видит изменений корзины без обновления страницы;
- Конфликты с кастомными скриптами или плагинами, работающими с товарами.
Для диагностики откройте консоль браузера (F12 → Console) и проверьте наличие ошибок JS при попытке добавить товар в корзину. Если ошибки связаны с AJAX, имеет смысл отключить AJAX для проблемных товаров.
Пошаговое решение: отключаем AJAX добавление для выбранных товаров
Рассмотрим пример, как отключить AJAX добавление в корзину для товаров с определённой категорией или по ID. Для этого нужно переопределить атрибут кнопки «Добавить в корзину» и отключить AJAX для этих товаров.
1. Определяем товары для отключения AJAX
Допустим, у вас есть категория товаров с ярлыком no-ajax, для которых нужно отключить AJAX.
2. Добавляем код в functions.php темы или в кастомный плагин
add_filter('woocommerce_loop_add_to_cart_link', 'disable_ajax_add_to_cart_for_specific_products', 10, 2);
function disable_ajax_add_to_cart_for_specific_products($html, $product) {
if ( has_term('no-ajax', 'product_cat', $product->get_id()) ) {
// Удаляем класс ajax_add_to_cart
$html = str_replace('ajax_add_to_cart', '', $html);
// Добавляем data-attribute для отладки (необязательно)
$html = str_replace('add_to_cart_button', 'add_to_cart_button no-ajax-button', $html);
}
return $html;
}Этот фильтр удалит класс ajax_add_to_cart у кнопок добавления товаров из категории no-ajax, что отключит AJAX для них.
3. Отключаем AJAX добавление на странице одиночного товара для тех же товаров
AJAX добавление может быть активным и на странице товара, поэтому дополнительно отключим скрипт для нужных товаров.
add_action('wp_enqueue_scripts', 'conditionally_disable_ajax_add_to_cart_script');
function conditionally_disable_ajax_add_to_cart_script() {
if (is_product()) {
global $product;
if ($product && has_term('no-ajax', 'product_cat', $product->get_id())) {
wp_dequeue_script('wc-add-to-cart');
}
}
}Проверка результата: как убедиться, что AJAX отключен
- Откройте страницу товара из категории
no-ajaxи кликните кнопку «Добавить в корзину» — страница должна перезагрузиться, а не сработать AJAX. - Проверьте консоль разработчика (F12 → Console) на отсутствие ошибок.
- Добавьте товар из другой категории — AJAX должен работать как обычно.
Частые ошибки и как их исправить
- Ошибка: Кнопка не работает или не отображается.
Причина: Некорректное удаление класса или конфликт с темой.
Решение: Проверьте точность фильтра, используйте дебаг сvar_dumpдля товара. - Ошибка: AJAX отключен для всех товаров.
Причина: Неправильно указан фильтр, например, опечатка в слаге категории.
Решение: Убедитесь, чтоhas_term()корректно проверяет категорию. - Ошибка: Скрипт
wc-add-to-cartне деактивируется на странице товара.
Причина: Условиеis_product()не сработало из-за кеширования.
Решение: Очистите кеш, отключите CDN, проверьте условия в шаблоне.
Практические советы по производительности и безопасности
- Отключайте AJAX только для тех товаров, где это действительно нужно, чтобы не ухудшать UX.
- Используйте минимальный набор условий в коде, чтобы не замедлять загрузку страниц.
- Проверяйте совместимость с вашим кеширующим плагином — иногда кеширование ломает динамические функции WooCommerce.
- Для безопасности избегайте прямого вывода данных без экранирования.
Сравнение подходов: плагин vs кастомный код
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, Disable AJAX Add to Cart) | Быстрое решение, не требует кода, поддержка обновлений | Может быть тяжеловесным, не всегда гибкий, лишние функции |
| Кастомный код (как в статье) | Лёгкий, заточен под конкретные задачи, полный контроль | Требует навыков, нужно поддерживать самому |