WordPressでget_*()を使うときは念のためソースを確認して適切に処理すべし!

先日facebookの中でのやりとりで、ここわかりにくいんだよなーって思った事例がありました。

WordPressのテーマ内でパーマリンクを出力するには the_permalink() 関数を使用します。

<?php the_permalink(); ?>

でも、これ、いきなり出力してしまうので、場合によっては get_permalink() を使いこともありますよね。

他にも同様のケースで、the_*() のようなテンプレートタグを get_*() で置き換えることが多いと思います。

でもこれ、ケースバイケースですがあんまよくないです。。。

the_*() の値と get_*() の値は必ずしも同じじゃないことに注意しよう!

たとえば、the_permalink() のソースを見ると以下のようになっています。

function the_permalink() {
	echo esc_url( apply_filters( 'the_permalink', get_permalink() ) );
}

ネット上の多くのサンプルソースでは、the_permalink() は get_permalink() を echo しているだけのように解釈されていますが、上のソースを見ると分かる通り実際には結構やばいです。

まず the_permalink というフィルターフックが適用されています。

これは、プラグインが何らかの処理をここで行う可能性があるため、プラグインの処理が適切に反映されない可能性があります。

また、the_permalink() は、get_permalink() の値に対してさらに esc_url() を経由していますので、get_permalink() をそのまんま使用してしまうとセキュリティリスクになる可能性もあります。

したがって、 the_permalink() と同じ値を変数に放り込むなら以下のようにするのが正しいやり方です。

$permalink = esc_url( apply_filters( 'the_permalink', get_permalink() ) );

 

同じような関数は、他にもいろいろあります。

たとえば the_content() と get_the_content() ではショートコードなどの実行結果が反映されないので、まあまあ痛いことになります。

function the_content( $more_link_text = null, $strip_teaser = false) {
	$content = get_the_content( $more_link_text, $strip_teaser );
	$content = apply_filters( 'the_content', $content );
	$content = str_replace( ']]>', ']]&gt;', $content );
	echo $content;
}

 

the_excerpt() と get_the_excerpt() も結構痛いです。

function the_excerpt() {
	echo apply_filters('the_excerpt', get_the_excerpt());
}

これ、あんま変わらないように見えますが、the_excerpt フックでは、抜粋欄に入力がなかった場合に本文から自動的に生成する処理を行っており、そのときにショートコードなどの処理も行っています。

たまにOGPで [galley ... みたいな文字が混ざってるのを見たことありません?

それは、OGPに get_the_excerpt() の値をそのまんま放り込んでいるからです。

ただしくは以下のようにするべきです。

$og_description = apply_filters('the_excerpt', get_the_excerpt());

 

そんなわけで、the_*()get_*() の値は必ずしも同じとは限らない上に、セキュリティ上重要な処理が抜け落ちたりしますので、 get_*() 関数を使いたくなったら、その前に the_*() のソースをきっちり確認する習慣を身につけましょう。