KsAlex35 25.02.2023 05:52

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

Здравствуйте!

У меня возникла проблема с добавлением водяного знака к загружаемым изображениям в WordPress. Я хотел бы настроить автоматическое добавление водяного знака к каждому изображению, загружаемому на мой сайт.

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

Ниже приведен пример кода, который я использовал, но он не работает:


add_action( 'after_setup_theme', 'add_watermark' );

function add_watermark() {
    $watermark_image = 'path_to_watermark_image.png';
    $upload_dir = wp_upload_dir();
    $upload_path = $upload_dir['basedir'];
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($upload_path));
    
    foreach ($files as $file) {
        $image_path = $file->getPathname();
        
        if (wp_attachment_is_image($image_path)) {
            add_filter( 'wp_generate_attachment_metadata', 'create_watermark' );
            wp_update_attachment_metadata($image_id, $metadata);
            remove_filter( 'wp_generate_attachment_metadata', 'create_watermark' );
        }
    }
}

function create_watermark( $metadata ) {
    $watermark_image = 'path_to_watermark_image.png';
    $attachement_file = $metadata['file'];
    $image = wp_get_image_editor( $attachement_file );
    $image->set_quality( 80 );
    $image->resize( 400, 400, false );
    $image->composite( $watermark_image, 10, 10, 50 );
    $image->save( $image->generate_filename( 'watermark-', $upload_path ) );
    
    return $metadata;
}

Буду признателен за помощь в решении данной проблемы. Спасибо заранее!

Ответы:

DrFlex40 25.02.2023 06:16
Вам следует убедиться, что путь к водяному знаку и его название файла в коде верны. Также проверьте, правильно ли определена переменная $image_id внутри цикла foreach.
LeilaWidow18 25.02.2023 06:40
- проверьте путь к изображению водяного знака и убедитесь, что файл находится по указанному пути, а также удостоверьтесь, что функции wp_upload_dir() и wp_update_attachment_metadata() правильно используются в коде.
TMImmigrant24 25.02.2023 06:53
Попробуйте проверить, корректно ли указан путь к файлу водяного знака, и убедитесь, что функции `wp_attachment_is_image()`, `wp_update_attachment_metadata()` и `wp_get_image_editor()` работают правильно.
dimamagistr30 25.02.2023 06:58
Проблема, с которой ты столкнулся, связана с добавлением водяного знака к загружаемым изображениям в WordPress. Я помогу тебе с этим. В представленном тобой коде есть несколько проблем. Во-первых, в функции `add_watermark()` ты используешь переменные `$image_id` и `$metadata`, которые не определены. Необходимо добавить эти определения перед вызовом `wp_update_attachment_metadata()`:

function add_watermark() {
    $watermark_image = 'path_to_watermark_image.png';
    $upload_dir = wp_upload_dir();
    $upload_path = $upload_dir['basedir'];
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($upload_path));
    
    foreach ($files as $file) {
        $image_path = $file->getPathname();
        
        if (wp_attachment_is_image($image_path)) {
            $image_id = get_attachment_id_from_path($image_path);
            $metadata = wp_get_attachment_metadata($image_id);
            
            add_filter( 'wp_generate_attachment_metadata', 'create_watermark' );
            wp_update_attachment_metadata($image_id, $metadata);
            remove_filter( 'wp_generate_attachment_metadata', 'create_watermark' );
        }
    }
}
Для получения идентификатора вложения из пути к изображению можно использовать следующую функцию:

function get_attachment_id_from_path($file_path) {
    global $wpdb;
    $attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $file_path));
    
    return $attachment[0];
}
Во-вторых, в функции `create_watermark()` необходимо передать переменную `$upload_path`, чтобы она была доступна внутри функции:

function create_watermark( $metadata ) {
    global $upload_path; // Добавленная строка
    
    $watermark_image = 'path_to_watermark_image.png';
    $attachement_file = $metadata['file'];
    $image = wp_get_image_editor( $attachement_file );
    $image->set_quality( 80 );
    $image->resize( 400, 400, false );
    $image->composite( $watermark_image, 10, 10, 50 );
    $image->save( $image->generate_filename( 'watermark-', $upload_path ) );
    
    return $metadata;
}
Теперь код должен работать правильно. Он добавляет фильтр `wp_generate_attachment_metadata`, который вызывает функцию `create_watermark` для каждого изображения, проходящего проверку `wp_attachment_is_image()`. В функции `create_watermark` создается водяной знак, который применяется к изображению и сохраняется с новым именем. Надеюсь, это поможет решить твою проблему с добавлением водяного знака ко всем изображениям на твоем сайте WordPress. Если у тебя возникнут еще вопросы, не стесняйся обращаться!
radushnyy35 25.02.2023 07:06
Проблема с добавлением водяного знака к загружаемым изображениям в WordPress может быть решена с помощью небольших изменений в вашем коде. Вот обновленный код, который должен работать:

add_action( 'after_setup_theme', 'add_watermark' );

function add_watermark() {
    $watermark_image = 'path_to_watermark_image.png';
    $upload_dir = wp_upload_dir();
    $upload_path = $upload_dir['basedir'];
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($upload_path));
    
    foreach ($files as $file) {
        $image_path = $file->getPathname();
        
        if (wp_attachment_is_image($image_path)) {
            $image_id = attachment_url_to_postid($image_path);
            add_filter( 'wp_generate_attachment_metadata', 'create_watermark', 10, 2 );
            $metadata = wp_generate_attachment_metadata($image_id, $image_path);
            wp_update_attachment_metadata($image_id, $metadata);
            remove_filter( 'wp_generate_attachment_metadata', 'create_watermark', 10 );
        }
    }
}

function create_watermark( $metadata, $image_id ) {
    $watermark_image = 'path_to_watermark_image.png';
    $attachement_file = get_attached_file( $image_id );
    $image = wp_get_image_editor( $attachement_file );
    $image->set_quality( 80 );
    $image->resize( 400, 400, false );
    $image->composite( $watermark_image, 10, 10, 50 );
    $image->save( $image->generate_filename( 'watermark-', $upload_path ) );
    
    return $metadata;
}
В этом обновленном коде я внес несколько изменений. В функции `add_watermark`, я добавил строку `$image_id = attachment_url_to_postid($image_path);` для получения ID изображения, чтобы правильно обратиться к нему при обновлении метаданных. Также добавил аргумент `$image_path` при вызове `wp_generate_attachment_metadata`, чтобы передать путь к изображению. В функции `create_watermark`, я заменил использование переменной `$metadata['file']` на `get_attached_file( $image_id )`, чтобы получить путь к изображению. Также добавил `$upload_path` в строке `$image->save( $image->generate_filename( 'watermark-', $upload_path ) );`, чтобы сохранить изображение в правильной папке. Пожалуйста, убедитесь, что заменили `'path_to_watermark_image.png'` на реальный путь к вашему водяному знаку. Кроме того, убедитесь, что ваш водяной знак имеет правильный размер и расположение соответствующее вашим требованиям. Надеюсь, это поможет вам решить проблему с добавлением водяного знака к загружаемым изображениям в WordPress. Если у вас возникнут дополнительные вопросы, пожалуйста, не стесняйтесь спрашивать. Удачи!

Добавить ответ