Почему важно оптимизировать загрузку WordPress без плагинов
Многие владельцы сайтов на WordPress стремятся улучшить скорость загрузки своих ресурсов, чтобы повысить удобство для пользователей и улучшить SEO-показатели. Обычно для этого применяются специализированные плагины, однако они могут создавать дополнительную нагрузку и конфликты, а также увеличивать размер сайта. Поэтому оптимизация загрузки без плагинов — это важный навык для разработчиков и администраторов сайтов, который позволяет добиться максимальной производительности и контроля.
В этой статье мы разберём, как оптимизировать загрузку CSS, JavaScript и изображений, а также управлять кэшированием и минимизацией кода, используя собственные функции в теме или в файле functions.php. Все решения будут сопровождаться примерами кода, которые вы сможете адаптировать под свои проекты.
Оптимизация загрузки CSS и JavaScript
Асинхронная и отложенная загрузка скриптов
Одной из распространённых причин замедления загрузки страниц является блокирующая загрузка JavaScript. Если скрипты загружаются в <head> и выполняются синхронно, браузер не может продолжить рендеринг страницы, пока не загрузит и не выполнит все скрипты.
Решением является загрузка скриптов асинхронно или с отложенным выполнением. Для этого можно использовать атрибуты async или defer в тегах <script>. В WordPress это можно реализовать, изменяя параметры в функции wp_enqueue_script.
Пример функции для добавления атрибута defer к скриптам:
function wpunit_add_defer_attribute( $tag, $handle ) {
$scripts_to_defer = array('wpunit-script'); // Замените на свои хендлы скриптов
if ( in_array( $handle, $scripts_to_defer ) ) {
return str_replace( ' src', ' defer src', $tag );
}
return $tag;
}
add_filter( 'script_loader_tag', 'wpunit_add_defer_attribute', 10, 2 );Регистрация и подключение скрипта с указанным хендлом:
function wpunit_enqueue_scripts() {
wp_enqueue_script( 'wpunit-script', get_template_directory_uri() . '/js/script.js', array(), null, true );
}
add_action( 'wp_enqueue_scripts', 'wpunit_enqueue_scripts' );Таким образом, скрипт script.js будет загружаться с атрибутом defer, что позволит браузеру продолжать рендеринг страницы параллельно с загрузкой скрипта.
Минификация и объединение CSS и JS вручную
Хотя существуют плагины для минификации, вы можете самостоятельно минифицировать и объединять файлы CSS и JS на этапе сборки сайта с помощью инструментов вроде Gulp, Webpack или даже онлайн-сервисов. Это уменьшит количество HTTP-запросов и объём передаваемых данных.
После минификации рекомендуется подключать объединённые файлы в теме следующим образом:
function wpunit_enqueue_minified_assets() {
wp_enqueue_style( 'wpunit-style', get_template_directory_uri() . '/css/style.min.css', array(), null );
wp_enqueue_script( 'wpunit-script', get_template_directory_uri() . '/js/scripts.min.js', array(), null, true );
}
add_action( 'wp_enqueue_scripts', 'wpunit_enqueue_minified_assets' );Обратите внимание на параметр true в wp_enqueue_script, который указывает загружать скрипт в футере, что также ускоряет отображение контента.
Оптимизация изображений без плагинов
Использование современных форматов и атрибутов
Изображения часто занимают большую часть трафика сайта. Переход на современные форматы, такие как WebP, и использование атрибутов loading="lazy" для отложенной загрузки — одни из эффективных приёмов.
Вы можете конвертировать изображения в WebP вручную или с помощью инструментов на локальной машине, а затем загружать их на сайт. Для автоматизации отображения WebP в WordPress можно использовать следующий фильтр, который будет подменять URL изображений на WebP, если браузер поддерживает этот формат:
function wpunit_replace_img_with_webp( $html, $id, $caption, $title, $align, $url, $size, $alt ) {
if ( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false ) {
$webp_url = preg_replace( '/\.(jpg|jpeg|png)$/i', '.webp', $url );
if ( file_exists( str_replace( home_url('/'), ABSPATH, $webp_url ) ) ) {
$html = str_replace( $url, $webp_url, $html );
}
}
return $html;
}
add_filter( 'image_send_to_editor', 'wpunit_replace_img_with_webp', 10, 8 );Для отложенной загрузки достаточно добавить атрибут loading="lazy" к тегам <img>. Если вы выводите изображения вручную, добавьте этот атрибут в шаблоне.
Оптимизация размеров изображений
Важно загружать на страницу изображения с максимально подходящим размером. WordPress умеет автоматически создавать несколько размеров при загрузке, и вы можете выбирать нужный размер в коде:
echo wp_get_attachment_image( $attachment_id, 'medium', false, array( 'loading' => 'lazy' ) );Используйте функции add_image_size для добавления кастомных размеров под дизайн вашего сайта, чтобы не загружать слишком большие или слишком маленькие изображения.
Кэширование и контроль заголовков
Установка заголовков кэширования через .htaccess
Кэширование статических файлов значительно ускоряет повторные загрузки страниц. Для сайтов на Apache можно добавить правила в файл .htaccess для установки заголовков кэширования:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/webp "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>Это укажет браузерам хранить ресурсы в кэше указанное время, что уменьшит количество запросов к серверу.
Пример создания пользовательского кэша для AJAX-запросов
Если на сайте используются AJAX-запросы, их результаты тоже можно кэшировать, чтобы снизить нагрузку. Ниже пример простейшей реализации кэширования в transient API:
function wpunit_get_ajax_data() {
$cache_key = 'wpunit_ajax_data';
$data = get_transient( $cache_key );
if ( false === $data ) {
// Выполняем тяжёлую операцию
$data = array('time' => current_time('mysql'), 'info' => 'Данные с сервера');
set_transient( $cache_key, $data, 3600 ); // Кэш на 1 час
}
wp_send_json_success( $data );
}
add_action( 'wp_ajax_wpunit_get_data', 'wpunit_get_ajax_data' );
add_action( 'wp_ajax_nopriv_wpunit_get_data', 'wpunit_get_ajax_data' );Такой подход позволяет значительно снизить количество вычислений и ускорить отклик сервера.