web-dev-qa-db-ja.com

Wp_oembed_add_providerから結果を取得する

wp_oembed_add_provider() から結果が得られません。

私はFacebookからのビデオコンテンツを埋め込む必要があるサイトを開発しています、そして私は この便利なリスト FacebookのURL構造に出会いました。

私が最初に焦点を合わせているのはこれが私がテストしているビデオと一致するので#https?://(www\.)?facebook\.com/.*/videos/.*#iです。

サイドポイント:これは問題になるかもしれませんし、そうでないかもしれませんが、#がそこにあり、/がエスケープされない理由はわかりません正規表現の中で(私の正規表現に対する理解が限られているため)ただし、 YouTubeのコーデックスの例 の形式と一致します。

これは私のテーマのfunctions.phpにあります:

add_action("init", function(){

    wp_oembed_add_provider(
        '#https?://(www\.)?facebook\.com/.*/videos/.*#i',
        'https://www.facebook.com/plugins/video/oembed.json/',
        true
    );

});

一致させようとしているURLは https://www.facebook.com/899lightfm/videos/972261526144646/ です。

Facebookのエンドポイントは https://www.facebook.com/plugins/video/oembed.json/?url=https://www.facebook.com/899lightfm/videos/972261526144646/ 有効な応答を返します。

投稿の中で、私は自分自身の行にビデオのURLがあり、それに続いて自分自身の行に同様のYouTubeのURLがあります。 YouTubeのURLは、Wordpressがネイティブにサポートしていることを考えれば、予想どおり正常に検出されて埋め込みに変換されますが、FacebookのURLは変更されず、プレーンテキストで印刷されるだけです。

wp_oembed_add_provider()を正しく使っていますか? Wordpressがこれを解決するために私がやるべきことが他にありますか?

EDITinitが遅すぎる場合に備えてafter_setup_themeにフックしようとしましたが、同じ問題が発生しています。ウェブ上でinitwp_oembed_add_provider()をフックするためのより一般的なアクションのようです。

2
Tim Malone

わかりましたこれで解決できました!

埋め込みシステムがどのように機能するのかを掘り下げて調べたところ、間違ったのはwp_oembed_add_provider()の使用ではなかったことがわかりました。 wp-includes\class-wp-embed.phpautoembed_callback()をデバッグしたところ、私のYouTubeのURLは通っていたことがわかりましたが、私のFacebookのURLはこの関数に到達しませんでした。

投稿コンテンツをautoembed()関数(the_content()にフック)を通過する前にエコーすると、何らかの理由でFacebookのURLがautoembed()で要求されているように「改行されず」、<p></p>タグで囲まれていることがわかりました。たとえそれが明らかにエディタの新しい行にあったとしても。

FB URLが独自の行にならなかった理由はわかりませんが、autoembed()の機能からヒントを得て、私はfunctions.phpに以下を追加しました。

add_filter("the_content", function($content){

    // Find URLs that are on their own line but are wrapped in <p></p> tags

    return preg_replace_callback(
        '|^\<p\>(\s*)(https?://[^\s"]+)(\s*)\</p\>$|im',
        array($GLOBALS["wp_embed"], "autoembed_callback"),
        $content
    );

}, 11);

これがwpautop()(デフォルトの優先順位10でthe_content上で実行される)の後に実行される限り、両方のリンクは正しく新しい行に移動され、<p></p>タグで囲まれます。そして、この関数は検出されたURLをautoembed_callbackに送信します。この時点で、すべてが必要に応じて開始されます。

うわー。したがって、本当の問題は改行、そしておそらくWordpressが自動埋め込みするURLを検出する方法に関係しています。 Edgeのケースを拾うためには、コア内の正規表現がおそらくより良い可能性があると思いますが、この追加機能が今のところこの問題を捕捉することを願っています。これが引き起こす追加の問題に遭遇した場合は、これを更新します。

2
Tim Malone