Вопрос или проблема
Я создаю сайт на 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
, вы сталкиваетесь с проблемами, связанными с тем, что функция не возвращает ожидаемого результата.
Основные моменты, которые следует учесть
-
Подключение необходимых файлов: Перед использованием
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');
-
Формат URL:
media_sideload_image
ожидает URL изображения. Поскольку ваше изображение сохранено локально в директории темы, убедитесь, что вы используете правильный URL. Например:$image_uri = get_template_directory_uri() . '/tmp/video_thumb_952.jpg';
-
Оптимизация кода: Вместо циклического прохода по всем вложениям, которые могут увеличить нагрузку на производительность, оптимизируйте ваш код, чтобы сразу получать 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 и позволит вашему администратору легко управлять миниатюрами.
Если у вас возникнут дальнейшие вопросы или потребуется помощь в доработках, не стесняйтесь обращаться!