WP Oembed nu transmite variabila "autoplay=1" | WordPress Developer
Am o problemă aici:
Transmit acest URL printr-un câmp personalizat: http://www.youtube.com/watch?v=E6P1Q-UycHA&autoplay=1
(observați parametrul autoplay=1
)
Dar când încarc videoclipul în tema mea folosind wp_oembed_get... afișează videoclipul corect, dar nu ia în considerare parametrul autoplay=1
pe care îl transmit.
Am nevoie ca videoclipurile să pornească automat la încărcarea paginii.
Idei?
Mulțumesc, Alain Fontaine

Acestea nu sunt chiar argumente precum cele pentru YouTube, ci mai degrabă argumente pentru WordPress în sine.
O modalitate de a gestiona acest lucru ar fi să accesați argumentul mai târziu în cadrul unui filtru și să modificați output-ul HTML.
Transmiteți un array de argumente:
wp_oembed_get( 'http://www.youtube.com/watch?v=', array( 'autoplay' => 1 ) );
Și filtrați:
add_filter('oembed_result','oembed_result', 10, 3);
function oembed_result($html, $url, $args) {
// $args include argumentul personalizat
// modificați $html după cum aveți nevoie
return $html;
}

Știu că această întrebare este destul de veche, dar am o soluție funcțională care cred că ar putea fi utilă pentru oricine încearcă să găsească această informație și nu găsește nimic în căutările Google.
Această soluție a fost testată în WordPress 3.7.1+:
/**
* Adaugă argumentul `autoplay` în șirul de interogare pentru videoclipurile YouTube incorporate
*/
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);
Adăugați codul de mai sus în functions.php
al temei pentru a face ca toate videoclipurile YouTube adăugate prin oEmbed să pornească automat.
Cum funcționează
În class-oembed.php la linia 212, metoda fetch()
aplică filtrul oembed_fetch_url
pentru a permite modificări ale URL-ului.
Pentru a evita adăugarea de parametri inutili la alți furnizori oEmbed, verificăm dacă în URL-ul furnizorului există "youtube" — am putea verifica și "vimeo" sau/sau alte servicii de videoclipuri — și, dacă acel șir este prezent, adăugăm un argument autoplay
la șirul de interogare.

Această soluție nu funcționează pentru mine. Adaugă &autoplay=1
la URL-ul furnizorului. Acesta NU este src-ul iframe-ului, iar sistemul de oembed al YouTube nu îl transferă. Valoarea se pierde în timpul _fetch_with_format
care este apelat după oembed_fetch_url. Poate că aceasta funcționa în trecut, dar YouTube și-a modificat API-ul de oembed?

Postez răspunsul meu de pe https://stackoverflow.com/a/55053642/799327, sper că e în regulă deoarece este de la același OP:
După ce am cercetat acest subiect, cea mai bună metodă este să folosim hook-ul de filtrare oembed_fetch_url
pentru a adăuga argumente suplimentare la URL-ul de solicitare oEmbed. Scopul meu specific a fost să permit un parametru de autoplay, dar această metodă este concepută pentru a fi ușor de adaptat la orice argument oEmbed de care ai nevoie.
Mai întâi, adaugă acest cod în functions.php
:
<?php
/**
* Adaugă parametri la 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);
Această funcție preia URL-ul generat oEmbed și argumentele corespunzătoare, apoi le verifică împotriva unei liste predefinite de argumente permise, în acest caz ['autoplay']
. Dacă identifică oricare dintre aceste cuvinte cheie permise în argumentele transmise filtrului oEmbed, le adaugă cu valoarea lor la URL-ul oEmbed.
Apoi, tot ce trebuie să faci este să adaugi parametrul oEmbed în shortcode-ul din editorul WordPress, astfel:
[embed autoplay="true"]https://vimeo.com/1234567890/1234567890[/embed]
Fii atent că clasa oEmbed din WP folosește postmeta ca cache pentru aceste cereri, așa că dacă ai încorporat URL-ul țintă anterior, poate fi necesar să ștergi cache-ul postmeta sau să adaugi un cache buster la URL-ul țintă. Dacă link-ul este în cache, hook-ul de filtrare nu va fi executat niciodată.
Sper că acest lucru are sens, deoarece consider că este o funcționalitate destul de utilă, dar surprinzător de greu de realizat.

Aceasta este soluția mea în 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
sper să vă folosească

Orice după primul parametru trebuie trimis ca un array de argumente.
Vezi exemplul dat pe pagina codex.
http://codex.wordpress.org/Function_Reference/wp_oembed_get
Dacă încerci să iei o valoare din câmpul personalizat și să o convertești în cod de embed (adică ceea ce s-ar întâmpla dacă ai plasa conținutul în postare), atunci poți face ceva de genul acesta...
/*
N - înlocuiește cu un ID valid de postare
key - înlocuiește cu o cheie validă de câmp personalizat(nume)
*/
$data = get_post_meta( N, 'key', true );
if( $data )
echo apply_filters( 'the_content', $data );
Desigur, acest lucru va rula mai mulți filtre asupra datelor pe care nu ai nevoie, dar funcționează la fel de bine..

Din păcate, singurele argumente pe care wp_oembed_get le va asculta sunt 'width' și 'height'

Presupun că nu se poate pasa acel argument atunci... cel puțin nu folosind wp_oembed_get..

Da; din câte știu eu (deși aș putea greși în privința asta) API-ul oEmbed de la YouTube nu permite deloc acel argument.

Am făcut o mică investigație în legătură cu embed și, din câte am înțeles (așa cum ai spus), singurele argumente care sunt transmise sunt înălțimea și lățimea... (este ușor de testat, apelează funcția cu un array transmis, nu funcționează cu autoplay, dar lățimea și înălțimea funcționează).

După toate cercetările, ceea ce am găsit este acest lucru. Mai jos este codul.
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 );
Credite către https://gist.github.com/mustardBees/7704269#file-functions-php.
Mulțumesc!

Nu știu dacă mai este nevoie, dar voi posta răspunsul aici
<?php
/**
* Script ACF oEmbed cu parametri pentru player
* @link https://www.advancedcustomfields.com/resources/oembed/
*/
$video = get_field('video');
// folosește preg_match pentru a găsi src-ul iframe-ului
preg_match('/src="(.+?)"/', $video, $matches);
$src = $matches[1];
// adaugă parametri suplimentari la src-ul iframe-ului
$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);
// adaugă atribute suplimentare iframe-ului HTML
$attributes = 'frameborder="0"';
$video = str_replace('></iframe>', ' ' . $attributes . '></iframe>', $video);
if($video) :
echo '<div class='video-wrapper'>'.$iframe.'</div>';
endif;
de asemenea, ca Gist: https://gist.github.com/zachakbar/3100e093cb8484d47586a259f9f960dc

Aceasta poate fi rezolvată ușor prin modificarea funcției wp_oembed_get() din wp-includes/media.php astfel:
function wp_oembed_get( $url, $args = '' ) {
// Construim manual embed-ul IFRAME cu opțiunea de videoclipuri recomandate dezactivată și autoplay pornit
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 );
}

De asemenea, asigură-te să rulezi următoarea interogare SQL după ce faci această modificare, astfel încât embed-ul să fie actualizat:
DELETE FROM wp_postmeta WHERE meta_key LIKE 'oembed%'
