web-dev-qa-db-ja.com

投稿のコンテンツに挿入された最初の埋め込みURLを抽出する

私は投稿のコンテンツに挿入された最初のoEmbed URLをヘッダから、あるいは他の場所に挿入して他のコンテンツとは異なるスタイルにする方法を抽出したいと思います。

3
peroyomas

私はあなたが実際に埋め込まれたデータを発見するのに実際に成功する最初のURLだけに興味があると思います。 oembedシステムはそれが見つけたすべてのリンクを処理しますが、明らかにすべてのリンクがそれに向かってoembedしているわけではありません。

あなたが使いたいフィルタはembed_oembed_htmlで、それはoembedによってキャッシュされたHTML、url、embedのあらゆる属性、そしてあなたのコードにとって重要なpost_IDを取得します。

add_filter('embed_oembed_html', 'my_function',10,4);
function my_function( $cache, $url, $attr, $post_ID ) {
  global $my_previous_post_id;
  if ($my_previous_post_id != $post_ID) {
    // post ID changed, so this is the first oembed for the post
    // do something with $url
    $my_previous_post_id = $post_ID;
  }
  return $cache; // it's important that you return the $cache value as-is
}

さて、ショートコードと同じように、組み込みシステム全体が実行されています:the_contentフィルター呼び出しの間。そのため、ヘッダの内容を取得したい場合は、ヘッダのメインループを開始し、get_the_content()値に対してthe_contentフィルタを実行してから、rewind_posts()を呼び出して実際のクエリの先頭に巻き戻すページの後半でメインループ。

この種の振る舞いは(Nextgen galleryのような)プラグインで問題を引き起こします。ヘッダでループを実行したときに愚かなことをします。回避策はありませんが、実際にはこれらのプラグインは根本的に壊れていて、あなたはそれらの問題を修正できません。私はいつもSFC-ShareとSFC-Likeを使ってこの種の報告を受けています(なぜならそれらはヘッダに入れるために内容を引き出すからです)。率直に言って、できることは何もありません。

5
Otto

私は@Rarstから答えを試してみましたが、実際にはそれは問題に対する非常に安定した解決策ではありません。上記のvar_dump変数を$metaしようとすると、おそらくキャッシュ無効化のためのメタフィールド_oembed_time_xxxxxxxxxxxxがもう1つあることに気付くでしょう。

また、投稿のコンテンツからoEmbedリンクを削除しても、キャッシュされたeEmbedメタ文字列は削除されませんでした。これは私が望んでいたことではありません。

だから私はwp-includes/class-oembed.phpwp-includes/class-wp-embed.phpのネイティブのWPコードをもう少し詳しく調べて、もっとしっかりした解決策を思いつきました:

function get_first_oembed_from_content( $content ) {
    if ( preg_match( '|^\s*(https?://[^\s"]+)\s*$|im', $content, $matches ) ) {
        return wp_oembed_get( $matches[1] );
    }

    return false;
}

正規表現パターンはネイティブのWP_Embed:autoembed()関数からコピーされているので、最も信頼できるものです。

ここからこの関数を修正して最初のURLだけを抽出するのも簡単です。

2
pcigler

これを試して:

function get_first_oembed($id) {

    $meta = get_post_custom($id);

    foreach ($meta as $key => $value)
        if (false !== strpos($key, 'oembed'))
            return $value[0];
}

埋め込みはHTMLのレンダリングされたブロックとして格納されているように見えるので、リンクだけを使用したい場合はさらにそれを抽出する必要があります。

2
Rarst