Оптимизация производительности WordPress (кэширование, БД)
WordPress с дефолтными настройками медленный: каждый запрос к странице выполняет 30–100 SQL-запросов, загружает десятки плагинов и генерирует HTML заново. Правильная оптимизация даёт Time to First Byte < 200 мс и Core Web Vitals в зелёной зоне.
Аудит: что тормозит
Перед оптимизацией — измерение. Инструменты:
- Query Monitor (плагин) — показывает все SQL-запросы, хуки, медленные запросы по каждой странице
- New Relic или Tideways — профилировщик PHP для production
- GTmetrix / PageSpeed Insights — внешние метрики
Типичные причины медленной работы:
- Нет PHP OPcache
- Нет object cache (Memcached/Redis)
- Медленные плагины (плагин ≠ виновник, но WP_Query внутри — часто)
- Таблица
wp_optionsс тысячами autoload-опций - Огромная таблица
wp_postmeta - Нет кэширования страниц
PHP OPcache
# /etc/php/8.3/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=0 ; 0 в production (не проверяем изменения)
opcache.validate_timestamps=0 ; 0 в production
opcache.fast_shutdown=1
opcache.jit=tracing
opcache.jit_buffer_size=64m
Прирост от OPcache — 30–50% снижение времени выполнения PHP.
Redis для object cache
apt install redis-server
# В WordPress
composer require wpackagist-plugin/redis-cache
wp-config.php:
define('WP_CACHE_KEY_SALT', 'yourdomain.com_');
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);
Redis кэширует результаты WP_Query, опции (get_option), данные пользователей. Повторный запрос к одной странице: с Redis — 1–5 SQL-запросов вместо 30–100.
Кэширование страниц
Для высоконагруженных сайтов — Nginx FastCGI Cache (минуя PHP полностью):
fastcgi_cache_path /var/cache/nginx/wordpress levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
server {
location ~ \.php$ {
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 60m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# Не кэшируем авторизованных пользователей и корзину
set $skip_cache 0;
if ($http_cookie ~* "wordpress_logged_in|woocommerce_cart_hash") {
set $skip_cache 1;
}
if ($request_method = POST) { set $skip_cache 1; }
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
# ...
}
}
Кэшированные страницы отдаются с TTFB < 10 мс.
Очистка базы данных
-- Удаление старых ревизий (оставить последние 5 на пост)
DELETE p FROM wp_posts p
LEFT JOIN (
SELECT ID FROM wp_posts
WHERE post_type = 'revision'
ORDER BY post_date DESC
LIMIT 5
) keep ON p.ID = keep.ID
WHERE p.post_type = 'revision' AND keep.ID IS NULL;
-- Удаление орфанных postmeta
DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON p.ID = pm.post_id
WHERE p.ID IS NULL;
-- Анализ autoload options (причина медленного get_option)
SELECT option_name, LENGTH(option_value) as size
FROM wp_options
WHERE autoload = 'yes'
ORDER BY size DESC
LIMIT 20;
-- Отключить autoload для ненужных опций
UPDATE wp_options SET autoload = 'no'
WHERE option_name IN ('_transient_some_plugin_cache', 'some_large_option');
Оптимизация изображений
// Конвертация в WebP при загрузке (через Imagick)
add_filter('wp_handle_upload', function (array $upload): array {
if (!str_starts_with($upload['type'], 'image/')) return $upload;
$image = new Imagick($upload['file']);
$image->setImageFormat('webp');
$image->setOption('webp:lossless', 'false');
$image->setCompressionQuality(82);
$webp_path = preg_replace('/\.(jpe?g|png)$/i', '.webp', $upload['file']);
$image->writeImage($webp_path);
return $upload;
});
Или через плагин ShortPixel / Imagify с интеграцией CDN.
Результаты типичной оптимизации
| Метрика | До | После |
|---|---|---|
| TTFB (без кэша) | 800–2000 мс | 150–400 мс |
| TTFB (с FastCGI кэшем) | — | 5–15 мс |
| SQL-запросов на страницу | 60–120 | 5–15 |
| LCP | 3–6 с | 1–2 с |
Сроки
Базовая оптимизация (OPcache, Redis, очистка БД, кэш страниц) — 2–3 дня. Полный аудит с профилировкой и оптимизацией медленных запросов — 5–7 дней.







