WP Oembed не передает переменную "autoplay=1"
У меня возникла следующая проблема:
Я передаю эту ссылку через произвольное поле: http://www.youtube.com/watch?v=E6P1Q-UycHA&autoplay=1
(обратите внимание на autoplay=1
)
Но когда я загружаю видео в своей теме с помощью wp_oembed_get... видео отображается нормально, но параметр autoplay=1
, который я передаю, не учитывается.
Мне нужно, чтобы видео воспроизводилось автоматически при загрузке страницы.
Есть идеи?
Спасибо, Ален Фонтен

Это не совсем аргументы как для YouTube, скорее аргументы для самого WordPress.
Один из способов обработки — получить доступ к вашему аргументу позже внутри фильтра и изменить HTML-вывод.
Передайте массив аргументов:
wp_oembed_get( 'http://www.youtube.com/watch?v=', array( 'autoplay' => 1 ) );
И фильтр:
add_filter('oembed_result','oembed_result', 10, 3);
function oembed_result($html, $url, $args) {
// $args содержит пользовательский аргумент
// модифицируйте $html по необходимости
return $html;
}

Я знаю, что этот вопрос довольно старый, но у меня есть рабочее решение, которое, как мне кажется, может быть полезно для тех, кто ищет эту информацию и не находит её в Google.
Это решение было протестировано в WordPress 3.7.1+:
/**
* Добавляет параметр `autoplay` к встроенным YouTube видео через oEmbed
*/
function wpse5362_autoplay_youtube_oembed( $provider, $url, $args ) {
if (strpos($provider, 'youtube')!==FALSE) {
$provider = add_query_arg('autoplay', 1, $provider);
}
return $provider;
}
add_filter('oembed_fetch_url', 'wpse5362_autoplay_youtube_oembed', 10, 3);
Добавьте этот код в файл functions.php
вашей темы, чтобы все YouTube видео, добавленные через oEmbed, автоматически проигрывались.
Как это работает
В файле class-oembed.php на строке 212, метод fetch()
применяет фильтр oembed_fetch_url
, позволяя изменять URL.
Чтобы избежать добавления ненужных параметров к другим провайдерам oEmbed, мы проверяем наличие строки "youtube" в URL провайдера — также можно проверить наличие "vimeo" и/или других видео-сервисов — и, если строка найдена, добавляем аргумент autoplay
в строку запроса.

Это решение не работает для меня. Оно добавляет &autoplay=1
к URL провайдера. Это НЕ src iframe, и система oembed YouTube не переносит этот параметр. Значение теряется во время _fetch_with_format
, который вызывается после oembed_fetch_url. Возможно, раньше это работало, но YouTube изменил их oembed API?

Перекрестная публикация моего ответа с https://stackoverflow.com/a/55053642/799327, надеюсь, это нормально, так как вопрос от того же автора:
Итак, после некоторых исследований, лучший способ сделать это — использовать хук фильтра oembed_fetch_url
, чтобы добавить дополнительные аргументы к URL-запросу oEmbed. Моей конкретной целью было разрешить параметр autoplay, но этот метод легко адаптировать под любые необходимые аргументы oEmbed.
Сначала добавьте это в ваш functions.php
:
<?php
/**
* Добавление параметров к oEmbed
* @src https://foxland.fi/adding-parameters-to-wordpress-oembed/
* @src https://github.com/WordPress/WordPress/blob/ec417a34a7ce0d10a998b7eb6d50d7ba6291d94d/wp-includes/class-oembed.php#L553
*/
$allowed_args = ['autoplay'];
function koa_oembed_args($provider, $url, $args) {
global $allowed_args;
$filtered_args = array_filter(
$args,
function ($key) use ($allowed_args) {
return in_array($key, $allowed_args);
},
ARRAY_FILTER_USE_KEY
);
foreach ($filtered_args as $key => $value) {
$provider = add_query_arg($key, $value, $provider);
}
return $provider;
}
add_filter('oembed_fetch_url', 'koa_oembed_args', 10, 3);
Эта функция берет сгенерированный URL oEmbed и соответствующие аргументы, проверяет их против жестко заданного списка разрешенных аргументов, в данном случае ['autoplay']
. Если она находит какие-либо из этих ключевых слов в аргументах, переданных фильтру oEmbed, она добавляет их с заданным значением к URL oEmbed.
Затем все, что вам нужно сделать, это добавить параметр oEmbed к вашему шорткоду в редакторе WordPress, например:
[embed autoplay="true"]https://vimeo.com/1234567890/1234567890[/embed]
Имейте в виду, что класс oEmbed в WordPress использует postmeta как кэш для этих запросов, поэтому, если вы уже встраивали целевой URL ранее, вам, возможно, придется очистить кэш postmeta каким-либо образом или добавить к целевому URL строку для сброса кэша. Если ссылка уже в кэше, хук фильтра не сработает.
Надеюсь, это объяснение понятно, так как я считаю, что это довольно полезная функция, которую удивительно сложно реализовать.

Это мое решение в functions.php
function embed_responsive_autoplay($code){
if(strpos($code, 'youtu.be') !== false || strpos($code, 'youtube.com') !== false){
$return = preg_replace('@embed/([^"&]*)@', 'embed/$1&showinfo=0&autoplay=1', $code);
return '<div class="embed-container">' . $return . '</div>';
}
return '<div class="embed-container">' . $code . '</div>';
}
add_filter( 'embed_oembed_html', 'embed_responsive_autoplay');
add_filter( 'video_embed_html', 'embed_responsive_autoplay' ); // Jetpack
наслаждайтесь

Все параметры после первого должны передаваться в виде массива аргументов.
Пример можно посмотреть на странице кодекса.
http://codex.wordpress.org/Function_Reference/wp_oembed_get
Если вы пытаетесь взять значение произвольного поля и преобразовать его в embed-код для видео (как если бы вы вставили его в контент), то можно сделать так:
/*
N - замените на реальный ID записи
key - замените на ключ произвольного поля (название)
*/
$data = get_post_meta( N, 'key', true );
if( $data )
echo apply_filters( 'the_content', $data );
Конечно, в этом случае к данным будет применено несколько фильтров, которые вам, возможно, не нужны, но способ тем не менее рабочий.

К сожалению, wp_oembed_get принимает только два аргумента: 'width' и 'height'

Видимо, этот аргумент передать не получится.. по крайней мере, не через wp_oembed_get..

Да, насколько я знаю (хотя могу ошибаться), YouTube API для oEmbed вообще не поддерживает этот параметр.

Я немного покопался во встраивании, и насколько я могу судить (как вы и сказали), единственные аргументы, которые передаются, — это высота и ширина.. (легко проверить, вызвать функцию с переданным массивом, с autoplay не работает, а width и height работают).

После всех исследований я нашел вот это. Ниже приведен код.
function iweb_modest_youtube_player( $html, $url, $args ) {
return str_replace( '?feature=oembed', '?
feature=oembed&modestbranding=1&showinfo=0&rel=0', $html );
}
add_filter( 'oembed_result', 'iweb_modest_youtube_player', 10, 3 );
Автор кода: https://gist.github.com/mustardBees/7704269#file-functions-php.
Спасибо!

Не уверен, нужно ли это еще, но я оставлю ответ здесь
<?php
/**
* Скрипт ACF oEmbed с параметрами плеера
* @link https://www.advancedcustomfields.com/resources/oembed/
*/
$video = get_field('video');
// используем preg_match для поиска src в iframe
preg_match('/src="(.+?)"/', $video, $matches);
$src = $matches[1];
// добавляем дополнительные параметры к src iframe
$params = array(
'background' => 1,
'autoplay' => 1,
'controls' => 0,
'loop' => 0,
'color' => '178395',
'title' => 0,
'byline' => 0,
'portrait' => 0,
'rel' => 0,
'showinfo' => 0,
);
$new_src = add_query_arg($params, $src);
$video = str_replace($src, $new_src, $video);
// добавляем дополнительные атрибуты к html iframe
$attributes = 'frameborder="0"';
$video = str_replace('></iframe>', ' ' . $attributes . '></iframe>', $video);
if($video) :
echo '<div class='video-wrapper'>'.$iframe.'</div>';
endif;
также доступно как Gist: https://gist.github.com/zachakbar/3100e093cb8484d47586a259f9f960dc

Это можно легко исправить, изменив функцию wp_oembed_get() в файле wp-includes/media.php следующим образом:
function wp_oembed_get( $url, $args = '' ) {
// Вручную создаем IFRAME с отключенными связанными видео и включенным автовоспроизведением
if(preg_match("/youtube.com\/watch\?v=([^&]+)/i", $url, $aMatch)){
return '<iframe width="560" height="315" src="http://www.youtube.com/embed/' . $aMatch[1] . '?rel=0&autoplay=1" frameborder="0" allowfullscreen></iframe>';
}
require_once( ABSPATH . WPINC . '/class-oembed.php' );
$oembed = _wp_oembed_get_object();
return $oembed->get_html( $url, $args );
}

Также не забудьте выполнить следующий SQL-запрос после внесения изменений, чтобы обновить встроенный контент:
DELETE FROM wp_postmeta WHERE meta_key LIKE 'oembed%'

После этого вы больше не сможете обновлять WordPress. Не рекомендуется.
