Что такое admin-ajax.php и почему он замедляет WooCommerce
Файл admin-ajax.php используется WordPress и WooCommerce для обработки AJAX-запросов, таких как обновление корзины, проверка наличия товара, уведомления и другие динамические функции. Однако на крупных или нагруженных сайтах чрезмерное количество AJAX-запросов приводит к значительной нагрузке на сервер и замедлению работы сайта.
WooCommerce по умолчанию загружает скрипт admin-ajax.php на всех страницах, что не всегда оправдано, особенно если у вас простой магазин с минимальным использованием AJAX-функций.
Диагностика: как проверить нагрузку от admin-ajax.php
Для анализа нагрузки и частоты AJAX-запросов используйте следующие методы:
- Откройте браузер, перейдите в Инструменты разработчика → Сеть (Network) и отфильтруйте запросы по
admin-ajax.php. Проверьте, как часто они выполняются и с какими параметрами. - Используйте плагины для мониторинга запросов, например Query Monitor, чтобы увидеть, сколько запросов и сколько времени занимает каждый.
- Проверьте журнал сервера (access.log), чтобы определить количество запросов к
admin-ajax.php.
Пошаговое отключение admin-ajax.php на фронтенде WooCommerce
Если ваш сайт не использует AJAX-функции WooCommerce на страницах, кроме корзины и оформления заказа, можно отключить загрузку скрипта на остальных страницах, чтобы снизить нагрузку.
Шаг 1. Добавьте код для отключения скрипта
В файл functions.php вашей дочерней темы или в пользовательский плагин вставьте следующий код:
function disable_woocommerce_admin_ajax_scripts() {
if ( function_exists('is_woocommerce') ) {
// Оставляем скрипт только на страницах корзины и оформления заказа
if ( ! is_cart() && ! is_checkout() ) {
wp_dequeue_script('wc-cart-fragments');
wp_deregister_script('wc-cart-fragments');
}
}
}
add_action('wp_enqueue_scripts', 'disable_woocommerce_admin_ajax_scripts', 99);Здесь wc-cart-fragments — скрипт WooCommerce, который отвечает за AJAX-обновление корзины и вызывает обращения к admin-ajax.php.
Шаг 2. Убедитесь, что AJAX-функции на корзине и оформлении заказа работают корректно
Этот код не отключит AJAX на страницах корзины (is_cart()) и оформления заказа (is_checkout()), где он необходим для обновления информации в реальном времени.
Как проверить, что решение сработало
- Откройте любую страницу сайта, кроме корзины и чекаута, и в консоли браузера во вкладке Сеть проверьте отсутствие запросов к
admin-ajax.php. - Перейдите на страницу корзины и оформления заказа, убедитесь, что корзина обновляется без перезагрузки и AJAX-запросы работают.
- Используйте Query Monitor или аналогичный инструмент для мониторинга количества запросов на разных страницах.
Частые ошибки и как их исправить
- Отключение скрипта вызывает ошибки на корзине или оформлении заказа. Проверьте условие
if ( ! is_cart() && ! is_checkout() ). Возможно, у вас нестандартные URL или кастомные страницы — добавьте их в условие. - Скрипт не отключается. Убедитесь, что ваш код подключается после WooCommerce (приоритет 99). Если тема или плагин подключают скрипты с более высоким приоритетом, увеличьте число приоритета.
- Отсутствие обновления корзины. Если отключили
wc-cart-fragmentsна страницах, где это необходимо, верните загрузку скрипта.
Практические советы по безопасности и производительности
- Используйте кеширование страниц (например, через плагин WP Rocket или серверный кеш), чтобы снизить количество PHP-запросов.
- Минимизируйте количество плагинов, которые используют AJAX запросы на всех страницах.
- Если нужны AJAX-функции, реализуйте их через REST API вместо
admin-ajax.php— это современный и более производительный способ. - Регулярно обновляйте WooCommerce и WordPress, чтобы избежать уязвимостей в AJAX-обработчиках.
Сравнение вариантов отключения admin-ajax.php в WooCommerce
| Способ | Преимущества | Недостатки |
|---|---|---|
| Отключение скрипта wc-cart-fragments на всех страницах, кроме корзины и чекаута | Значительное снижение AJAX-запросов, простота реализации | Может не подойти, если AJAX используется на других страницах |
| Полное отключение admin-ajax.php (через фильтры или плагины) | Максимальное снижение нагрузки | Потеря всех AJAX-функций WooCommerce и других плагинов |
| Переписать AJAX на REST API | Оптимальная производительность и безопасность | Требуется разработка и тестирование |