Home › Forums › ACF PRO › YouTube Thumbnail Object with oEmbed field? › Reply To: YouTube Thumbnail Object with oEmbed field?
My solution is a bit more comprehensive than that of @scheurta, as it covers multiple video sources. Youtube, Vimeo, and Wistia.
First off in functions.php:
function get_video_thumbnail_uri( $video_uri ) {
$thumbnail_uri = '';
// determine the type of video and the video id
$video = parse_video_uri( $video_uri );
// get youtube thumbnail
if ( $video['type'] == 'youtube' )
$thumbnail_uri = 'http://img.youtube.com/vi/' . $video['id'] . '/hqdefault.jpg';
// get vimeo thumbnail
if( $video['type'] == 'vimeo' )
$thumbnail_uri = get_vimeo_thumbnail_uri( $video['id'] );
// get wistia thumbnail
if( $video['type'] == 'wistia' )
$thumbnail_uri = get_wistia_thumbnail_uri( $video_uri );
// get default/placeholder thumbnail
if( empty( $thumbnail_uri ) || is_wp_error( $thumbnail_uri ) )
$thumbnail_uri = '';
//return thumbnail uri
return $thumbnail_uri;
}
/**
* Parse the video uri/url to determine the video type/source and the video id
*/
function parse_video_uri( $url ) {
// Parse the url
$parse = parse_url( $url );
// Set blank variables
$video_type = '';
$video_id = '';
// Url is http://youtu.be/xxxx
if ( $parse['host'] == 'youtu.be' ) {
$video_type = 'youtube';
$video_id = ltrim( $parse['path'],'/' );
}
// Url is http://www.youtube.com/watch?v=xxxx
// or http://www.youtube.com/watch?feature=player_embedded&v=xxx
// or http://www.youtube.com/embed/xxxx
if ( ( $parse['host'] == 'youtube.com' ) || ( $parse['host'] == 'www.youtube.com' ) ) {
$video_type = 'youtube';
parse_str( $parse['query'] );
$video_id = $v;
if ( !empty( $feature ) )
$video_id = end( explode( 'v=', $parse['query'] ) );
if ( strpos( $parse['path'], 'embed' ) == 1 )
$video_id = end( explode( '/', $parse['path'] ) );
}
// Url is http://www.vimeo.com
if ( ( $parse['host'] == 'vimeo.com' ) || ( $parse['host'] == 'www.vimeo.com' ) ) {
$video_type = 'vimeo';
$video_id = ltrim( $parse['path'],'/' );
}
$host_names = explode(".", $parse['host'] );
$rebuild = ( ! empty( $host_names[1] ) ? $host_names[1] : '') . '.' . ( ! empty($host_names[2] ) ? $host_names[2] : '');
// Url is an oembed url wistia.com
if ( ( $rebuild == 'wistia.com' ) || ( $rebuild == 'wi.st.com' ) ) {
$video_type = 'wistia';
if ( strpos( $parse['path'], 'medias' ) == 1 )
$video_id = end( explode( '/', $parse['path'] ) );
}
// If recognised type return video array
if ( !empty( $video_type ) ) {
$video_array = array(
'type' => $video_type,
'id' => $video_id
);
return $video_array;
} else {
return false;
}
}
/* Takes a Vimeo video/clip ID and calls the Vimeo API v2 to get the large thumbnail URL.
*/
function get_vimeo_thumbnail_uri( $clip_id ) {
$vimeo_api_uri = 'http://vimeo.com/api/v2/video/' . $clip_id . '.php';
$vimeo_response = wp_remote_get( $vimeo_api_uri );
if( is_wp_error( $vimeo_response ) ) {
return $vimeo_response;
} else {
$vimeo_response = unserialize( $vimeo_response['body'] );
return $vimeo_response[0]['thumbnail_large'];
}
}
/**
* Takes a wistia oembed url and gets the video thumbnail url.
*/
function get_wistia_thumbnail_uri( $video_uri ) {
if ( empty($video_uri) )
return false;
$wistia_api_uri = 'http://fast.wistia.com/oembed?url=' . $video_uri;
$wistia_response = wp_remote_get( $wistia_api_uri );
if( is_wp_error( $wistia_response ) ) {
return $wistia_response;
} else {
$wistia_response = json_decode( $wistia_response['body'], true );
return $wistia_response['thumbnail_url'];
}
}
And then in your template file choose one:
For Single Field:
<?php
//For use with a single field.
$video = get_field('video'); //Embed Code
$video_url = get_field('video', FALSE, FALSE); //URL
$video_thumb_url = get_video_thumbnail_uri($video_url); //get THumbnail via our functions in functions.php ?>
<?php //Lightbox Link via Thumbnail ?>
<a href="#lightbox"><img src="<?php echo $video_thumb_url; ?>"/></a>
<?php //Lightbox Element with Video Embed Code ?>
<div id="lightbox" class="embed-container">
<?php echo $video; ?>
</div>
For Repeater Field:
<?php
//For Use with Repeater Field
$videos = get_field('videos');
$videos_raw = get_field('videos', FALSE, FALSE);
//Add the Thubmnail to the $videos object
foreach($videos_raw as $key => $video_raw) :
$videos[$key]['video_thumb'] = get_video_thumbnail_uri($video_raw['field_5449746362c3d']); //Replace 'field_5449746362c3d' with your field's Field key (obtainable by going to screen options in the fields admin, and setting 'Show Field Key' to 'Yes')
endforeach;
//Loop through the $videos object
foreach($videos as $video): ?>
<?php //Lightbox Link via Thumbnail ?>
<a href="#lightbox"><img src="<?php echo $video['video_thumb']; ?>"/></a>
<?php //Lightbox Element with Video Embed Code ?>
<div id="lightbox" class="embed-container">
<?php echo $video['video'] ?>
</div>
<? endforeach; ?>
Welcome to the Advanced Custom Fields community forum.
Browse through ideas, snippets of code, questions and answers between fellow ACF users
Helping others is a great way to earn karma, gain badges and help ACF development!
We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Privacy Policy. If you continue to use this site, you consent to our use of cookies.