Как создать плагин для автоматизации работы с изображениями в WordPress

В современном веб-разработке важное место занимает оптимизация изображений. Правильная работа с изображениями позволяет ускорить загрузку сайта, улучшить SEO и повысить комфорт пользователей. В этой статье мы подробно рассмотрим, как создать плагин для WordPress, который автоматизирует обработку изображений — например, их сжатие, изменение размеров и добавление водяных знаков.

Почему важна автоматизация работы с изображениями в WordPress

Без оптимизации изображения занимают много места и замедляют загрузку страниц. Ручная обработка всех загружаемых файлов — трудоемкий процесс, особенно если сайт активно пополняется контентом. Автоматизация позволяет:

  • Автоматически сжимать изображения при загрузке без потери качества.
  • Изменять размеры изображений под нужды сайта.
  • Добавлять водяные знаки для защиты авторских фото.
  • Конвертировать изображения в современные форматы (например, WebP).

Все эти задачи можно реализовать в одном плагине, который будет работать незаметно для пользователя и администратора.

Основные функции плагина для работы с изображениями

Опишем ключевые функции, которые мы реализуем:

  1. Автоматическое сжатие изображений. Используем библиотеку imagick или gd для уменьшения веса без потери качества.
  2. Изменение размеров при загрузке. Например, ограничение максимальной ширины и высоты изображения.
  3. Добавление водяного знака. Для защиты авторских прав накладываем прозрачный логотип или текст.
  4. Конвертация в 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 — мощный инструмент для автоматизации обработки.

Однако создание собственного плагина даёт полный контроль и возможность тонкой настройки под конкретные задачи.

Блокировка индексации страниц с UTM-метками в WordPress
04.01.2026
Как отключить AJAX подгрузку корзины WooCommerce для улучшения производительности
17.05.2026
Как отключить авто-знаки товаров в WooCommerce без потери функциональности
08.05.2026
Как сделать автоматический откат обновлений в WordPress при ошибках
12.01.2026
WooCommerce: как автоматически удалять заказы со статусом «неоплачено»
28.05.2026