Почему стоит отключать AJAX в WooCommerce?
WooCommerce использует AJAX для обновления корзины, фильтров, мини-корзины и других элементов без перезагрузки страницы. Это улучшает пользовательский опыт, но при высокой нагрузке может привести к значительной нагрузке на сервер и замедлению сайта, особенно на shared-хостингах и при большом числе одновременных пользователей.
Отключение AJAX там, где он не критичен, помогает снизить количество запросов к серверу и улучшить производительность сайта.
Диагностика: как проверить, что AJAX вызывает нагрузку
- Включите мониторинг запросов в браузере (вкладка Network) и посмотрите, сколько ajax-запросов посылается при работе с корзиной и фильтрами.
- Используйте инструменты профилирования, например New Relic или Query Monitor, чтобы отследить нагрузку на admin-ajax.php.
- Обратите внимание на частоту и длительность ajax-запросов в WooCommerce в пиковые часы.
Пошаговое отключение AJAX в WooCommerce
1. Отключение AJAX для обновления мини-корзины
Мини-корзина обновляется с помощью AJAX по умолчанию. Чтобы отключить это, добавьте следующий код в functions.php вашей темы или в плагин-сниппет:
add_filter('woocommerce_add_to_cart_fragments', function($fragments) { return []; });Этот фильтр предотвращает обновление мини-корзины через AJAX.
2. Отключение AJAX для фильтров и сортировки
Если вы используете AJAX для фильтрации товаров, можно переключиться на классическую перезагрузку страницы. Для этого во многих темах и плагинах фильтра отключается соответствующая опция. Если нет, используйте следующий пример для отключения AJAX в WooCommerce Product Filter:
add_filter('woocommerce_layered_nav_link', function($link) { return str_replace('javascript:void(0);', $link, $link); });Или просто переключитесь в настройках плагина фильтра на режим без AJAX.
3. Отключение AJAX добавления товара в корзину на архивных страницах
Для отключения AJAX добавления в корзину на страницах каталога добавьте в functions.php:
add_filter('woocommerce_loop_add_to_cart_link', function($html) {</code><br><code> // Удаляем атрибут data-quantity и класс ajax_add_to_cart</code><br><code> $html = preg_replace('/data-quantity="[^"]*"/', '', $html);</code><br><code> $html = str_replace('ajax_add_to_cart', '', $html);</code><br><code> return $html;</code><br><code>}, 10);Как проверить, что отключение AJAX сработало
- Зайдите в браузер, включите вкладку «Network» в инструментах разработчика.
- Выполните действия: добавление товара в корзину, обновление корзины, применение фильтров.
- Убедитесь, что нет запросов к admin-ajax.php или что они существенно уменьшились.
- Проверьте работу корзины и фильтров — они должны работать с перезагрузкой страницы.
Частые ошибки при отключении AJAX и их исправление
- Ошибка: Мини-корзина не обновляется после добавления товара.
Решение: Проверьте, отключён ли фильтрwoocommerce_add_to_cart_fragments. При необходимости добавьте JavaScript для обновления страницы после добавления товара. - Ошибка: Фильтры перестали работать.
Решение: Убедитесь, что фильтры переключены в режим с перезагрузкой страницы, а не AJAX. Проверьте настройки используемых плагинов фильтрации. - Ошибка: Добавление товара не работает.
Решение: Проверьте, удалён ли классajax_add_to_cartи атрибутdata-quantityкорректно, иначе WooCommerce может пытаться выполнить AJAX-запрос.
Практические советы по безопасности и производительности
- Отключение AJAX снижает нагрузку на
admin-ajax.php, что уменьшает вероятность DDoS-атак, связанных с этим ресурсом. - Используйте кэширование страниц (например, с помощью плагинов WP Rocket, LiteSpeed Cache, или встроенных в сервер) для ускорения работы после отключения AJAX.
- Для сложных фильтров и сортировки рассмотрите использование серверного кэширования результатов или индексирования с помощью ElasticSearch или Algolia.
- Обязательно тестируйте изменения в staging-среде перед внедрением на живой сайт.
Сравнение способов отключения AJAX в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
Отключение через фильтр woocommerce_add_to_cart_fragments | Простота реализации, уменьшение AJAX-запросов | Мини-корзина не обновляется без перезагрузки |
Удаление класса ajax_add_to_cart на кнопках | Отключение AJAX добавления товара | Пользователь видит перезагрузку страницы |
| Отключение AJAX фильтров в настройках плагина | Контроль через UI, минимальные изменения кода | Зависимость от возможностей плагина |