использование media_sideload_image с файлом из директории темы

Вопрос или проблема

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

После того, как запись сохранена и видеофайл прикреплён к записи, я использовал ffmpeg, чтобы сделать скриншот на первой секунде видео, а затем сохранить этот скриншот как файл JPG в каталоге ‘tmp’ в каталоге темы.

Наконец, я хочу программно сделать этот скриншот изображением записи. Я использую функцию media_sideload_image, которая обычно используется для получения изображения с другого сервера и установки этого изображения как изображения записи, и я думаю, что эту функцию можно использовать и в данном случае.

В моем случае скриншот видео успешно сохранён в каталоге ‘tmp’ в каталоге моей темы, но часть media_sideload_image не вернула ничего для дальнейшей обработки. Вот моя функция:

function create_video_featured_image($post_id, $image_uri) {

// $image_uri = 'http://localhost/demo-site/wp-content/themes/mytheme/tmp/video_thumb_952.jpg';
$media = media_sideload_image($image_uri, $post_id);

if(!empty($media) && !is_wp_error($media)){
    $args = array(
        'post_type' => 'attachment',
        'posts_per_page' => -1,
        'post_status' => 'any',
        'post_parent' => $post_id
    );

    // ссылка на новое изображение для установки как главное
    $attachments = get_posts($args);

    if(isset($attachments) && is_array($attachments)){
        foreach($attachments as $attachment){
            // получаем источник изображений полного размера (чтобы не было ерунды 300x150 в пути)
            $image = wp_get_attachment_image_src($attachment->ID, 'full');
            // определяем, существует ли в $media изображении, строка URL
            if(strpos($media, $image[0]) !== false){
                // если да, то мы нашли наше изображение. устанавливаем его как миниатюру
                set_post_thumbnail($post_id, $attachment->ID);
                // нужно только одно изображение
                break;
            }
        }
    }
}
}

Что-то упустил или есть другой способ обойти это в данном случае?

Большое спасибо!

Пожалуйста, включите следующие файлы перед использованием media_sideload_image(), чтобы это заработало,

require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');

Ссылка, WP Codex: media_sideload_image

Вам не нужно перебирать все вложения, поскольку функция media_sideload_image возвращает ID вложения, если вы передаете ‘id’ в качестве четвёртого аргумента.

Тогда это можно упростить до чего-то вроде этого:

function create_video_featured_image($post_id, $image_uri) {    
$image_uri = 'http://localhost/demo-site/wp-content/themes/mytheme/tmp/video_thumb_952.jpg';
$media_id = media_sideload_image($image_uri, $post_id, null, 'id');
set_post_thumbnail($post_id, $media_id);
}

Ответ или решение

Использование функции media_sideload_image для установки изображения из директории темы в качестве миниатюры поста в WordPress

Создание миниатюры поста в WordPress с использованием media_sideload_image может показаться сложным процессом, особенно если вы работаете с изображениями, созданными на основе видеофайлов. Ниже приведено детальное объяснение проблемы и решение, которое поможет вам настроить процесс корректно.

Проблема

Вы уже реализовали логику для генерации снимка экрана из видеофайла и сохранили его в директории tmp вашей темы. Однако, когда вы пытаетесь установить это изображение в качестве миниатюры для поста с помощью функции media_sideload_image, вы сталкиваетесь с проблемами, связанными с тем, что функция не возвращает ожидаемого результата.

Основные моменты, которые следует учесть

  1. Подключение необходимых файлов: Перед использованием media_sideload_image, убедитесь, что вы подключили необходимые файлы для работы с медиа в WordPress.

    require_once(ABSPATH . 'wp-admin/includes/media.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');
  2. Формат URL: media_sideload_image ожидает URL изображения. Поскольку ваше изображение сохранено локально в директории темы, убедитесь, что вы используете правильный URL. Например:

    $image_uri = get_template_directory_uri() . '/tmp/video_thumb_952.jpg';
  3. Оптимизация кода: Вместо циклического прохода по всем вложениям, которые могут увеличить нагрузку на производительность, оптимизируйте ваш код, чтобы сразу получать ID загруженного изображения.

Решение

Ниже приведен оптимизированный пример функции, который загружает изображение и устанавливает его в качестве миниатюры поста.

function create_video_featured_image($post_id, $image_uri) {
    // Убедитесь, что путь к изображению правильный
    $image_uri = get_template_directory_uri() . '/tmp/video_thumb_952.jpg'; 

    // Загружаем изображение и получаем ID вложения
    $media_id = media_sideload_image($image_uri, $post_id, null, 'id');

    if (!is_wp_error($media_id)) {
        // Устанавливаем миниатюру поста
        set_post_thumbnail($post_id, $media_id);
    } else {
        // Обработка ошибок, если загрузка не удалась
        error_log('Ошибка при загрузке изображения: ' . $media_id->get_error_message());
    }
}

Заключение

С помощью вышеуказанного кода вы можете корректно использовать media_sideload_image для загрузки изображения из директории вашей темы и установить его в качестве миниатюры поста. Убедитесь, что все необходимые файлы загружены, и путь к изображению правильно сформирован. Это улучшит функциональность вашего сайта WordPress и позволит вашему администратору легко управлять миниатюрами.

Если у вас возникнут дальнейшие вопросы или потребуется помощь в доработках, не стесняйтесь обращаться!

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

Капча загружается...