Коротко: Установите WP Super Cache (статические HTML-файлы вместо PHP каждый раз), сожмите изображения через Smush, включите gzip в .htaccess, отключите XML-RPC и emoji. Эти 5 шагов давали снижение времени загрузки с 6-8 сек до 1.5-2 сек на типичном кыргызстанском 3G.
Исходная ситуация
Типичный клиентский WordPress сайт в Бишкеке в 2015 году:
- Хостинг: виртуальный, 512 МБ RAM, $5/мес
- WordPress 4.3 + 12 плагинов + премиум тема
- Время загрузки: 7.2 секунды (GTmetrix, Almaty сервер)
- Размер страницы: 2.8 МБ
- Запросов к серверу: 68
Цель: < 2 секунд, < 1 МБ, < 30 запросов.
Шаг 1: WP Super Cache
# Установить через WP Admin или WP-CLI
wp plugin install wp-super-cache --activate
# Настройки: WP Admin → Settings → WP Super Cache
# ✓ Cache Hits to this website → Enabled
# ✓ Cache delivery method → mod_rewrite (самый быстрый)
# ✓ Compress pages (gzip)
# ✓ Cache rebuild → enabled
# .htaccess - автоматически добавляется WP Super Cache
# Секция mod_rewrite для статического кэша:
# BEGIN WPSuperCache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# Не кэшировать для залогиненных пользователей
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress_(?!test_cookie)|wp-postpass_).*$
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz -f
RewriteRule ^(.*) "/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz" [L]
</IfModule>
# END WPSuperCache
После включения: время загрузки упало с 7.2 до 2.8 секунды. PHP не вызывается при каждом запросе - отдаётся готовый HTML файл.
Шаг 2: Оптимизация изображений
# В 2015: плагин Smush или ручная оптимизация
wp plugin install wp-smushit --activate
# Смажем все существующие изображения
wp smush-img --all
// functions.php - добавить в тему
// Ограничить размер загружаемых изображений
add_filter('wp_handle_upload_prefilter', function($file) {
// Максимум 800KB для загружаемых изображений
if ($file['size'] > 800 * 1024) {
$file['error'] = 'Изображение слишком большое. Максимум 800KB.';
}
return $file;
});
// Убрать лишние размеры изображений
// WordPress создаёт thumbnail/medium/large/full - нам нужны не все
add_filter('intermediate_image_sizes_advanced', function($sizes) {
unset($sizes['medium_large']); // Добавлен в WP 4.4, нам не нужен
return $sizes;
});
Шаг 3: Отключить XML-RPC и Emoji
// functions.php
// Отключить XML-RPC (атаки bruteforce, не нужен если нет мобильного приложения)
add_filter('xmlrpc_enabled', '__return_false');
// Удалить emoji JavaScript (50KB на каждой странице)
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
// Удалить query strings из статических файлов (кэширование CDN)
function remove_wp_ver_css_js($src) {
if (strpos($src, 'ver=')) {
$src = remove_query_arg('ver', $src);
}
return $src;
}
add_filter('style_loader_src', 'remove_wp_ver_css_js', 9999);
add_filter('script_loader_src', 'remove_wp_ver_css_js', 9999);
Шаг 4: Минификация CSS/JS
# Плагин Autoptimize - минификация и конкатенация
wp plugin install autoptimize --activate
// wp-config.php - дополнительные настройки
define('AUTOPTIMIZE_CACHE_NOGZIP', false); // Включить gzip сжатие
// Настройки в WP Admin → Settings → Autoptimize:
// ✓ Optimize JavaScript Code
// ✓ Aggregate JS-files (объединить в один файл)
// ✓ Optimize CSS Code
// ✓ Aggregate CSS-files
// ✓ Remove Google Fonts (если не используются)
// ✓ Optimize HTML Code
Шаг 5: Настройка .htaccess (браузерное кэширование + gzip)
# .htaccess - добавить перед # BEGIN WordPress
# Gzip компрессия
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain text/html text/xml
AddOutputFilterByType DEFLATE text/css application/javascript
AddOutputFilterByType DEFLATE application/json application/xml
</IfModule>
# Браузерное кэширование
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
# Keep-Alive
<IfModule mod_headers.c>
Header set Connection keep-alive
</IfModule>
Результаты после всех шагов
| Метрика | До | После |
|---|---|---|
| Время загрузки (GTmetrix) | 7.2 с | 1.2 с |
| Размер страницы | 2.8 МБ | 680 КБ |
| Запросов HTTP | 68 | 22 |
| GTmetrix Score | D (52%) | A (94%) |
На 3G соединении 3 Мбит/с - с 8 секунд до 1.8 секунды. Для аудитории с мобильным интернетом это разница между «зашёл на сайт» и «закрыл вкладку».
Важно: что НЕ стоило делать
Не устанавливайте Jetpack ради одной функции. Jetpack в 2015 грузил 200+ KB JavaScript. Если нужна только форма подписки - Contact Form 7.
Не используйте слайдеры. Revolution Slider добавлял 1.5 МБ JavaScript и CSS. Клиенты очень хотели «красивый слайдер». Мы объясняли: на 3G в Бишкеке его никто не дожидается.
Не включайте все виджеты боковой панели. Виджет «Последние записи» делает отдельный SQL-запрос. 8 виджетов = 8 дополнительных запросов.