WordPressのoEmbed完全キャンセルしちゃいます?

マジックザギャザリングナツカシス

おまとめ三行

blockquoteタグで囲われたリンクになるところまでは無効化されない
URLがiframeに変わるところまでしかキャンセルできません
oEmbed機能を全体的にキャンセルしちゃうやり方を書いときます

「oEmbed」という機能があります。簡単に言えばURLが自動的にiframeなどの埋め込みコードに変わってくれる仕組みです。

Twitterの埋め込み

例えばこんな感じにツイートのURLを本文中に書くだけで、わざわざ埋め込みコードをコピってこなくてもツイートを埋め込むことができます(これはただの画像ですが)。Wordpressを使っている場合、TwitterやyoutubeなどoEmbedに対応しているサイトのURLを記事の中に書けば、上記のように自動的にURLが埋め込みコードに変わってくれます。

ただしどんなサイトでもってわけではないようです。対応しているサイトを確認したい場合はこの辺りを見ると良いでしょう。
oEmbed – WordPress Codex

このoEmbedですが、Wordpressのバージョン4.4以降だと、Wordpressで作られたサイトも対象になっています。ようするに自分のブログなどもこのoEmbedによってURLが埋め込みに変わるってことですね。

ブログの埋め込み

こんな感じ。これもブログ記事のURLを本文に貼っつけただけです。Wordpressの機能によって自動的にiframeに変わっています。

このoEmbed機能、面白いことは面白いし便利な機能だとも思いますが、変わってほしくないこともあるでしょう。埋め込みではなくURLをそのまま使用したい場合もあると思います。

そんな時はどうするか。

いくつかやり方はあるみたいですが、一番簡単なのはfunctions.phpに以下のコードを書くことでしょうか。

remove_action('wp_head','rest_output_link_wp_head');
remove_action('wp_head','wp_oembed_add_discovery_links');
remove_action('wp_head','wp_oembed_add_host_js');

これで自ブログの記事はiframeに変わらなくなります。Twitterなどは埋め込みに変わります。全部のサイトを検証したわけじゃないんですが、少なくともTwitterとyoutubeはこれをfunctions.phpに書いてもURLが埋め込みコードに変わりました。

あとはoEmbedを無効化するプラグインもあるので、それを使うという手もあります。
Disable Embeds

基本的にはこれで問題ないです。でもこのやり方だとURLがiframeに変わるところまでしかキャンセルできません。

WordpressのoEmbed機能なのですが、挙動としては本文中にあるURLがまずblockquoteタグで囲われたリンクに変わり、それがさらにiframeの埋め込みに変わるという二段階の動きをしているみたいなんですよ。なのでEmbedを無効化した場合、iframeに変わるところはキャンセルされますが、その前のblockquoteタグで囲われたリンクになるところまでは無効化されないんですね。

上がTwitterのiframe、下がブログのリンク

実際やってみるとこんな感じです。上はTwitterの埋め込みですが、下はブログ記事のタイトルがリンクになってる状態。blockquoteにCSSが当たってるのでこんな見た目になってますが、ただのリンクです。

もしリンクになる分には構わないってんなら気にする必要はありません。でもそれすらも無効化したい場合もあるでしょう。ソースコードのハイライトなどでURLをそのまま表示したい時とか。

そんな時はどうすれば良いか。

結論を言うと、よく分かりませんでした。何かしらのremove_actionで無効化できるかもしれないんですが、今回は見つけることができませんでした。

なのでとりあえずここでは、oEmbed機能を全体的にキャンセルしちゃうやり方を書いときます。

remove_filter('the_content', array($wp_embed, 'autoembed'), 8);

functions.phpにこの一行を追加したらURLがリンクに変わるところも無効化できました。

https://twitter.com/normnoiscom/status/799631848078880768
http://norm-nois.com/blog/archives/3736

ただしTwitterやyoutubeなどもURLのままになってしまいますので、注意が必要です。僕は今のところ不自由してないです。どうしても埋め込みたい場合は埋め込みコードを直接埋め込んでるし。

一応もう一つのやり方として、記事本文の表示に「get_the_content()」を使うってのもあります。

//リンクに変わる
the_content();

//URLのまま
echo get_the_content();

URLの自動変換は「the_content()」の中でフックしてるみたいなので、get_the_content()を使えば回避できるようです。

もしリンクになるのも防ぎたいけどどうしたら良いか分からないって場合は、上記のやり方を試してみてください。ただしremove_filterでautoembedをキャンセルした場合、他の部分にどんな影響があるかってとこまではすみませんが検証しきれてません。たぶんembedのところ以外の影響はないと思うんですが、もしこれやるとまずいよっていう場合は教えていただけるとありがたいです。

WordPressの一覧ページが激重になってたのはoEmbedでした | 株式会社オルタ 2017年08月10日 00:40:49
[…] WordPressのoEmbed完全キャンセルしちゃいます? https://norm-nois.com/blog/archives/3740 […]
 もしかしたら何か関連しているかも?