私は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
があることは知っていますが、その関数は自動検出を行いません。
どのようにこれを達成するためのアイデアですか?
あなたはあなたの投稿にグローバル$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 );
少なくとも最後に確認した "autoembedding"はthe_content
のフィルタのために動作します。あなたのコードはそのフィルタを適用しません。
$thePost = get_post(42, ARRAY_A);
$theContent = $thePost['post_content'];
echo apply_filters('the_content',$theContent);
WordPress Coreが正しくロードされていると仮定すると、それは埋め込みを動作させるはずです。