Вопрос или проблема
Я пытаюсь автоматически добавить миниатюру видео из Vimeo или YouTube в качестве изображения записи, когда новый пользовательский тип записи видео добавлен или обновлён. ID видео является расширенным пользовательским полем. Вот мой неработающий код:
/**
* Получает URL миниатюры Vimeo
* @param mixed $id ID Vimeo (например, 1185346)
* @return URL миниатюры
*/
function getVimeoThumb($id) {
$data = file_get_contents("http://vimeo.com/api/v2/video/".$id.".json");
$data = json_decode($data);
return $data[0]->thumbnail_large;
}
/**
* Получает URL миниатюры YouTube
* @param mixed $id ID YouTube
* @return URL миниатюры
*/
function getYoutubeThumb($id) {
$data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?key=AIzaSy...&part=snippet&id=".$id);
$data = json_decode($data);
return $json->items[0]->snippet->thumbnails->medium->url;
}
// Добавление миниатюры для видео
function addVideoThumb($post_ID) {
if(!has_post_thumbnail($post_ID)):
if(get_field("source", $post_ID) == "youtube"):
$videoID = get_field("youtube_video_id", $post_ID);
$imageURL = getYoutubeThumb($videoID);
else:
$videoID = get_field("vimeo_video_id", $post_ID);
$imageURL = getVimeoThumb($videoID);
endif;
//echo $imageURL;
// загрузка изображения по URL
$tmp = download_url($imageURL);
$file = array(
'name' => basename($imageURL),
'tmp_name' => $tmp
);
// создание вложения из загруженного изображения
$attachment_id = media_handle_sideload($file, $post_ID);
// установка миниатюры
update_post_meta($post_ID, '_thumbnail_id', $attachment_id);
endif;
}
add_action('save_post_interel-tv-videos', 'addVideoThumb', 10, 3);
Похоже, что функция вообще не вызывается, так как я пытался добавить к ней JavaScript-уведомление, и ничего не появляется. Есть ли помощь? Заранее спасибо!
Наконец-то разобрался. Поскольку я использую Advanced Custom Fields, мне нужно использовать хук acf/save_post
с приоритетом больше 10, чтобы функции get_field()
были доступны.
Недостаток в том, что этот хук выполняется для каждого типа записи. В отличие от нативного хука WP save_post
, с ACF вы не можете привязать его к конкретному пользовательскому типу записи.
Поэтому я также добавил условие, чтобы проверить, является ли запись типа “interel-tv-videos”, например if(!has_post_thumbnail($post_ID) and get_post_type($post_ID) == "interel-tv-videos"):
Ответ или решение
Чтобы автоматически добавлять миниатюры видео из Vimeo или YouTube в качестве изображений для дополнительного пользовательского типа поста «video» в WordPress, необходимо учитывать особенности работы с плагином Advanced Custom Fields (ACF) и использование соответствующих хуков оставления постов. Ниже представлена расширенная версия вашего кода, а также рекомендации по улучшению его функциональности.
Шаги по реализации
-
Получение миниатюры видео:
Необходимо создать two функции для получения миниатюр из YouTube и Vimeo. Убедитесь, что функции корректны и возвращают URL миниатюры. -
Хук и обработка данных:
Используйте хукacf/save_post
, чтобы работать с сохранением поста. Поскольку этот хук срабатывает для всех типов постов, вам нужно добавить условие, чтобы обрабатывать только ваш пользовательский тип поста. -
Загрузка миниатюры:
Если миниатюра еще не установлена, используйтеdownload_url()
для загрузки изображения иmedia_handle_sideload()
для создания вложения в медиа-библиотеке.
Обновленный код
/**
* Получение URL миниатюры из Vimeo
*/
function getVimeoThumb($id) {
$data = file_get_contents("https://vimeo.com/api/v2/video/".$id.".json");
$data = json_decode($data);
return $data[0]->thumbnail_large;
}
/**
* Получение URL миниатюры из YouTube
*/
function getYoutubeThumb($id) {
$apiKey = 'ВАШ_API_КЛЮЧ'; // Убедитесь, что ваш API ключ здесь
$data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?key={$apiKey}&part=snippet&id={$id}");
$json = json_decode($data);
return $json->items[0]->snippet->thumbnails->medium->url;
}
/**
* Добавление миниатюры для видео
*/
function addVideoThumb($post_ID) {
// Проверка, что это не автосохранение
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
// Проверка, что публикация правильного типа
if (get_post_type($post_ID) !== 'interel-tv-videos') return;
// Проверка, имеет ли пост уже миниатюру
if (!has_post_thumbnail($post_ID)) {
$videoSource = get_field("source", $post_ID);
if ($videoSource === "youtube") {
$videoID = get_field("youtube_video_id", $post_ID);
$imageURL = getYoutubeThumb($videoID);
} else {
$videoID = get_field("vimeo_video_id", $post_ID);
$imageURL = getVimeoThumb($videoID);
}
// Загрузка изображения
$tmp = download_url($imageURL);
// Обработка ошибки при загрузке
if (is_wp_error($tmp)) {
error_log('Ошибка загрузки миниатюры: ' . $tmp->get_error_message());
return;
}
$file = array(
'name' => basename($imageURL),
'tmp_name' => $tmp
);
// Создание вложения из загруженного изображения
$attachment_id = media_handle_sideload($file, $post_ID);
// Установка миниатюры
if (!is_wp_error($attachment_id)) {
update_post_meta($post_ID, '_thumbnail_id', $attachment_id);
} else {
error_log('Ошибка установки миниатюры: ' . $attachment_id->get_error_message());
}
}
}
add_action('acf/save_post', 'addVideoThumb', 20);
Описание кода
-
Функции получения миниатюр:
- Функции
getVimeoThumb
иgetYoutubeThumb
загружают данные через API соответствующих платформ и возвращают URL миниатюры.
- Функции
-
Добавление миниатюры:
- В функции
addVideoThumb
выполняется проверка, что это не автосохранение, и проверка типа поста. - Используется
download_url()
для скачивания изображения иmedia_handle_sideload()
для его загрузки в WordPress.
- В функции
-
Безопасность и обработка ошибок:
- Добавлены проверки на наличие ошибок при загрузке и установке миниатюры, чтобы избежать проблем в случае неудачи.
Заключение
Теперь вы можете автоматически добавлять миниатюры видео к вашему пользовательскому типу поста при его сохранении. Убедитесь, что у вас правильно настроены ключи API и что вы обрабатываете возможные ошибки, чтобы избежать неожиданных проблем.