Cómo solucionar que WP Oembed no reconozca el parámetro autoplay=1 en YouTube
Estoy teniendo un problema aquí:
Estoy pasando esto a través de un campo personalizado: http://www.youtube.com/watch?v=E6P1Q-UycHA&autoplay=1
(observa el autoplay=1
)
Pero cuando cargo el video en mi tema usando wp_oembed_get... se muestra el video correctamente, pero no respeta el parámetro autoplay=1
que estoy pasando.
Necesito que los videos se reproduzcan automáticamente al cargar la página.
¿Alguna idea?
Gracias, Alain Fontaine
Esos no son realmente argumentos como para YouTube, sino más bien argumentos para el propio WordPress.
Una forma de manejarlo sería acceder a tu argumento más tarde dentro de un filtro y modificar la salida HTML.
Pasar el array de argumentos:
wp_oembed_get( 'http://www.youtube.com/watch?v=', array( 'autoplay' => 1 ) );
Y el filtro:
add_filter('oembed_result','oembed_result', 10, 3);
function oembed_result($html, $url, $args) {
// $args incluye el argumento personalizado
// modifica $html según sea necesario
return $html;
}

Sé que esta pregunta es bastante antigua, pero tengo una solución funcional que creo que podría ser útil para cualquier otra persona que esté buscando esta información y no encuentre resultados en las búsquedas de Google.
Esta solución ha sido probada en WordPress 3.7.1+:
/**
* Agrega el argumento `autoplay` a la cadena de consulta de videos de YouTube incrustados
*/
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);
Añade el código anterior en el archivo functions.php
de tu tema para que todos los videos de YouTube agregados mediante oEmbed se reproduzcan automáticamente.
Cómo funciona esto
En class-oembed.php en la línea 212, el método fetch()
aplica el filtro oembed_fetch_url
para permitir modificaciones en la URL.
Para evitar agregar parámetros innecesarios a otros proveedores de oEmbed, verificamos la presencia de "youtube" en la URL del proveedor — también podríamos verificar "vimeo" y/u otros servicios de video — y, si esa cadena está presente, añade un argumento autoplay
a la cadena de consulta.

Esta solución no funciona para mí. Agrega &autoplay=1
a la URL del proveedor. Eso NO es el src del iframe, y el sistema oembed de YouTube no lo transfiere. El valor se pierde durante _fetch_with_format
que se llama después de oembed_fetch_url. ¿Quizás esto solía funcionar pero YouTube cambió su API oembed?

Compartiendo mi respuesta desde https://stackoverflow.com/a/55053642/799327, espero que esté bien ya que es del mismo OP:
Después de investigar sobre esto, la mejor manera de hacerlo es aprovechar el hook de filtro oembed_fetch_url
para agregar argumentos adicionales a la URL de solicitud oEmbed. Mi objetivo específico era permitir un parámetro de autoplay, pero este método está diseñado para adaptarse fácilmente a cualquier argumento oEmbed que necesites.
Primero, agrega esto a tu functions.php
:
<?php
/**
* Agregar parámetros al embed
* @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);
Esta función toma la URL oEmbed generada y sus argumentos correspondientes, y los compara con una lista predefinida de argumentos permitidos, en este caso ['autoplay']
. Si detecta alguna de estas palabras clave permitidas en los argumentos pasados al filtro oEmbed, los agrega con su valor correspondiente a la URL oEmbed.
Luego, todo lo que necesitas hacer es agregar el parámetro oEmbed a tu shortcode en el editor de Wordpress, así:
[embed autoplay="true"]https://vimeo.com/1234567890/1234567890[/embed]
Ten en cuenta que la clase oEmbed en WP usa el postmeta como caché para estas solicitudes, así que si ya habías incrustado la URL objetivo antes, es posible que tengas que borrar la caché de postmeta de alguna manera o agregar un parámetro de cache buster a la URL objetivo. Si el enlace está en la caché, el hook de filtro nunca se ejecutará.
Espero que esto tenga sentido, ya que siento que es una característica bastante útil que sorprendentemente es difícil de descubrir cómo implementar.

Esta es mi solución en 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
disfrútalo

Cualquier cosa después del primer parámetro debe enviarse como un arreglo de argumentos.
Consulta el ejemplo dado en la página del codex.
http://codex.wordpress.org/Function_Reference/wp_oembed_get
Si estás intentando tomar el valor de un campo personalizado y que el código de embed lo convierta en un video (es decir, lo que sucedería si lo colocaras en el contenido), entonces puedes hacer algo como esto...
/*
N - reemplaza con un ID de post válido
key - reemplaza con una clave (nombre) de campo personalizado válido
*/
$data = get_post_meta( N, 'key', true );
if( $data )
echo apply_filters( 'the_content', $data );
Por supuesto, esto ejecutará varios filtros sobre los datos que no necesitas, pero funciona de todas formas...

Desafortunadamente, los únicos argumentos que wp_oembed_get aceptará son 'width' y 'height'

Supongo que no se puede pasar ese argumento entonces... al menos no usando wp_oembed_get..

Sí; por lo que sé (aunque podría estar equivocado en esto) la API oEmbed de YouTube no permite ese argumento en absoluto.

Investigué un poco sobre el embed, y por lo que puedo ver (como dijiste) los únicos argumentos que se pasan son height y width.. (fácil de probar, llama a la función con un array pasado, no funciona con autoplay, pero width y height sí funcionan).

Después de toda la investigación, esto es lo que encontré. A continuación está el código.
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 );
Créditos a https://gist.github.com/mustardBees/7704269#file-functions-php.
¡Gracias!

No sé si todavía es necesario, pero publicaré la respuesta aquí
<?php
/**
* Script ACF oEmbed con parámetros de reproductor
* @link https://www.advancedcustomfields.com/resources/oembed/
*/
$video = get_field('video');
// usar preg_match para encontrar el src del iframe
preg_match('/src="(.+?)"/', $video, $matches);
$src = $matches[1];
// agregar parámetros adicionales al src del 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);
// agregar atributos adicionales al html del iframe
$attributes = 'frameborder="0"';
$video = str_replace('></iframe>', ' ' . $attributes . '></iframe>', $video);
if($video) :
echo '<div class='video-wrapper'>'.$iframe.'</div>';
endif;
también, como Gist: https://gist.github.com/zachakbar/3100e093cb8484d47586a259f9f960dc

Esto se puede solucionar fácilmente modificando la función wp_oembed_get() en wp-includes/media.php de la siguiente manera:
function wp_oembed_get( $url, $args = '' ) {
// Construir manualmente el embed IFRAME con la opción de videos relacionados desactivada y autoplay activado
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 );
}

También, asegúrate de ejecutar la siguiente consulta SQL después de realizar este cambio para que el embed se actualice:
DELETE FROM wp_postmeta WHERE meta_key LIKE 'oembed%'
