oEmbedが失敗した場合、代替を表示します


8

oEmbedが失敗したときに表示される代替画像を指定したいのですが。

具体的な使用例は、中国(または他の国)がYouTubeをブロックする場合の代替案を提供することです。YouTubeコンテンツが利用できないことは承知しておりますが、その場合は代替画像を提供したいと考えています。

この目的のためにoEmbedエラーコードにアクセスできるようにすることはできますか?


非常に興味深い質問です。残念ながら、私はあなたに答えを用意していませんが、これは間違いなく調べる価値のあるものです。
Pieter Goosen 2015

1
私はこの問題を調査してきました。かなり深く行きましたが、解決策は見つかりませんでした。問題は、oEmbedリクエストがクライアント側からではなく、Webサーバーから行われることです。サーバーではすべてが正常で、埋め込みHTMLはYouTubeによって返されます。つまり、ビデオをロードするiframeです。クライアントがiframeコンテンツを読み込もうとすると、コンテンツがブロックされます。私が理解できる限り、oEmbedは失敗せず、私たちにできることはほとんどないか、ほとんどありません。他の人がこれについてどう思うかを期待しています。
cybmeta 2015

確かではありませんが、oembedのAPIはRESTful APIで機能すると思います。このAPIは、このようなクライアントへの応答を返しますGET /photos/bees/2362225867/ HTTP/1.1 Host: flickr.com Accept: application/oembed+xml。デフォルトは、406 Not Acceptableなどのエラーhttpコードを取得するデフォルトです。これはメッセージを返すのに役立ちます。
bueltge 2015

@bueltge oEmbedから返された応答はクライアントに送信されません。コメントで言ったように、少なくともYouTubeにとってはそうではありません。oEmbedリクエストはサーバー側で行われ、YouTubeは<iframe>HTMLを返します。これが投稿に埋め込まれているものであり、それがクライアントに対するサーバー<iframe>です。中国のクライアントがコンテンツをロードしようとすると、<iframe>ブロックされます。サーバー側は何も関与していません。私は他のoEmbedプロバイダーでテストしていませんが、すべて同じように機能すると思います。実際、oEmbedがクライアント側で実行される場合、埋め込まれる実際のコンテンツはありません。
cybmeta

1
私が見る唯一の選択肢は、JavaScriptによって埋め込まれたコンテンツをチェックすることです。ビデオのiframeを取得できない場合、他の何かを表示する可能性があります...
jjarolim '19

回答:


1

この場合、最善の方法は、divレンダリングされる前にoEmbedコンテンツをでラップし、CSS background-imageプロパティで代替画像を表示することです。ビデオが読み込まれると、oEmbedコンテンツが背景画像を覆います。

embed_oembed_htmlフィルターを使用してラッパーを追加できます。

add_filter('embed_oembed_html', 'your_function_here');

追加の要素の読み込みが心配な場合は、JSを使用してクライアント側のチェックを行い、oEmbedが読み込まれているかどうかを確認できます。読み込まれていない場合は、背景画像をラッパーに読み込みます。

ビデオごとにカスタムフィールドを追加することで、はるかに複雑になる可能性がありますが、それが本質的なものです。


0

1つのアプローチは、中国に拠点を置くプロキシを介してサーバー側でoEmbedを使用して別のリクエストを行うことです。

これにより、クライアント上のリソースへの呼び出しが失敗するかどうかを事前に知ることができます。ページリクエストの早い段階で、クライアントのIPが地理的にどこにあるかを確認し、プロキシを介してリソース(たとえばyoutube)にサーバー側の呼び出しを行い、おそらく取得するoEmbedエラーを利用できます。

あなたはこれを達成するためのWonderproxyを見ることができます(私はそれらとは関係ありませんが、良いことを聞きます)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.