WP Oembed non passa la variabile "autoplay=1"
Sto avendo un problema:
Sto passando questo attraverso un campo personalizzato: http://www.youtube.com/watch?v=E6P1Q-UycHA&autoplay=1
(notare il autoplay=1
)
Ma quando carico il video sul mio tema usando wp_oembed_get... il video viene visualizzato correttamente, ma non risponde alla variabile autoplay=1
che sto passando.
Ho bisogno che i video partano automaticamente al caricamento della pagina.
Qualche idea?
Grazie, Alain Fontaine

Questi non sono veramente argomenti come per YouTube, ma piuttosto argomenti per WordPress stesso.
Un modo per gestirlo sarebbe accedere all'argomento in un secondo momento all'interno di un filtro e modificare l'output HTML.
Passa l'array di argomenti:
wp_oembed_get( 'http://www.youtube.com/watch?v=', array( 'autoplay' => 1 ) );
E filtra:
add_filter('oembed_result','oembed_result', 10, 3);
function oembed_result($html, $url, $args) {
// $args include l'argomento personalizzato
// modifica $html come necessario
return $html;
}

So che questa domanda è piuttosto vecchia, ma ho una soluzione funzionante che penso possa essere utile a chiunque altro stia cercando queste informazioni e non trovi nulla nelle ricerche Google.
Questa soluzione è stata testata in WordPress 3.7.1+:
/**
* Aggiunge l'argomento `autoplay` alla stringa di query dei video YouTube incorporati
*/
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);
Aggiungi il codice sopra nel file functions.php
del tuo tema per far sì che tutti i video YouTube aggiunti tramite oEmbed partano automaticamente.
Come Funziona
In class-oembed.php alla riga 212, il metodo fetch()
applica il filtro oembed_fetch_url
per consentire modifiche all'URL.
Per evitare di aggiungere parametri inutili ad altri provider oEmbed, controlliamo la presenza di "youtube" nell'URL del provider — potremmo anche cercare "vimeo" e/o altri servizi video — e, se quella stringa è presente, aggiunge un argomento autoplay
alla stringa di query.

Questa soluzione non funziona per me. Aggiunge &autoplay=1
all'URL del provider. Questo NON è l'src dell'iframe, e il sistema oembed di YouTube non lo trasferisce. Il valore viene perso durante _fetch_with_format
che viene chiamato dopo oembed_fetch_url. Forse in passato funzionava ma YouTube ha cambiato la loro API oembed?

Ripubblico la mia risposta da https://stackoverflow.com/a/55053642/799327, spero vada bene dato che proviene dallo stesso OP:
Dopo alcune ricerche, il modo migliore per farlo è sfruttare l'hook filter oembed_fetch_url
per aggiungere argomenti extra all'URL della richiesta oEmbed. Il mio obiettivo specifico era consentire un parametro di autoplay, ma questo metodo è costruito per essere facilmente adattabile a qualsiasi argomento oEmbed di cui hai bisogno.
Prima di tutto, aggiungi questo al tuo functions.php
:
<?php
/**
* Aggiungi parametri agli 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);
Questa funzione prende l'URL oEmbed generato e i suoi argomenti corrispondenti e li confronta con un elenco hard-coded di argomenti consentiti, in questo caso ['autoplay']
. Se rileva una di queste parole chiave negli argomenti passati al filtro oEmbed, le aggiunge con il loro valore dato all'URL oEmbed.
Poi, tutto ciò che devi fare è aggiungere il parametro oEmbed al tuo shortcode nell'editor di Wordpress, in questo modo:
[embed autoplay="true"]https://vimeo.com/1234567890/1234567890[/embed]
Tieni presente che la classe oEmbed in WP utilizza il postmeta come cache per queste richieste, quindi se hai già incorporato l'URL di destinazione prima, potresti dover svuotare la cache del postmeta in qualche modo o aggiungere un cache buster di qualche tipo all'URL di destinazione. Se il link è nella cache, l'hook filter non verrà mai eseguito.
Spero che questo abbia senso, poiché ritengo che sia una funzionalità piuttosto utile che è sorprendentemente difficile capire come ottenere.

Questa è la mia soluzione in 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
divertiti

Qualsiasi cosa dopo il primo parametro deve essere inviata come un array di argomenti.
Vedi l'esempio fornito nella pagina del codex.
http://codex.wordpress.org/Function_Reference/wp_oembed_get
Se stai cercando di prendere il valore di un campo personalizzato e convertirlo in codice embed per un video (cioè quello che accadrebbe se lo inserissi nel contenuto), puoi fare qualcosa come questo...
/*
N - sostituisci con un ID di post valido
key - sostituisci con una chiave di campo personalizzato valida (nome)
*/
$data = get_post_meta( N, 'key', true );
if( $data )
echo apply_filters( 'the_content', $data );
Questo ovviamente applicherà diversi filtri ai dati che potresti non necessitare, ma funziona comunque..

Sfortunatamente, gli unici argomenti che wp_oembed_get accetta sono 'width' e 'height'

Immagino che non si possa passare quell'argomento allora... almeno non usando wp_oembed_get..

Sì; per quanto ne so (anche se potrei sbagliarmi) l'API oEmbed di YouTube non permette affatto quell'argomento.

Ho fatto un po' di ricerche sull'embed e, per quanto ne so (come hai detto tu), gli unici argomenti che vengono passati sono altezza e larghezza... (facile da testare, chiama la funzione con un array passato, non funziona con autoplay, mentre larghezza e altezza funzionano).

Dopo tutte le ricerche, quello che ho trovato è questo. Di seguito il codice.
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 );
Crediti a https://gist.github.com/mustardBees/7704269#file-functions-php.
Grazie!

Non so se sia ancora necessario, ma posterò la risposta qui
<?php
/**
* Script ACF oEmbed con parametri del player
* @link https://www.advancedcustomfields.com/resources/oembed/
*/
$video = get_field('video');
// usa preg_match per trovare lo src dell'iframe
preg_match('/src="(.+?)"/', $video, $matches);
$src = $matches[1];
// aggiungi parametri extra allo src dell'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);
// aggiungi attributi extra all'html dell'iframe
$attributes = 'frameborder="0"';
$video = str_replace('></iframe>', ' ' . $attributes . '></iframe>', $video);
if($video) :
echo '<div class='video-wrapper'>'.$iframe.'</div>';
endif;
anche come Gist: https://gist.github.com/zachakbar/3100e093cb8484d47586a259f9f960dc

Questo può essere facilmente risolto modificando la funzione wp_oembed_get() in wp-includes/media.php in questo modo:
function wp_oembed_get( $url, $args = '' ) {
// Costruisce manualmente l'embed IFRAME con l'opzione dei video correlati disabilitata e l'autoplay attivato
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 );
}

Assicurati inoltre di eseguire la seguente query SQL dopo aver apportato questa modifica in modo che l'embed venga aggiornato:
DELETE FROM wp_postmeta WHERE meta_key LIKE 'oembed%'
