WP Oembed geht nicht durch die Variable "autoplay = 1"


7

Ich habe hier ein Problem:

Ich übergebe dies durch ein benutzerdefiniertes Feld: http://www.youtube.com/watch?v=E6P1Q-UycHA&autoplay=1

(beachte das autoplay=1)

Aber wenn ich das Video mit wp_oembed_get in mein Thema lade, wird das Video gut angezeigt, aber die autoplay=1Variable, die ich gerade durchlaufe, wird nicht abgehört .

Ich brauche die Videos, um sie beim Laden der Seite abzuspielen.

Irgendwelche Ideen?

Danke, Alain Fontaine


Versuchen Sie diese Antwort: stackoverflow.com/a/16801334/2721050 Das war sehr hilfreich für mich
Erez Lieberman

Antworten:


6

Das sind keine wirklichen Argumente wie für YouTube, sondern eher Argumente für WordPress.

Eine Möglichkeit, damit umzugehen, besteht darin, später in einem Filter auf Ihr Argument zuzugreifen und die HTML-Ausgabe zu ändern.

Übergeben Sie das Argumentarray:

wp_oembed_get( 'http://www.youtube.com/watch?v=', array( 'autoplay' => 1 ) );

Und Filter:

add_filter('oembed_result','oembed_result', 10, 3);

function oembed_result($html, $url, $args) {

    // $args includes custom argument
    // modify $html as you need

    return $html;
}

4

Ich weiß, dass diese Frage ziemlich alt ist, aber ich habe eine funktionierende Lösung, die meiner Meinung nach für alle anderen hilfreich sein könnte, die versuchen, diese Informationen zu finden, und die bei Google-Suchanfragen leer sind.

Diese Lösung wurde in WordPress 3.7.1+ getestet:

/**
 * Adds the `autoplay` query string argument to embedded YouTube videos
 */
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);

Fügen Sie das Obige in Ihr Thema ein functions.php, damit alle über oEmbed hinzugefügten YouTube-Videos automatisch wiedergegeben werden.


Wie das funktioniert

In class-oembed.php in Zeile 212 fetch()wendet die Methode den Filter oembed_fetch_urlan, um Änderungen an der URL zu ermöglichen.

Um zu vermeiden, dass anderen oEmbed-Anbietern nutzlose Parameter hinzugefügt werden, suchen wir in der Anbieter-URL nach "youtube" - wir können auch nach "vimeo" und / oder anderen Videodiensten suchen - und fügen autoplayder Abfrage ein Argument hinzu, wenn diese Zeichenfolge vorhanden ist Zeichenfolge.


5
Diese Lösung funktioniert bei mir nicht. Es wird &autoplay=1zur Anbieter-URL hinzugefügt . Das ist NICHT der iframe src, und das oembed-System von youtube überträgt ihn nicht. Der Wert geht verloren _fetch_with_formatund wird nach oembed_fetch_url aufgerufen. Vielleicht hat das früher funktioniert, aber YouTube hat die API geändert?
Radley Sustaire

1

Dies ist meine Lösung 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

genießen


Bitte werfen Sie keinen Codeblock aus, bearbeiten Sie ihn möglicherweise und fügen Sie ihm eine Erklärung hinzu.
Mayeenul Islam

1

Cross-Posting meiner Antwort von https://stackoverflow.com/a/55053642/799327 , hoffe, das ist in Ordnung, da es aus dem gleichen OP stammt:


Nach einigen Recherchen besteht der beste Weg, dies zu tun, darin, den oembed_fetch_urlFilter-Hook zu nutzen, um der oEmbed-Anforderungs-URL zusätzliche Argumente hinzuzufügen. Mein spezifisches Ziel war es, einen Autoplay-Parameter zuzulassen, aber diese Methode ist so aufgebaut, dass sie leicht an jedes von Ihnen benötigte oEmbed-Argument angepasst werden kann.

Fügen Sie dies zunächst zu Ihrem hinzu functions.php:

<?php
/**
 * Add parameters to 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);

Diese Funktion verwendet die generierte oEmbed-URL und die entsprechenden Argumente und überprüft sie in diesem Fall anhand einer fest codierten Liste von Argumenten auf der Whitelist ['autoplay'] . Wenn eines dieser Schlüsselwörter in der Whitelist in den an den oEmbed-Filter übergebenen Argumenten angezeigt wird, werden sie mit dem angegebenen Wert zur oEmbed-URL hinzugefügt.

Anschließend müssen Sie nur noch den Parameter oEmbed zu Ihrem Shortcode im Wordpress-Editor hinzufügen:

[embed autoplay="true"]https://vimeo.com/1234567890/1234567890[/embed]

Beachten Sie, dass die oEmbed-Klasse in WP das Postmeta als Cache für diese Anforderungen verwendet. Wenn Sie also die Ziel-URL zuvor eingebettet haben, müssen Sie möglicherweise Ihren Postmeta-Cache auf irgendeine Weise leeren oder dem Cache-Buster eine Art hinzufügen Ziel-URL. Wenn sich der Link im Cache befindet, wird der Filter-Hook niemals ausgeführt.

Ich hoffe, dass dies sinnvoll ist, da ich der Meinung bin, dass es eine ziemlich nützliche Funktion ist, die überraschend schwer herauszufinden ist, wie man sie erreicht.


0

Alles nach dem ersten Parameter muss als Array von Argumenten gesendet werden.

Siehe das Beispiel auf der Codex-Seite.
http://codex.wordpress.org/Function_Reference/wp_oembed_get

Wenn Sie versuchen, einen benutzerdefinierten Feldwert zu übernehmen und ihn durch den Einbettungscode in ein Video konvertieren zu lassen (dh was würde passieren, wenn Sie ihn in den Inhalt einfügen), können Sie Folgendes tun ...

/*
   N - replace with a valid post ID
   key - replace with a valid custom field key(name)
*/
$data = get_post_meta( N, 'key', true );
if( $data )
   echo apply_filters( 'the_content', $data );

Dies führt natürlich mehrere Filter über die Daten aus, die Sie nicht benötigen, aber es macht den Trick trotzdem.


1
Leider sind die einzigen Argumente, die wp_oembed_get abhört, 'width' und 'height'
John P Bloch

Vermutlich gibt es in diesem Argument kein Passieren .. zumindest nicht mit wp_oembed_get ..
t31os

Ja; Soweit ich weiß (obwohl ich mich darin irren könnte), lässt die oEmbed-API von youtube dieses Argument überhaupt nicht zu.
John P Bloch

Ich habe ein wenig in die Einbettung gegraben, und soweit ich das beurteilen kann (wie Sie sagten), sind die einzigen Argumente, die weitergegeben werden, Höhe und Breite. (Einfach zu testen, rufen Sie die Funktion mit einem übergebenen Array auf, nicht wahr? t arbeiten jedoch mit Autoplay, Breite und Höhe).
t31os

Vielen Dank an alle, ich muss nach einer anderen Lösung suchen.
Kritiker

0

Nach all den Nachforschungen habe ich Folgendes gefunden. Unten ist der Code.

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

Credits an https://gist.github.com/mustardBees/7704269#file-functions-php .

Vielen Dank!


-5

Dies kann einfach behoben werden, indem die Funktion wp_oembed_get () in wp-includes / media.php folgendermaßen geändert wird:

function wp_oembed_get( $url, $args = '' ) {
    // Manually build the IFRAME embed with the related videos option disabled and autoplay turned on
    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 );
}

Stellen Sie außerdem sicher, dass Sie die folgende SQL-Abfrage ausführen, nachdem Sie diese Änderung vorgenommen haben, damit die Einbettung aktualisiert wird: DELETE FROM wp_postmeta WHERE meta_key LIKE '_oembed_%'
interimpulso

2
Sie können WP danach nicht mehr aktualisieren. Nicht empfohlen.
Fuxia

2
Das Ändern des Kerns ist nur eine schlechte Idee.
Philip Downer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.