Изображения часто занимают значительную часть веса страницы, и неправильно оптимизированные изображения могут серьезно замедлить загрузку сайта на WordPress. В этой статье мы разберём, как грамотно оптимизировать загрузку изображений, используя современные методы, плагины и собственные решения на PHP и JavaScript. Это поможет ускорить сайт, улучшить SEO и повысить удовлетворённость посетителей.
Почему важна оптимизация загрузки изображений в WordPress
Изображения могут составлять до 70% веса страницы. Если загружать их без оптимизации, посетитель будет ждать загрузки долго, что негативно скажется на поведении и ранжировании сайта. Кроме того, высокая нагрузка на сервер и трафик могут увеличить расходы на хостинг.
Оптимизация загрузки включает в себя несколько направлений:
- Сжатие изображений без потери качества.
- Использование современных форматов (WebP, AVIF).
- Отложенная загрузка (lazy load).
- Адаптация изображений под экран пользователя (responsive images).
- Кэширование и CDN.
Рассмотрим каждый из этих пунктов подробнее.
Сжатие изображений без потери качества: плагины и инструменты
Самый простой способ — использовать плагины, которые сжимают изображения при загрузке:
- Smush — популярный плагин для сжатия и оптимизации изображений, умеет работать с WebP.
- Imagify — оптимизирует изображения с выбором уровня сжатия, интегрируется с медиабиблиотекой.
- ShortPixel — поддерживает сжатие JPG, PNG, GIF и WebP, умеет конвертировать формат.
Эти плагины обычно автоматически сжимают загружаемые изображения и могут оптимизировать уже существующие на сайте. Важно настроить их таким образом, чтобы не терять качество, особенно для крупных изображений.
Пример оптимизации изображения через API ShortPixel
Если вы хотите реализовать сжатие изображений программно, можно использовать API ShortPixel. Вот пример на PHP с использованием wp_remote_post():
function wpdigest_optimize_image_with_shortpixel($image_path) {
$api_key = 'ВАШ_API_КЛЮЧ';
$image_data = file_get_contents($image_path);
$response = wp_remote_post('https://api.shortpixel.com/v2/reducer.php', [
'body' => [
'key' => $api_key,
'file' => base64_encode($image_data),
'lossy' => true
]
]);
if (is_wp_error($response)) {
return false;
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (isset($body['Status']) && $body['Status'] === 'Success') {
file_put_contents($image_path, base64_decode($body['Dest'])) ;
return true;
}
return false;
}Такой подход позволяет интегрировать оптимизацию в собственные процессы загрузки файлов.
Использование современных форматов изображений: WebP и AVIF
Форматы WebP и AVIF обеспечивают лучшее сжатие при сохранении качества. WordPress поддерживает WebP с версии 5.8, но не всегда серверы и браузеры это поддерживают. Поэтому стоит организовать условную подачу изображений.
Для этого можно установить плагин WebP Express, который автоматически конвертирует изображения в WebP и с помощью htaccess или PHP отдаёт нужный формат в зависимости от браузера.
Кроме того, можно реализовать подачу WebP с помощью picture и source в HTML:
<picture>
<source srcset="image.webp" type="image/webp">
<source srcset="image.jpg" type="image/jpeg">
<img src="image.jpg" alt="Описание изображения">
</picture>Это гарантирует, что браузер выберет оптимальный формат.
Автоматизация генерации тегов picture в WordPress
Для автоматической генерации таких тегов можно использовать фильтр wp_get_attachment_image_attributes и добавить поддержку WebP:
function wpdigest_add_webp_picture( $html, $attachment_id ) {
$img_src = wp_get_attachment_image_url( $attachment_id, 'full' );
$webp_src = preg_replace('/\.(jpg|jpeg|png)$/', '.webp', $img_src);
$alt = get_post_meta( $attachment_id, '_wp_attachment_image_alt', true );
$picture = '<picture>'
. '<source srcset="' . esc_url($webp_src) . '" type="image/webp">'
. '<img src="' . esc_url($img_src) . '" alt="' . esc_attr($alt) . '">'
. '</picture>';
return $picture;
}
add_filter( 'wp_get_attachment_image', 'wpdigest_add_webp_picture', 10, 2 );Этот пример можно доработать для поддержки нескольких размеров и fallback.
Отложенная загрузка (lazy load) изображений в WordPress
Отложенная загрузка позволяет загружать изображения только тогда, когда они появляются в зоне видимости пользователя. Это снижает время загрузки первой страницы и уменьшает трафик.
WordPress с версии 5.5 автоматически добавляет атрибут loading="lazy" к изображениям, но можно улучшить этот механизм.
Плагины для lazy load:
- Lazy Load by WP Rocket — простой и эффективный плагин.
- a3 Lazy Load — поддерживает не только изображения, но и видео и iframe.
Если нужен кастомный скрипт, например, с использованием Intersection Observer:
function wpdigest_lazy_load_script() {
wp_enqueue_script('wpdigest-lazy-load', get_template_directory_uri() . '/js/lazy-load.js', [], null, true);
}
add_action('wp_enqueue_scripts', 'wpdigest_lazy_load_script');Файл lazy-load.js может содержать:
document.addEventListener('DOMContentLoaded', function() {
const lazyImages = document.querySelectorAll('img.lazy');
if ('IntersectionObserver' in window) {
let observer = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if(entry.isIntersecting) {
let img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy');
observer.unobserve(img);
}
});
});
lazyImages.forEach(function(img) {
observer.observe(img);
});
} else {
// fallback для старых браузеров
lazyImages.forEach(function(img) {
img.src = img.dataset.src;
img.classList.remove('lazy');
});
}
});<В разметке нужно использовать:
<img class="lazy" data-src="image.jpg" alt="Описание" />Адаптивные изображения: использование srcset и sizes
Чтобы подстраивать размер изображений под размер экрана, нужно использовать атрибуты srcset и sizes. WordPress автоматически генерирует множество размеров при загрузке.
Пример ручного добавления:
<img src="image-480w.jpg"
srcset="image-480w.jpg 480w, image-800w.jpg 800w, image-1200w.jpg 1200w"
sizes="(max-width: 600px) 480px, 800px" alt="Описание">WordPress автоматически реализует это через функцию wp_get_attachment_image().
Как улучшить адаптивность с помощью фильтров
Можно добавить фильтр, чтобы всегда выводить тег img с необходимыми атрибутами:
function wpdigest_add_responsive_attributes( $attr, $attachment, $size ) {
$attr['srcset'] = wp_get_attachment_image_srcset( $attachment->ID, $size );
$attr['sizes'] = '(max-width: 800px) 100vw, 800px';
return $attr;
}
add_filter( 'wp_get_attachment_image_attributes', 'wpdigest_add_responsive_attributes', 10, 3 );Кэширование и использование CDN для изображений в WordPress
Для максимальной скорости стоит использовать кэширование и CDN. Кэширование уменьшает нагрузку на сервер, а CDN доставляет изображения из ближайших к пользователю точек.
Плагины с поддержкой CDN:
- WP Rocket — мощный кэш-плагин с поддержкой CDN.
- W3 Total Cache — бесплатный, с поддержкой CDN и оптимизацией.
- Jetpack — модуль Photon для CDN изображений.
Для интеграции с CDN обычно нужно указать URL CDN, который будет подставляться к ссылкам на изображения.
Пример замены URL изображений на CDN через фильтр
function wpdigest_replace_image_url_with_cdn( $url ) {
$cdn_url = 'https://cdn.wpdigest.ru';
$site_url = get_site_url();
if ( strpos( $url, $site_url ) === 0 ) {
$url = str_replace( $site_url, $cdn_url, $url );
}
return $url;
}
add_filter( 'wp_get_attachment_url', 'wpdigest_replace_image_url_with_cdn' );Это позволит отдавать изображения через CDN без изменения базы данных.
Итоговые рекомендации по оптимизации загрузки изображений в WordPress
Для комплексного решения рекомендуем:
- Использовать плагины для сжатия и конвертации, например, Smush или ShortPixel.
- Обеспечить поддержку WebP и AVIF с fallback на JPEG/PNG.
- Включить или улучшить lazy load с помощью плагинов или собственного скрипта.
- Использовать адаптивные изображения с атрибутами srcset и sizes.
- Подключить CDN и настроить кэширование.
Сочетание этих подходов значительно ускорит загрузку страниц, снизит нагрузку на сервер и улучшит пользовательский опыт.