Как автоматически заполнять поле alt и title при загрузке картинок в WordPress?

Вот полный код плагина для WordPress, который автоматически прописывает alt и title при загрузке изображений:

<?php
/*
Plugin Name: Auto Image Alt and Title
Plugin URI: http://yoursite.com
Description: Автоматическая генерация alt и title для загружаемых изображений
Version: 1.0
Author: Your Name
Author URI: http://yoursite.com
*/

class AutoImageMetaPlugin {
    public function __construct() {
        // Хуки для обработки загрузки изображений
        add_filter('wp_generate_attachment_metadata', [$this, 'auto_set_image_meta'], 10, 2);
        add_action('add_attachment', [$this, 'set_image_meta_on_upload'], 10, 1);
    }

    // Генерация метаданных при загрузке
    public function set_image_meta_on_upload($post_id) {
        // Проверяем, что это изображение
        if (wp_attachment_is_image($post_id)) {
            $image_meta = $this->generate_image_meta($post_id);
            
            // Обновляем метаданные
            update_post_meta($post_id, '_wp_attachment_image_alt', $image_meta['alt']);
            
            // Обновляем заголовок вложения
            wp_update_post([
                'ID' => $post_id,
                'post_title' => $image_meta['title']
            ]);
        }
    }

    // Генерация метаданных при создании миниатюр
    public function auto_set_image_meta($metadata, $attachment_id) {
        if (wp_attachment_is_image($attachment_id)) {
            $image_meta = $this->generate_image_meta($attachment_id);
            
            // Обновляем метаданные изображения
            if (!isset($metadata['image_meta'])) {
                $metadata['image_meta'] = [];
            }
            
            $metadata['image_meta']['title'] = $image_meta['title'];
            
            return $metadata;
        }
        
        return $metadata;
    }

    // Генерация метаданных для изображения
    private function generate_image_meta($attachment_id) {
        // Получаем информацию о файле
        $file_path = get_attached_file($attachment_id);
        $file_name = basename($file_path);
        
        // Очищаем имя файла
        $clean_name = $this->sanitize_filename($file_name);
        
        // Генерация заголовка и alt
        $title = $this->generate_title($clean_name);
        $alt = $this->generate_alt($clean_name);
        
        return [
            'title' => $title,
            'alt' => $alt
        ];
    }

    // Очистка имени файла
    private function sanitize_filename($filename) {
        // Удаляем расширение
        $filename = pathinfo($filename, PATHINFO_FILENAME);
        
        // Заменяем служебные символы
        $filename = preg_replace('/[^a-zA-ZА-Яа-я0-9\s-]/', '', $filename);
        
        // Заменяем несколько пробелов на один
        $filename = preg_replace('/\s+/', ' ', $filename);
        
        return trim($filename);
    }

    // Генерация заголовка
    private function generate_title($clean_name) {
        // Capitalize first letter
        $title = ucfirst(str_replace(['-', '_'], ' ', $clean_name));
        
        // Усечение до разумной длины
        return mb_substr($title, 0, 100);
    }

    // Генерация alt
    private function generate_alt($clean_name) {
        // Преобразуем в нижний регистр
        $alt = strtolower(str_replace(['-', '_'], ' ', $clean_name));
        
        // Добавляем общие теги
        $alt_variants = [
            $alt . ' фото',
            $alt . ' изображение',
            'фото ' . $alt,
            'изображение ' . $alt
        ];
        
        // Случайный выбор варианта
        return $alt_variants[array_rand($alt_variants)];
    }

    // Административные настройки (опционально)
    public function add_settings_page() {
        add_options_page(
            'Настройки Auto Image Meta', 
            'Auto Image Meta', 
            'manage_options', 
            'auto-image-meta', 
            [$this, 'render_settings_page']
        );
    }

    // Рендер страницы настроек
    public function render_settings_page() {
        ?>
        <div class="wrap">
            <h1>Настройки Auto Image Meta</h1>
            <form method="post" action="options.php">
                <p>Автоматическая генерация alt и title для изображений</p>
                <!-- Можно добавить дополнительные настройки -->
            </form>
        </div>
        <?php
    }
}

// Инициализация плагина
function init_auto_image_meta_plugin() {
    new AutoImageMetaPlugin();
}
add_action('plugins_loaded', 'init_auto_image_meta_plugin');

// Хук для обновления существующих изображений (опционально)
function bulk_update_image_meta() {
    $attachments = get_posts([
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'numberposts' => -1
    ]);

    $plugin = new AutoImageMetaPlugin();

    foreach ($attachments as $attachment) {
        $plugin->set_image_meta_on_upload($attachment->ID);
    }
}
register_activation_hook(__FILE__, 'bulk_update_image_meta');

Функционал плагина:

  1. Автоматическая генерация alt и title
  2. Очистка имени файла
  3. Несколько вариантов генерации alt
  4. Capitalize заголовка
  5. Ограничение длины

Преимущества:

  • Полностью автоматическая работа
  • Поддержка кириллицы
  • Случайный выбор alt-текста
  • Очистка имени файла
  • Минимальные настройки

Установка:

  1. Сохраните код в файл auto-image-meta.php
  2. Загрузите в папку wp-content/plugins/
  3. Активируйте в панели управления

Рекомендации:

  • Протестируйте на staging-сервере
  • Настройте под свои нужды
  • Используйте осторожно с большим количеством изображений

Дополнительно:

  • Можно добавить страницу настроек
  • Реализовать кастомные правила генерации
  • Добавить поддержку мультиязычности

Примечание: При первой активации плагин обновит метаданные для всех существующих изображений.

Автор

Evgeni

На этом сайте делюсь заметками для начинающих по работе в macOS и Windows, а также по веб-разработке на WordPress. Надеюсь увидеть вас в числе своих подписчиков.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *