Настройка избранного изображения из встроенного видео YouTube

15

Если я создаю пост, в котором есть встроенное видео YouTube (все, что я делаю, это вставляю URL YouTube в пост и позволяю Wordpress автоматически вставлять его для меня), есть ли способ установить миниатюрное изображение видео как Лучшее изображение поста?

Piku
источник

Ответы:

17

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

Изменить (19.12.2011):

Да, вот как вы можете сделать это программно. Добавьте следующие две функции в ваш файл functions.php, и все будет хорошо. Код был прокомментирован, чтобы объяснить, что происходит, но вот высокий уровень того, что ожидать:

Вы должны...

  • Создать пост
  • В содержание включите URL YouTube

Код будет ...

  • Разбор URL-адресов из содержимого
  • Получит первый найденный URL и предположит, что это URL YouTube.
  • Возьмите миниатюру с удаленного сервера и загрузите ее
  • Установить его в качестве эскиза текущего сообщения

Обратите внимание, что если вы включаете несколько ссылок в свое сообщение, вам нужно изменить код, чтобы правильно найти URL YouTube. Это можно сделать, выполнив итерацию по $attachmentsколлекции и выясни, как выглядит URL-адрес YouTube.

function set_youtube_as_featured_image($post_id) {  

    // only want to do this if the post has no thumbnail
    if(!has_post_thumbnail($post_id)) { 

        // find the youtube url
        $post_array = get_post($post_id, ARRAY_A);
        $content = $post_array['post_content'];
        $youtube_id = get_youtube_id($content);

        // build the thumbnail string
        $youtube_thumb_url = 'http://img.youtube.com/vi/' . $youtube_id . '/0.jpg';

        // next, download the URL of the youtube image
        media_sideload_image($youtube_thumb_url, $post_id, 'Sample youtube image.');

        // find the most recent attachment for the given post
        $attachments = get_posts(
            array(
                'post_type' => 'attachment',
                'numberposts' => 1,
                'order' => 'ASC',
                'post_parent' => $post_id
            )
        );
        $attachment = $attachments[0];

        // and set it as the post thumbnail
        set_post_thumbnail( $post_id, $attachment->ID );

    } // end if

} // set_youtube_as_featured_image
add_action('save_post', 'set_youtube_as_featured_image');

function get_youtube_id($content) {

    // find the youtube-based URL in the post
    $urls = array();
    preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $content, $urls);
    $youtube_url = $urls[0][0];

    // next, locate the youtube video id
    $youtube_id = '';
    if(strlen(trim($youtube_url)) > 0) {
        parse_str( parse_url( $youtube_url, PHP_URL_QUERY ) );
        $youtube_id = $v;
    } // end if

    return $youtube_id; 

} // end get_youtube_id

Стоит отметить, что это предполагает, что ваше сообщение не имеет миниатюры поста и не будет запускаться после установки миниатюры поста.

Во-вторых, если вы удалите миниатюру поста, а затем прикрепите изображение к этому посту с помощью средства загрузки мультимедиа, будет использовано самое последнее изображение.

Том
источник
Отличный фрагмент, но так как, кто знает, будет ли он там через год - пожалуйста, постарайтесь включить хотя бы краткую (если полный код слишком много) того, что он делает в вашем ответе (например, «используйте это, чтобы получить миниатюру, затем скачать и прикрепить ").
Rarst
1
Обратите внимание, что jetpack содержит метод, названный get_youtube_idтак, что сервер 500 будет выдавать ошибку, если вы используете jetpack с приведенным выше кодом. Если вы переименуете эту функцию, она будет работать нормально
Майк Вормвальд,