この記事を三行にまとめると
blockquoteタグで囲われたリンクになるところまでは無効化されないURLがiframeに変わるところまでしかキャンセルできません
oEmbed機能を全体的にキャンセルしちゃうやり方を書いときます
「oEmbed」という機能があります。簡単に言えばURLが自動的にiframeなどの埋め込みコードに変わってくれる仕組みです。
例えばこんな感じにツイートのURLを本文中に書くだけで、わざわざ埋め込みコードをコピってこなくてもツイートを埋め込むことができます(これはただの画像ですが)。Wordpressを使っている場合、TwitterやyoutubeなどoEmbedに対応しているサイトのURLを記事の中に書けば、上記のように自動的にURLが埋め込みコードに変わってくれます。
ただしどんなサイトでもってわけではないようです。対応しているサイトを確認したい場合はこの辺りを見ると良いでしょう。
oEmbed – WordPress Codex
このoEmbedですが、Wordpressのバージョン4.4以降だと、Wordpressで作られたサイトも対象になっています。ようするに自分のブログなどもこのoEmbedによってURLが埋め込みに変わるってことですね。
こんな感じ。これもブログ記事のURLを本文に貼っつけただけです。Wordpressの機能によって自動的にiframeに変わっています。
このoEmbed機能、面白いことは面白いし便利な機能だとも思いますが、変わってほしくないこともあるでしょう。埋め込みではなくURLをそのまま使用したい場合もあると思います。
そんな時はどうするか。
いくつかやり方はあるみたいですが、一番簡単なのはfunctions.phpに以下のコードを書くことでしょうか。
これで自ブログの記事はiframeに変わらなくなります。Twitterなどは埋め込みに変わります。全部のサイトを検証したわけじゃないんですが、少なくともTwitterとyoutubeはこれをfunctions.phpに書いてもURLが埋め込みコードに変わりました。
あとはoEmbedを無効化するプラグインもあるので、それを使うという手もあります。
Disable Embeds
基本的にはこれで問題ないです。でもこのやり方だとURLがiframeに変わるところまでしかキャンセルできません。
WordpressのoEmbed機能なのですが、挙動としては本文中にあるURLがまずblockquoteタグで囲われたリンクに変わり、それがさらにiframeの埋め込みに変わるという二段階の動きをしているみたいなんですよ。なのでEmbedを無効化した場合、iframeに変わるところはキャンセルされますが、その前のblockquoteタグで囲われたリンクになるところまでは無効化されないんですね。
実際やってみるとこんな感じです。上はTwitterの埋め込みですが、下はブログ記事のタイトルがリンクになってる状態。blockquoteにCSSが当たってるのでこんな見た目になってますが、ただのリンクです。
もしリンクになる分には構わないってんなら気にする必要はありません。でもそれすらも無効化したい場合もあるでしょう。ソースコードのハイライトなどでURLをそのまま表示したい時とか。
そんな時はどうすれば良いか。
結論を言うと、よく分かりませんでした。何かしらのremove_actionで無効化できるかもしれないんですが、今回は見つけることができませんでした。
なのでとりあえずここでは、oEmbed機能を全体的にキャンセルしちゃうやり方を書いときます。
functions.phpにこの一行を追加したらURLがリンクに変わるところも無効化できました。
https://twitter.com/normnoiscom/status/799631848078880768
http://norm-nois.com/blog/archives/3736
ただしTwitterやyoutubeなどもURLのままになってしまいますので、注意が必要です。僕は今のところ不自由してないです。どうしても埋め込みたい場合は埋め込みコードを直接埋め込んでるし。
一応もう一つのやり方として、記事本文の表示に「get_the_content()」を使うってのもあります。
URLの自動変換は「the_content()」の中でフックしてるみたいなので、get_the_content()を使えば回避できるようです。
もしリンクになるのも防ぎたいけどどうしたら良いか分からないって場合は、上記のやり方を試してみてください。ただしremove_filterでautoembedをキャンセルした場合、他の部分にどんな影響があるかってとこまではすみませんが検証しきれてません。たぶんembedのところ以外の影響はないと思うんですが、もしこれやるとまずいよっていう場合は教えていただけるとありがたいです。
例えばこんな感じにツイートの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の埋め込みですが、下はブログ記事のタイトルがリンクになってる状態。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のところ以外の影響はないと思うんですが、もしこれやるとまずいよっていう場合は教えていただけるとありがたいです。