Диагностика проблемы: зачем и когда отключать AJAX в WooCommerce
WooCommerce использует AJAX для обновления корзины, фильтров товаров, пагинации и других элементов без перезагрузки страницы. Это улучшает UX, но может вызвать проблемы с производительностью, совместимостью плагинов или кастомными скриптами. Иногда нужно selectively отключить AJAX на определённых страницах (например, на странице оформления заказа или в разделе блога), чтобы избежать конфликтов или уменьшить нагрузку.
Как понять, что AJAX вызывает проблему?
- Видны ошибки в консоли браузера при обновлении корзины или фильтров.
- После обновления WooCommerce или темы функционал AJAX перестал работать корректно.
- Появляются конфликты с кастомными скриптами на отдельных страницах.
- Хочется улучшить производительность на страницах, где AJAX не нужен.
Пошаговое решение: отключение AJAX WooCommerce на отдельных страницах
WooCommerce AJAX обычно задействован в следующих функциях:
- Обновление корзины в шапке
- Фильтры товаров
- Добавление товара в корзину без перезагрузки
- Обновление мини-корзины (widget)
Для отключения AJAX на странице можно использовать фильтры и условные теги WordPress.
Отключение AJAX добавления товара в корзину на странице товара
Добавьте в functions.php вашей темы или в плагин следующий код:
add_filter('woocommerce_is_ajax_add_to_cart_enabled', function($enabled) {
if (is_product()) { // отключаем AJAX на странице товара
return false;
}
return $enabled;
});Отключение AJAX обновления мини-корзины на страницах, кроме магазина
add_filter('woocommerce_widget_cart_is_hidden', function($hidden) {
if (!is_shop() && !is_product_category() && !is_product_tag()) {
// Скрываем мини-корзину с AJAX на всех страницах, кроме каталога
return true;
}
return $hidden;
});Отключение AJAX фильтров товаров на страницах архива
Если вы используете кастомные фильтры с AJAX (например, в виджетах или плагинах), отключить их проще всего, сняв инициализацию JS через условие в enqueue скриптов:
function disable_ajax_filters_on_pages() {
if (is_page('blog') || is_page('checkout')) {
wp_dequeue_script('your-ajax-filter-script-handle');
}
}
add_action('wp_enqueue_scripts', 'disable_ajax_filters_on_pages', 20);Проверка результата после внедрения
- Откройте страницу продукта и попробуйте добавить товар в корзину — должно произойти полное обновление страницы, а не AJAX-запрос.
- Перейдите на страницу магазина — AJAX добавление товара и обновление мини-корзины должны работать.
- Проверьте консоль разработчика (F12) — отсутствие ошибок JS при действиях с корзиной и фильтрами.
- Тестируйте на мобильных устройствах и в разных браузерах для подтверждения стабильной работы.
Частые ошибки и как их исправить
- Неправильный хук для отключения скриптов: используйте
wp_enqueue_scriptsс приоритетом не менее 20, чтобы ваши изменения применились после основного подключения скриптов. - Ошибка в условных тегах: убедитесь, что используете правильные функции, например
is_product(),is_shop(),is_page(). Для нестандартных страниц может потребоваться дополнительная проверка. - Отключение AJAX влияет на UX: внимательно тестируйте, чтобы не ухудшить пользовательский опыт, особенно на страницах магазина.
- Конфликты с другими плагинами: если AJAX не отключается, проверьте, нет ли плагинов, которые повторно подключают скрипты или используют свои хуки.
Практические советы по безопасности и производительности
- Отключайте AJAX только там, где это действительно нужно — лишние перезагрузки страниц увеличивают нагрузку на сервер и снижают скорость.
- Используйте условные теги, чтобы таргетировать конкретные страницы без глобальных изменений.
- Для сложных сценариев с большим количеством AJAX-запросов рекомендуем использовать профилировщики (например, Query Monitor) для выявления узких мест.
- Регулярно обновляйте WooCommerce и тему, чтобы избежать несовместимостей с AJAX-функциями.
Сравнение вариантов отключения AJAX в WooCommerce
| Метод | Где отключает | Преимущества | Недостатки |
|---|---|---|---|
Фильтр woocommerce_is_ajax_add_to_cart_enabled | Страница товара | Простое и быстрое отключение AJAX добавления товара | Не отключает AJAX на других страницах |
Фильтр woocommerce_widget_cart_is_hidden | Мини-корзина вне магазина | Отключает обновление мини-корзины AJAX | Мини-корзина скрывается, UX ухудшается |
Отключение скриптов через wp_dequeue_script | Любые страницы, по условию | Гибкий контроль над скриптами AJAX | Требует знать точные хендлы скриптов |