web-dev-qa-db-ja.com

Get_post()で自動埋め込みを使用する

私はWordPressディレクトリの外にPHPスクリプトを持っています。ここでは特定の投稿のコンテンツを取得していて、それにoembedフィルタを適用しようとしています。

include('../wp-load.php');
$thePost = get_post(42, ARRAY_A);
$theContent = $thePost['post_content'];

記事のコンテンツには、テキストとYouTubeへの1つ以上のURL(または同様のページ)が含まれています。明らかにWordPressはそれらのURLを見つけてそれらを埋め込みに書き換えることができますが、私はこの振る舞いを私のコードスニペットに適用する方法を私は知りません。

wp_oembed_getがあることは知っていますが、その関数は自動検出を行いません。

どのようにこれを達成するためのアイデアですか?

1
Patrick

あなたはあなたの投稿にグローバル$postオブジェクトを設定する必要があります。これはあなたのテーマのループ機能によって行われます。

WPのoEmbedはthe_contentフィルタの間にURLを置き換えます。しかし、それは2つの方法でURLを置き換えます。 1つ目は、Google Videoなどの特定のURLや、ビデオ形式の拡張子が付いたファイルに直接リンクするための単純な正規表現の検索と置換です。

OEmbedが扱う2つ目の方法は、ほとんどのサービス(YouTubeなど)の処理方法です。 2番目の方法は最初の方法と似ていますが、結果がpostmetaテーブルに格納される点が異なります。そのため、$postを設定する必要があります。 2番目の方法では、さまざまなサービスハンドラにURLが自分のものかどうかを尋ねます。 URLが自分のものであれば、埋め込み用のHTMLを生成します。次に、oEmbedはURLのHTMLをpostmetaテーブルにキャッシュします。これは、サービスがHTMLコードを取得するためにリモートAPI呼び出しを必要とする可能性があるためです。投稿が表示されるたびに、このオーバーヘッドを最小限に抑えたいと思います。

include('../wp-load.php');
$thePost = get_post(42);

// Set our post to the globally used $post object as oEmbed will use it to do a meta value lookup
global $post; 
$post = $thePost;

echo apply_filters('the_content', $thePost->post_content );
3
Seamus Leahy

少なくとも最後に確認した "autoembedding"はthe_contentのフィルタのために動作します。あなたのコードはそのフィルタを適用しません。

$thePost = get_post(42, ARRAY_A);
$theContent = $thePost['post_content'];
echo apply_filters('the_content',$theContent);

WordPress Coreが正しくロードされていると仮定すると、それは埋め込みを動作させるはずです。

1
s_ha_dum