Cómo solucionar que WP Oembed no reconozca el parámetro autoplay=1 en YouTube

14 dic 2010, 20:17:41
Vistas: 15.5K
Votos: 8

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

1
Comentarios

Prueba esta respuesta:

http://stackoverflow.com/a/16801334/2721050

Esto fue muy útil para mí

Erez Lieberman Erez Lieberman
22 feb 2015 15:26:22
Todas las respuestas a la pregunta 8
0

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;
}
15 dic 2010 09:17:38
1

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.

23 dic 2013 00:01:13
Comentarios

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?

Radley Sustaire Radley Sustaire
22 nov 2016 03:19:20
0

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.

8 mar 2019 00:14:19
1

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

12 dic 2014 18:30:32
Comentarios

Por favor, no copies un bloque de código tal cual, quizás [edítalo] y añade alguna explicación.

Mayeenul Islam Mayeenul Islam
13 dic 2014 07:01:54
5

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...

14 dic 2010 22:56:13
Comentarios

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

John P Bloch John P Bloch
14 dic 2010 23:00:45

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

t31os t31os
14 dic 2010 23:10:26

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

John P Bloch John P Bloch
14 dic 2010 23:56:32

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).

t31os t31os
15 dic 2010 00:05:49

Gracias a todos, tendré que buscar otra solución.

criticerz criticerz
15 dic 2010 06:44:44
0

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!

17 oct 2018 14:18:49
0

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

9 feb 2023 22:37:34
3
-7

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 );
}
12 abr 2012 10:33:23
Comentarios

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%'

interimpulso interimpulso
12 abr 2012 10:38:13

No podrás actualizar WP después de hacer esto. No recomendado.

fuxia fuxia
13 abr 2012 04:32:47

Modificar el núcleo es simplemente una mala idea.

Philip Downer Philip Downer
1 abr 2013 20:57:48