В марте 2024 года Google тихо изменил правила игры. Метрика First Input Delay (FID) была заменена на Interaction to Next Paint (INP). Это не просто косметическое обновление, это фундаментальный сдвиг в том, как поисковик оценивает «быстроту» сайта.
Теперь недостаточно, чтобы первый клик обрабатывался моментально. Google измеряет каждое взаимодействие пользователя на протяжении всей сессии: скроллинг, клики по табам, раскрытие меню. Если ваш WordPress-сайт «тормозит» при взаимодействии (даже если изначально загрузился быстро), вы теряете позиции.
По данным Google, сайты, соответствующие Core Web Vitals, имеют на 24% меньше показателей отказов. В конкурентных нишах (e-commerce, финансы, медицина) разница между «хорошим» и «отличным» INP может определять, будете вы на первой странице выдачи или на третьей.
Эта статья не про «установите плагин WP Rocket и забудьте». Разберу стек оптимизации от сервера до браузера, как это делают в production-окружениях с нагрузкой 100K+ посетителей.
Часть 1. Core Web Vitals в 2025 году. Что изменилось и что измерять
Google теперь требует соответствия трём метрикам:
1. Largest Contentful Paint (LCP) — «Когда загрузился основной контент?»
Цель:
хорошо
требует улучшения
плохо
Менее 2.5 секунд
2.5–4 секунды
более 4 секунд
Что это: Время до отрисовки самого большого видимого элемента (обычно это hero-изображение, заголовок или первый блок текста).
Типичная ошибка в WordPress: Неоптимизированное изображение в шапке сайта весом 2–3 Мб в формате PNG.
2. Interaction to Next Paint (INP) — «Насколько отзывчив сайт?»
Цель:
хорошо
требует улучшения
плохо
Менее 200 мс
200–500 мс
более 500 мс
Что это: Задержка между действием пользователя (клик, тап) и визуальной реакцией интерфейса.
Типичная ошибка WordPress: Раздутый bundle.js от page builder’ов (Elementor, Divi), который блокирует главный поток браузера.
3. Cumulative Layout Shift (CLS) — «Прыгают ли элементы на странице?»
Цель:
хорошо
требует улучшения
плохо
Менее 0.1
0.1–0.25
более 0.25
Что это: «Дёргание» контента при загрузке (изображения без width и/или height, шрифты меняющие размер блоков, всплывающие баннеры).
Типичная ошибка WordPress: Google Fonts, загружающиеся асинхронно, сдвигают текст после рендера.
Часть 2. Серверная оптимизация
Фундамент скорости загрузки. Все плагины кэширования бесполезны, если наш сервер настроен «из коробки» хостингом или не настроен вовсе. Начинаем с базы.
Шаг 1. Nginx + FastCGI Cache (или Redis Full-Page Cache)
Проблема: Apache + mod_php обрабатывает каждый запрос через PHP, даже если контент статичен. Это убивает производительность даже при небольшой нагрузке.
Решение: Связка Nginx (фронтенд) + PHP-FPM (бэкенд) с кэшем на уровне веб-сервера. Либо, Nginx (фронтенд) + Apache (бэкенд), опять же, с кэшем на уровне веб-сервера.
Есть два подхода:
- FastCGI Cache (встроен в Nginx, файловый кэш).
- Redis Full-Page Cache (хранит HTML в оперативной памяти)
Преимущество Redis это скорость доступа к кэшу в 10–100 раз выше, чем к диску. Идеален для высоконагруженных проектов. Ну и, разумеется, при достаточном количестве оперативной памяти у сервера. Если это не так, то смотрим в сторону FastCGI Cache.
Вот пример настройки FastCGI Cache в Nginx:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
location ~ \.php$ {
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
add_header X-FastCGI-Cache $upstream_cache_status;
# ...
}
И конечно же, исключите из кэша админку, корзину, страницы для авторизованных пользователей и разные там запросы с гет-параметрами.
Шаг 2. Redis Object Cache для WordPress
Даже с page cache’ем WordPress выполняет десятки SQL-запросов (меню, виджеты, настройки темы и т.д.).
Решение: плагин Redis Object Cache. Использую его практически на каждом проекте. Это уменьшает количество запросов к MySQL практически в 10 раз.
Установка (на Ubuntu/Debian):
sudo apt install redis-server php-redis
sudo systemctl enable redis-server
Затем устанавливаем плагин Redis Object Cache через админку WordPress и активируем его.
Шаг 3. PHP OPcache + настройка лимитов
OPcache кэширует скомпилированный байт-код PHP, избегая парсинга файлов при каждом запросе. В php.ini (или /etc/php/8.2/fpm/conf.d/10-opcache.ini):
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
Также оптимизируем (увеличим) лимиты PHP-FPM, если его используем его (файл /etc/php/8.2/fpm/pool.d/www.conf):
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
Если нагрузка очень высокая (и постоянная), то стратегию управления рабочими процессами можно выбрать static. Это даст прирост скорости, но потребует больше оперативной памяти. Не забудьте после всех изменений перезапустить PHP-FPM.
Часть 3. Плагины кэширования. Что выбрать в 2025 году
Даже при наличии серверного кэша плагины нужны для минификации, отложенной загрузки JS, оптимизации CSS, создания html-страниц, gzip-сжатия и т.д.
Сравнение основных решений:
| Плагин | Плюсы | Минусы | Для кого |
|---|---|---|---|
| WP Rocket | Настраивается за 5 минут, автоматический Preload, Lazy Load, минификация | Платный ($59/год) | Владельцы сайтов, не слишком опытные it-специалисты |
| W3 Total Cache | Максимум настроек: database cache, fragment cache, CDN | Сложная конфигурация, легко «сломать» сайт | Опытные разработчики |
| WP Super Cache | Простой и надёжный | Устаревший интерфейс, меньше фич | Если не надо сильно заморачиваться |
Моя рекомендация для production:
- Если не разработчик, а сам ведешь сайт, то лучше WP Rocket (платный, но окупается).
- Если разработчик и готов настраивать и моричиться, то W3 Total Cache + Redis
- Если обычный проект и понимаешь что делаешь, то WP Super Cache и Redis
Часть 4. Боремся с INP, убиваем тяжёлый JavaScript
INP это новый босс Core Web Vitals. Его ломают Page Builder’ы генерирующие огромные JS-бандлы. Elementor, Divi, WPBakery подгружают по 300–500 КБ JavaScript на каждую страницу, даже если там простой текст.
Решение: Переходите на Gutenberg (Block Editor) или вовсе не используйте FSE метод. Верстайте тему самостоятельно, по-старинке.
Кроме Page Builder’ов есть ещё «Плагины-вампиры» дающие тот же результат. Каждый такой плагин добавляет свой JS/CSS глобально (на всех страницах), даже если используется только на какой-то одной.
Типичные виновники:
- Contact Form 7 (грузит скрипты везде, даже если формы нет на странице).
- WooCommerce (грузит
cart-fragments.js, убивающий INP даже на главной странице блога).
Решение: Отключайте скрипты там где они не нужны через wp_dequeue_script() в functions.php
Следующие пациенты Google Analytics / Yandex.metrika / Pixel / рекламные скрипты
Решение: Загружайте их через Partytown (Web Worker, который изолирует сторонние скрипты от главного потока) или откладывайте загрузку до взаимодействия пользователя.
Часть 5. Оптимизация изображений (WebP, Lazy Load и адаптивность)
Изображения это причина №1 медленного LCP
Во-первых, конвертация в WebP
WebP на 25–35% легче PNG при том же качестве.
Плагины:
- ShortPixel Image Optimizer (CDN + конвертация, freemium).
- Imagify (от WP Rocket).
- WebP Converter for Media (бесплатный, локальная конвертация).
Кроме плагинов с этой задачей прекрасно справляются всевозможные онлайн конвертеры.
Во-вторых, Adaptive Images через srcset
Не отдавайте мобильным пользователям изображение 2000×1500 px. WordPress автоматически генерирует srcset, но если изображение как фон к чему-нибудь, то тут надо все делать самостоятельно!
Далее, Lazy Loading
Встроен в WordPress с версии 5.5, но не надо применять Lazy Load к LCP-изображению (обычно это главное фото в hero-секции). Туда надо добавить атрибут loading="eager" или fetchpriority="high"
Часть 6. Победа над CLS (стабильность вёрстки)
Проблема №1: Изображения без размеров
Браузер не знает, сколько места зарезервировать, и контент «прыгает» при загрузке. Поэтому всегда указывайте width и height
Проблема №2: Google Fonts / веб-шрифты
Шрифты загружаются асинхронно и меняют размер текстовых блоков.
Решение: Preload критических шрифтов и используем font-display: swap:
<link rel="preload" href="/fonts/roboto.woff2" as="font" type="font/woff2" crossorigin>
В CSS:
@font-face {
font-family: 'Roboto';
src: url('/fonts/roboto.woff2') format('woff2');
font-display: swap;
}
Проблема №3: Рекламные баннеры и виджеты
Блоки AdSense, всплывающие формы и прочее
Решение: Резервируйте фиксированную высоту под баннеры в CSS или используйте min-height для контейнеров.
Финальный совет: В 2025 году уже луче не игнорировать Core Web Vitals. Потратьте время на комплексную оптимизацию, и вы обойдёте конкурентов даже с менее качественным контентом, потому что Google будет ранжировать ваш сайт выше за лучший UX. Каждая миллисекунда считается.