В современном веб-разработке важное место занимает оптимизация изображений. Правильная работа с изображениями позволяет ускорить загрузку сайта, улучшить SEO и повысить комфорт пользователей. В этой статье мы подробно рассмотрим, как создать плагин для WordPress, который автоматизирует обработку изображений — например, их сжатие, изменение размеров и добавление водяных знаков.
Почему важна автоматизация работы с изображениями в WordPress
Без оптимизации изображения занимают много места и замедляют загрузку страниц. Ручная обработка всех загружаемых файлов — трудоемкий процесс, особенно если сайт активно пополняется контентом. Автоматизация позволяет:
- Автоматически сжимать изображения при загрузке без потери качества.
- Изменять размеры изображений под нужды сайта.
- Добавлять водяные знаки для защиты авторских фото.
- Конвертировать изображения в современные форматы (например, WebP).
Все эти задачи можно реализовать в одном плагине, который будет работать незаметно для пользователя и администратора.
Основные функции плагина для работы с изображениями
Опишем ключевые функции, которые мы реализуем:
- Автоматическое сжатие изображений. Используем библиотеку
imagickилиgdдля уменьшения веса без потери качества. - Изменение размеров при загрузке. Например, ограничение максимальной ширины и высоты изображения.
- Добавление водяного знака. Для защиты авторских прав накладываем прозрачный логотип или текст.
- Конвертация в WebP. Современный формат с лучшим сжатием, поддерживаемый большинством браузеров.
Создаем структуру плагина
Создадим папку wpclass-image-optimizer в директории wp-content/plugins. В ней создадим основной файл плагина wpclass-image-optimizer.php:
<?php
/**
* Plugin Name: WPClass Image Optimizer
* Description: Автоматическая оптимизация и обработка изображений при загрузке.
* Version: 1.0
* Author: WPClass
*/
if (!defined('ABSPATH')) {
exit; // Запрет прямого доступа
}
class WPClass_Image_Optimizer {
public function __construct() {
add_filter('wp_handle_upload_prefilter', array($this, 'wpclass_check_image_size'));
add_filter('wp_generate_attachment_metadata', array($this, 'wpclass_optimize_image'), 10, 2);
}
// Ограничение максимального размера изображения
public function wpclass_check_image_size($file) {
$max_width = 1920;
$max_height = 1080;
$image_info = getimagesize($file['tmp_name']);
if (!$image_info) {
return $file; // Не изображение
}
$width = $image_info[0];
$height = $image_info[1];
if ($width > $max_width || $height > $max_height) {
$file['error'] = 'Изображение слишком большое. Максимальный размер: ' . $max_width . 'x' . $max_height . ' пикселей.';
}
return $file;
}
// Основная оптимизация после загрузки
public function wpclass_optimize_image($metadata, $attachment_id) {
$upload_dir = wp_upload_dir();
$file = $upload_dir['basedir'] . "/" . $metadata['file'];
// Оптимизация и сжатие
$this->wpclass_compress_image($file);
// Добавление водяного знака
$this->wpclass_add_watermark($file);
// Конвертация в WebP
$this->wpclass_convert_to_webp($file);
return $metadata;
}
private function wpclass_compress_image($file) {
$image = wp_get_image_editor($file);
if (is_wp_error($image)) {
return;
}
$image->set_quality(85); // Качество JPEG
$image->save($file);
}
private function wpclass_add_watermark($file) {
$watermark_path = plugin_dir_path(__FILE__) . 'watermark.png';
if (!file_exists($watermark_path)) {
return;
}
$image = wp_get_image_editor($file);
if (is_wp_error($image)) {
return;
}
$size = $image->get_size();
$watermark = imagecreatefrompng($watermark_path);
$dest_img = $image->get_image();
$wm_width = imagesx($watermark);
$wm_height = imagesy($watermark);
$dest_x = $size['width'] - $wm_width - 10;
$dest_y = $size['height'] - $wm_height - 10;
imagealphablending($dest_img, true);
imagesavealpha($dest_img, true);
imagecopy($dest_img, $watermark, $dest_x, $dest_y, 0, 0, $wm_width, $wm_height);
$image->set_image($dest_img);
$image->save($file);
imagedestroy($watermark);
imagedestroy($dest_img);
}
private function wpclass_convert_to_webp($file) {
if (!function_exists('imagewebp')) {
return; // WebP не поддерживается
}
$info = pathinfo($file);
$webp_file = $info['dirname'] . '/' . $info['filename'] . '.webp';
$image = wp_get_image_editor($file);
if (is_wp_error($image)) {
return;
}
$image->save($webp_file, 'image/webp');
}
}
new WPClass_Image_Optimizer();
Подробное описание функций плагина
Ограничение максимального размера изображения при загрузке
Функция wpclass_check_image_size подключается через фильтр wp_handle_upload_prefilter и проверяет ширину и высоту загружаемого файла. Если изображение превышает заданные размеры (1920x1080), загрузка блокируется с сообщением об ошибке. Это позволяет избежать загрузки слишком больших файлов, которые только ухудшают производительность.
Оптимизация и сжатие изображений
Метод wpclass_compress_image использует стандартный класс WordPress WP_Image_Editor для сжатия JPEG изображений с качеством 85%. Такой компромисс позволяет сохранить визуальное качество и заметно уменьшить размер файла.
Добавление водяного знака
Для защиты авторских прав можно добавлять водяные знаки. В нашем примере плагин ищет в папке плагина файл watermark.png с прозрачным логотипом. Водяной знак размещается в правом нижнем углу с отступами 10 пикселей. Для работы используется функция imagecopy из GD-библиотеки.
Конвертация изображений в формат WebP
Современные браузеры поддерживают WebP — формат с эффективным сжатием и качеством. Метод wpclass_convert_to_webp создаёт копию изображения в формате WebP в той же директории. Это позволяет дополнительно ускорить загрузку при правильной настройке темы или плагина для вывода WebP.
Рекомендации по использованию и расширению плагина
Плагин можно расширить, добавив:
- Панель настроек в админке для выбора параметров (качество сжатия, размер, включение/выключение водяного знака).
- Поддержку других форматов изображений (PNG, GIF).
- Поддержку пакетной оптимизации уже загруженных изображений.
- Автоматическую очистку старых WebP-файлов при удалении оригиналов.
Также стоит обратить внимание на совместимость с другими плагинами и темами, чтобы избежать конфликтов.
Альтернативные плагины для оптимизации изображений
Если вы не хотите создавать собственный плагин, можно использовать готовые решения:
- Smush — популярный плагин для сжатия и оптимизации.
- ShortPixel Image Optimizer — плагин с поддержкой WebP и резервным копированием.
- EWWW Image Optimizer — мощный инструмент для автоматизации обработки.
Однако создание собственного плагина даёт полный контроль и возможность тонкой настройки под конкретные задачи.