web-dev-qa-db-ja.com

ワードプレスの埋め込みを使用してパラメータを追加する

サポートされているビデオをWordpressに埋め込むためにカスタムフィールドを使用しているので、たとえばユーザーがカスタムフィールドボックスにビデオアドレスを入力します。

http://vimeo.com/72104173

私は私のテーマに以下のコードを実装しました。

<?php
$videourl = my_meta('video'); // get custom field value
if($videourl!=''){ // if custom field exist  ?>
<?php 
$htmlcode = wp_oembed_get("{$videourl}"); //use oembed  
echo "<div class='video'>{$htmlcode}</div>"; //output the video ?>
...

結果/出力は以下のとおりです。

<iframe ... src="http://player.vimeo.com/video/72104173"></iframe>

問題は、私が追加のパラメータをvimeoに追加したいので、srcに以下を追加することによってビデオのTitleとBylineを隠すことができるということです。

?title=0&amp;byline=0&amp;portrait=0

最終結果は次のようになります。

<iframe ... src="http://player.vimeo.com/video/72104173?title=0&amp;byline=0&amp;portrait=0"></iframe>

私はユーザーstr_replaceを使おうとしましたが、問題はパラメータがそれぞれのビデオソースの最後に追加され、毎回サーチャが変わることです。

本当に助けてくれてありがとう、ありがとう

1
Andy M

次のようにURLの末尾にクエリ引数を追加できます。

$videourl = add_query_arg( array('key1' => 'value1' ), $videourl ); // you can add as many as you want in key/value pairs...

$htmlcode = wp_oembed_get( $videourl );
// rest of your code...
1
user23654

結果を修正する必要がある場合に応じて、WordPressにoEmbedデータを変更するためのいくつかのフィルタがあります。

  1. embed_handler_html
    返された埋め込みハンドラをフィルタリングします。
  2. embed_oembed_html
    キャッシュされたoEmbed HTMLをフィルタリングします。
  3. oembed_result
    oEmbedプロバイダから返されたHTMLをフィルタ処理します。

ニーズに最も適したものを選択してください。ただし、各フィルタはoEmbedプロセスのさまざまな段階でデータに作用し、パフォーマンスに影響を与える可能性があることに注意してください。

たとえば、embed_handler_htmlはoEmbed/wp_postmetaキャッシュにデータが書き込まれる前に(外部埋め込みごとに1回だけ)呼び出されますが、embed_oembed_htmlはoEmbedキャッシュを取得した後(つまりアイテムが表示されるたびに)呼び出されます。

OEmbedデータを一度だけ修正する必要があるならば、おそらくoembed_resultがあなたの最良の候補です。

あなたの質問に答えるために、これはWordPressのwp_oembed_get()関数から返されたVimeoとYouTubeの埋め込みパラメータを変更する例です。

<iframe> HTMLマークアップは、最初にPHPの DOMDocument クラスによって解析され、次に埋め込みURLはWordPressを使用して変更されます ' add_query_arg() 関数:

/**
 *
 */
add_filter( 'oembed_result', function ( $html, $url, $args ) {
    $doc = new DOMDocument();
    $doc->loadHTML( $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );
    $tags = $doc->getElementsByTagName( 'iframe' );

    foreach ( $tags as $tag ) {
        $iframe_src = $tag->attributes->getNamedItem('src')->value;

        if ( false !== strpos( $iframe_src, 'youtube.com' ) ) {
            // https://developers.google.com/youtube/player_parameters
            $url = add_query_arg( array(
                'autohide' => 1,
                'autoplay' => 1,
                'controls' => 2,
                'feature' => null,
                'modestbranding' => 1,
                'playsinline' => 1,
                'rel' => 0,
                'showinfo' => 0,
            ), $iframe_src );
        }

        if ( false !== strpos( $iframe_src, 'vimeo.com' ) ) {
            // https://developer.vimeo.com/player/embedding
            $url = add_query_arg( array(
                'autoplay' => 1,
                'badge' => 0,
                'byline' => 0,
                'portrait' => 0,
                'title' => 0,
            ), $iframe_src );
        }

        $tag->setAttribute( 'src', $url );

        $html = $doc->saveHTML();
    }

    return $html;
}, 10, 3 );
0
rjb

私が推測した(試みなかった)他の解決策ではうまくいかないのは、Vimeoに埋め込みコードを尋ねる前にURLに追加することがVimeoによって無視されるかもしれないということかもしれません。

だから私はRegExを使ってレスポンスをパースするだけです。

$htmlcode = preg_replace("/(http:\/\/player.vimeo.com\/video\/[0-9]*)/i", '$1?title=0&portrait=0&byline=0&color=ffffff', $htmlcode);
0
kraftner