Проблема: замедление сайта из-за AJAX подгрузки корзины в WooCommerce
В WooCommerce по умолчанию включена AJAX подгрузка фрагментов корзины (cart fragments), которая обновляет содержимое корзины на всех страницах без перезагрузки. Это удобно, но приводит к дополнительным AJAX-запросам к серверу при каждой загрузке страницы, что заметно снижает производительность и увеличивает время отклика, особенно на сайтах с большим трафиком.
Как диагностировать проблему с cart fragments
- Откройте сайт в браузере и запустите DevTools (F12).
- Перейдите на вкладку Network (Сеть) и обновите страницу.
- Найдите запросы к
/?wc-ajax=get_refreshed_fragments. - Если такие запросы есть и занимают значительное время, значит AJAX подгрузка корзины активна.
Также можно заметить увеличение использования CPU и задержки при загрузке страниц.
Пошаговое решение: отключение AJAX подгрузки корзины
Для отключения AJAX подгрузки корзины в WooCommerce достаточно удалить действие, которое добавляет скрипт cart fragments и очистить связанные стили и скрипты.
add_action('wp_enqueue_scripts', function() {
wp_dequeue_script('wc-cart-fragments');
wp_deregister_script('wc-cart-fragments');
}, 11);Добавьте этот код в файл functions.php вашей темы или в кастомный плагин.
Объяснение кода
wp_dequeue_scriptотключает загрузку скрипта cart fragments.wp_deregister_scriptудаляет регистрацию скрипта, чтобы избежать повторной загрузки.- Хук
wp_enqueue_scriptsс приоритетом 11 позволяет выполнить код после того, как WooCommerce добавляет свои скрипты.
Дополнительный вариант: убрать AJAX только на определённых страницах
add_action('wp_enqueue_scripts', function() {
if (is_front_page() || is_home()) {
wp_dequeue_script('wc-cart-fragments');
wp_deregister_script('wc-cart-fragments');
}
}, 11);Этот вариант отключит AJAX подгрузку корзины только на главной странице и странице блога, сохраняя функциональность на страницах магазина.
Проверка результата после внедрения
- Очистите кэш браузера и кеш плагинов, если они используются.
- Обновите страницу сайта и снова проверьте вкладку Network в DevTools.
- Запросы к
/?wc-ajax=get_refreshed_fragmentsдолжны отсутствовать. - Измените количество товаров в корзине и убедитесь, что обновление корзины происходит только после перезагрузки страницы.
Частые ошибки и как их исправить
- Код не работает из-за неправильного приоритета хука: убедитесь, что приоритет хука в
add_action('wp_enqueue_scripts', ...)больше 10, например, 11, иначе скрипт не будет отключен. - Обновление корзины не происходит как ожидалось: после отключения cart fragments обновление корзины не будет динамическим. Нужно информировать пользователей, что корзина обновляется при перезагрузке страницы.
- Кэширование мешает проверке: отключите кэш браузера и серверные кэши перед тестированием.
- Проблемы с совместимостью плагинов: некоторые плагины могут зависеть от AJAX подгрузки корзины. Проверьте функциональность сайта после отключения.
Практические советы по производительности и безопасности
- Отключайте cart fragments на страницах, где динамическое обновление корзины не критично (например, главная, блог).
- Используйте кэширование страниц вместе с отключением AJAX подгрузки для максимальной производительности.
- Проверяйте совместимость с кеширующими плагинами (WP Rocket, W3 Total Cache) — отключение cart fragments улучшает их работу.
- Избегайте отключения cart fragments на страницах оформления заказа и корзины, чтобы не сломать UX.
Сравнение способов отключения AJAX подгрузки корзины
| Способ | Плюсы | Минусы |
|---|---|---|
| Отключение через wp_dequeue_script | Простота, без дополнительных плагинов | Полная потеря динамического обновления корзины |
| Отключение через плагин (например, Disable Cart Fragments) | Удобство, настройки через админку | Дополнительный плагин, возможные конфликты |
| Оставить как есть | Полная функциональность AJAX | Дополнительные запросы, нагрузка на сервер |