【WordPress】埋め込み用のoembedファイルをheadに出力する方法

WordPress

WordPress(4.4~)が標準で出力するjson形式とxml形式のoembedデータファイル

自身のWordPressブログを記事にoembed機能で埋め込みできないなあとは思っていたのですが、あまり埋め込み自体は使わないのでほったらかしでした

以前は自動でoembed埋め込み機能自体使っていなかったのですが、WordPressのエディタがGutenbergになって段落ブロックにURLを置くと自動で埋め込みブロックになってしまい

このコンテンツは埋め込むことができません。

ってなってしまうんですよね

調べてみたらjson形式及びxml形式のoembedデータファイルがどちらもHTMLに出力されていませんでした

通常、出力されるoembedファイル

<link rel="alternate" type="application/json+oembed" href="" />
<link rel="alternate" type="text/xml+oembed" href="" />

出力する機能を停止していなければ、2種のlink relタグが<head>内に出力される

ググっても、これを消す方法は数あれど出力する方法は全然出てこない(WordPressが標準で出力するのだから当然なのですけども)

oembedファイルが出力されない原因

原因を確認してみたら利用しているテーマ「Luxeritas」のブログカードの機能を使っていて、尚且「直書きの URLをブログカード化する」を有効にしていると上記link relタグの出力も無効になっている模様

ブログカード設定画面

他の方達の「Luxeritas」を利用しているブログをいくつかチェックしてみると、やはり出力されていたりされていなかったり

「直書きの URLをブログカード化する」機能は凄く便利で、もしかテーマを変更する時にも記事データにあるのはショートコードでもなく直書きのURLなので対応がしやすいと考え、ずっと使っています

WordPressのoembed機能と手順が一緒なのでリンク生成としてはoembed機能が消えるのは当然ですが、自身のブログ記事のoembedデータファイル出力まで停止していたとは

自身はoembedの埋め込みを利用しなくても、埋め込み用のoembedを出力しておけば、もしかどなたかが利用してリンクしてくれるかもしれない

「このコンテンツは埋め込むことができません。」なんて出たら「まいっか」ってなって(数少ない)リンクしてもらえるチャンスが減ってしまうかもしれません

oembed用ファイルをheadに出力する方法

かといって「直書きの URLをブログカード化する」は外したくないので別で出力する方法を考えました

link relタグをそのまま出力する

出てくるコードは固定なので直接書いても問題ありませんでした

フロントページなど投稿ページ以外のページはアクセスしてもコードが生成されないので投稿ページだけで実行します(他ページで生成されないのはWordPressの仕様みたい)

function oembed_add(){
 if( is_singular() ){
  echo '<link rel="alternate" type="application/json+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink() ) ) . '" /><link rel="alternate" type="text/xml+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink(), 'xml' ) ) . '" />';
	}
}

add_action('wp_head','oembed_add');

wp_oembed_add_discovery_linksで出力する

おそらくremove_action()で止められていると思われるWordPressの独自関数wp_oembed_add_discovery_linksを実行します

優先順序を初期値より遅い11にすることで表示されました

add_action( 'wp_head', 'wp_oembed_add_discovery_links', 11);