Оптимізація продуктивності 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 днів.







