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がこれを解決するために私がやるべきことが他にありますか?
EDIT:init
が遅すぎる場合に備えてafter_setup_theme
にフックしようとしましたが、同じ問題が発生しています。ウェブ上でinit
はwp_oembed_add_provider()
をフックするためのより一般的なアクションのようです。
わかりましたこれで解決できました!
埋め込みシステムがどのように機能するのかを掘り下げて調べたところ、間違ったのはwp_oembed_add_provider()
の使用ではなかったことがわかりました。 wp-includes\class-wp-embed.php
でautoembed_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のケースを拾うためには、コア内の正規表現がおそらくより良い可能性があると思いますが、この追加機能が今のところこの問題を捕捉することを願っています。これが引き起こす追加の問題に遭遇した場合は、これを更新します。