Setting a post’s featured image from an embedded YouTube video

Not natively. You’d have to write some code to make it happen – there’s a nice pastebin function that provide the necessary code to do it.

Edit (12/19/2011):

Yep here’s how you can do this programmatically. Add the following two functions to your functions.php file and you should be good to go. The code has been commented to explain what’s happening, but here’s a high level of what to expect:

You must…

  • Create a post
  • In the content, include a YouTube URL

The code will…

  • Parse the URL’s out of the content
  • Will grab the first URL that it finds and assume it’s a YouTube URL
  • Grab the thumbnail from the remote server and download it
  • Set it as the current post’s thumbnail

Note that if you include multiple URLs in your post, you’ll need to modify the code to properly find the YouTube URL. This can be done by iterating through the $attachments collection and sniffing out what URL’s look like a YouTube URL.

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

One thing to note is that this assumes that your post has no post thumbnail and will not fire once a post thumbnail is set.

Secondly, if you remove the post thumbnail and then attach an image to this post using the media uploader, the most recent image will be used.

Leave a Comment