BLOGスタッフブログ

インソースマーケティングデザイン

2015.10.27 コーディング

フロントエンドエンジニアのための備忘録

こんにちは。
フロントエンドエンジニアの虎澤です。

段々と寒さを肌で感じる日が多くなってきました。
もうすぐで11月ですね。
秋を堪能する間もなく冬がやってきそうです。
私は四季の中で秋が一番好きです。
焼き芋が美味しいからです。
…半分嘘です。

さて、フロントエンドエンジニアになって早数ヶ月。
単なるマークアップに留まらずwordpressに関わるphpプログラミングだったり、いろいろな事をやらせていただいております。

やることが多岐にわたると、もちろんぶつかる壁も多かったりするわけで…。
そこで、日々の業務でわかったことなど、備忘録として書き留めていこうかと思います。
他の、特にフロントエンドに携わって間もない方への助けになれればいいなぁと思います。

■the_*()とget_*()の違いって何?!
wordpressを触り始めておそらくぶち当たるであろうこの疑問。
私も最初わかりませんでした。
ざっくり説明すると、データを「出力」するのか「取得」するのかの違いです。
the_*()を書いた場合はデータを「出力」し、
get_*()を書いた場合はデータを「取得」するんですねー。
後者の場合、戻り値としてデータが返ってくることになりますので、変数に代入したりしないとそのまま使ってもあまり意味はありません。
例えば、get_the_content()を使って記事の本文を出力する場合は以下のように書きます。

ex)
$data = get_the_content();
echo $data;

また、以下のように条件分岐に使ったりもしますね。

ex)
if( get_the_content() ){
   ここに処理
}

ただし、このthe_*()とget_*()、一見すると「出力」するか「取得」するかの違いしかないように見えますが、実はそうではありません。
the_*()のテンプレートタグでは、「出力」…echoする前に内部で色々と処理しています。
例えば、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( ']]>', ']]>', $content );
   echo $content;
}

get_the_content()で取得したデータに対して色々やっているのがなんとなーくわかるかと思います。
get_the_content()だけで使用すると、フィルターフックが使えなかったり、意図したものと違う実行結果になってしまう可能性もあるわけですね。

the_permalink()の例では、echoする前にesc_url()をしているので、もしthe_permalink()を使わずにget_permalink()を使ってしまうと、セキュリティリスクを抱えてしまいかねないわけです。

メインループ外では使えない一部のthe_*()をfunction.phpに記述して使いたい場合などは、このget_*()使うことになるかと思います。
使う際はthe_*()を使った場合とのデータの違いをよく確認してから使う、もしくはthe_*()で行われる処理を一緒に記述してあげるなどの工夫が必要となります。

いかがでしたでしょうか。
一見同じように見えても、その実全然違うものだったりしますよね。
何気なく、当たり前のように使っているテンプレートタグ。
掘り下げてみると新しい発見があって楽しいし、とても勉強になります。
各テンプレートタグの中身はwp-includeフォルダの中のpost-template.phpなどを見れば書かれてあるので、よかったら覗いてみてはいかがでしょうか!

今回ちらっとでてきた「フィルターフック」や「メインループ」などについても、今後お話していけたらいいなと思います。
以上、虎澤がお送り致しました♪

インソースマーケティングデザインが書いた他の記事

見積もり・ご依頼など、
お気軽にご相談ください

本サイトはユーザーエクスペリエンスの向上などを目的に、Cookieを使用しています。
右記のバナーで「同意する」をクリックする、または本サイトを利用することにより、
お客様は弊社のCookieポリシーに同意したことになります。

同意します