Как заменить видео YouTube на миниатюру "Нажмите для воспроизведения"?
Я использую много встроенных видео (через oembed
) в своем блоге, и это может замедлять загрузку страниц.
Есть ли способ автоматически заменять видео YouTube (и другие) на миниатюру (желательно установленную миниатюру записи), а затем при клике заменять миниатюру на iframe видео?
Примечания
- Решение для YouTube и Vimeo.
- Использует миниатюру записи или стандартную миниатюру от видеопровайдера.
- Если на одной странице используется несколько oEmbed, использование миниатюры записи вызывает дублирование "миниатюр".
- Запись должна быть обновлена перед тем, как изменения станут видны.
- В планах: размеры
<iframe>
и<img>
, другие oEmbed.
Источники вдохновения
oEmbed
Замена изображения на встраиваемый контент
https://stackoverflow.com/q/838878/1287812
Плагин
<?php
/**
* Plugin Name: oEmbed Replace Iframe with AutoPlay-Image
* Plugin URI: https://wordpress.stackexchange.com/q/73996/12615
* Description: Заменяет встраиваемый iframe на миниатюру записи
* и если её нет, заменяет на миниатюру видео
* Version: 1.0
* Author: brasofilo
* Author URI: https://wordpress.stackexchange.com/users/12615/brasofilo
*/
//избегаем прямых вызовов этого файла
if (!function_exists ('add_action')) {
header('Status: 403 Forbidden');
header('HTTP/1.1 403 Forbidden');
exit();
}
add_filter( 'oembed_dataparse', 'wpse_73996_oembed_click2play', 10, 3 );
function wpse_73996_oembed_click2play( $return, $data, $url )
{
// Создаем уникальный ID, если на странице используется несколько oEmbed
// https://stackoverflow.com/questions/3656713/
$uuid = gettimeofday();
$uuid = mt_rand() . $uuid['usec'];
// Используем миниатюру записи, если она существует
// Визуально работает только если на запись используется один oEmbed
$post_thumbnail_id = get_post_thumbnail_id( $_REQUEST['post'] );
if( $post_thumbnail_id )
{
$thumb = wp_get_attachment_image_src( $post_thumbnail_id, 'medium' );
$image = $thumb[0];
}
if( !$image )
$image = $data->thumbnail_url;
// YouTube
if ( $data->provider_name == 'YouTube' )
{
$autoplay = str_replace('feature=oembed', 'feature=oembed&autoplay=1', $return );
$return = '<script type="text/javascript">var embedCode'
. $uuid . ' = \''
. $autoplay .'\';</script><div id="videocontainer'
. $uuid . '"><img src="'
. $image
. '" onclick="document.getElementById(\'videocontainer'
. $uuid . '\').innerHTML = embedCode'
. $uuid . ';" height="360" width="480" /></div>';
}
// Vimeo
elseif ( $data->provider_name == 'Vimeo' )
{
$autoplay = str_replace('" width=', '?autoplay=1" width=', $return );
$return = '<script type="text/javascript">var embedCode'
. $uuid . ' = \''
. $autoplay . '\';</script><div id="videocontainer'
. $uuid . '"><img src="'
. $image
.'" onclick="document.getElementById(\'videocontainer'
. $uuid . '\').innerHTML = embedCode'
. $uuid . ';" height="360" width="480" /></div>';
}
return $return;
}
Содержимое $data
, возвращаемое видеопровайдерами
stdClass(
type = 'video'
version = 1.0
provider_name = 'Vimeo'
provider_url = 'http://vimeo.com/'
title = 'Earth'
author_name = 'Michael König'
author_url = 'http://vimeo.com/michaelkoenig'
is_plus = 1
html = '<iframe src="http://player.vimeo.com/video/32001208" width="540" height="304" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'
width = 540
height = 304
duration = 300
description = 'lorem ipsum'
thumbnail_url = 'http://b.vimeocdn.com/ts/307/031/307031094_295.jpg'
thumbnail_width = 295
thumbnail_height = 166
video_id = 32001208
)
stdClass(
provider_url = 'http://www.youtube.com/'
thumbnail_url = 'http://i2.ytimg.com/vi/552yWya5RgY/hqdefault.jpg'
title = 'Tu cara me suena - Arturo Valls imita a Rihanna'
html = '<iframe width="540" height="304" src="http://www.youtube.com/embed/552yWya5RgY?fs=1&feature=oembed" frameborder="0" allowfullscreen></iframe>'
author_name = 'antena3'
height = 304
thumbnail_width = 480
width = 540
version = 1.0
author_url = 'http://www.youtube.com/user/antena3'
provider_name = 'YouTube'
type = 'video'
thumbnail_height = 360
)

Чувак, огромное тебе спасибо за это! Ты даже не представляешь, насколько это мне помогло. Тебе стоит выложить этот плагин на сайт wordpress.org.

К твоему сведению: я нашел невероятно простой трюк на Stackoverflow для наложения изображений через CSS <img style="background:url(thumbnail1.jpg)" src="magnifying_glass.png" />
--> http://stackoverflow.com/questions/403478/css-how-to-overlay-images

Да, я думал об этой иконке "play" для наложения, но не искал. Отличное дополнение!

Вот улучшенная версия плагина brasofilo:
add_filter( 'oembed_dataparse', function($str, $data, $url) {
if ( ($yt = $data->provider_name == 'YouTube') || ($vm = $data->provider_name == 'Vimeo') )
{
if($yt) $html = str_replace('feature=oembed', 'feature=oembed&autoplay=1', $str);
else $html = str_replace('" width=', '?autoplay=1" width=', $str);
$html = htmlentities($html, ENT_QUOTES);
$img = $data->thumbnail_url;
$title = esc_attr($data->title);
return '<img src="'. $img . '" onclick="this.outerHTML=\'' . $html . '\'" title="' . $title . '">';
}
return $str;
}, 10, 3);
Не забудьте очистить кеш oembed! Для этого можно использовать следующую SQL-команду:
DELETE FROM wp_postmeta WHERE meta_key LIKE '_oembed%'
Подробнее на https://siteorigin.com/clearing-oembed-cache/

Это хороший метод... но для тех, у кого меньше опыта, можно воспользоваться этим руководством.
Не вставляйте код для вставки YouTube, который предоставляет YT (YouTube) (можно попробовать, но он будет работать некорректно)... вместо этого просто замените источник из кода вставки вашего видео ДО &autoplay=1
(оставьте это в конце как есть).
Например:
оригинальный код от YouTube:
<object width="420" height="315">
<param name="movie" value="//www.youtube.com/v/5mEymdGuEJk?hl=en_US&version=3"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="//www.youtube.com/v/5mEymdGuEJkhl=en_US&version=3" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed>
</object>
Код, используемый в руководстве с тем же источником YouTube:
<object width="420" height="315" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0">
<param name="allowFullScreen" value="true" />
<param name="allowscriptaccess"value="always" />
<param name="src" value="http://www.youtube.com/v/5mEymdGuEJk?version=3&hl=en_US&autoplay=1" /><param name="allowfullscreen" value="true" />
<embed width="420" height="315" type="application/x-shockwave-flash" src="http://www.youtube.com/v/5mEymdGuEJk?version=3&hl=en_US&autoplay=1" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" />
</object>
Кроме этого, просто замените источник и путь изображения на свои, и вуаля!

Попробуйте этот код. Просто скопируйте и вставьте в HTML-файл.
<!DOCTYPE html>
<html>
<body>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', { // "player" - идентификатор контейнера для плеера YouTube, куда загружается видео через YouTube Iframe API.
height: '390',
width: '640',
videoId: 'M7lc1UVf-VE',
events: {
'onReady': onPlayerReady, // При готовности плеера будет вызвана функция обратного вызова "onPlayerReady".
}
});
}
function onPlayerReady(event) { // Когда плеер YouTube будет готов
$('#play_vid').click(function() { // Ожидание клика по оверлею/изображению
event.target.playVideo(); // После клика по оверлейному изображению видео начнет воспроизводиться.
});
}
$(document).ready(function() {
$('#player').hide(); // При загрузке документа плеер YouTube будет скрыт.
$('#play_vid').click(function() { // При клике пользователя по оверлейному изображению.
$('#player').show(); // Плеер станет видимым для пользователя.
$('#play_vid').hide(); // Оверлейное изображение будет скрыто.
});
});
</script>
<div id="player"></div> <!-- Контейнер для плеера YouTube -->
<img id="play_vid" src="YOUR_IMAGE_PATH" /> <!-- Оверлейное изображение, которое отображается поверх видео. При клике оно скрывается, и видео воспроизводится с помощью YouTube API. -->
</body>
</html>

Что именно делает этот код и как он решает проблему? Сделайте [правку] и подробно объясните, что делает ваш код и как он работает.

Код обновлен с комментариями. При загрузке страницы видео с YouTube будет скрыто, а пользователю будет показано наложенное изображение. Когда пользователь кликнет по изображению, оно скроется и начнется воспроизведение видео с YouTube, которое будет показано пользователю.
