ほんとうに今更なのですが、表示するthe_xxx()と、取得するget_the_xxx()というテンプレートタグの意味がようやくちゃんと理解できた気がするので、自分なりにまとめてみました!
初心者のつまづき
WordPressのカスタマイズ方法は、たくさんの方がコードを公開してくださっていて、phpを初めて触ったようなわたしでも、「こんなことしたいな」と思うことを検索して、更にそれをちょこっと自分好みに、ということならわりと簡単にやってこれました。
でも、どうせならちゃんと理解したい、いつかはコピペに頼らずに…!という想いでコードを眺めているなか、疑問のひとつだったのがthe_xxx()とget_the_xxx()の違いでした。
表示と取得
Codexだと大抵、the_xxx()は「〜を表示する」、get_the_xxx()は「〜を取得する」と書いてあります。
この上なく明確な説明なのですが、phpに不慣れなわたしは、恥ずかしながら「表示」と「取得」の使いどころの違いが曖昧でして…。それが、ここ最近やっと「こういうことだったのか!」という思いに至ることができました。
「the」とは?
Codexには、theがつくテンプレートタグの説明には、大抵「ループの中で使う」と書いてあります。まずはgetの有無を一旦置いといて、theが一体どういうものなのか、一番基本のメインループと一緒におさらいしてみます。
メインループ
<?php if (have_posts()) : ?> //該当記事の有無 <?php while (have_posts()) : the_post(); ?> //記事の該当回数、繰り返し <?php the_title(); ?> //タイトル <?php the_post_thumbnail(); ?> //サムネイル <?php the_content(); ?> //本文 <?php endwhile; ?> //繰り返し処理終了 <?php else : ?> //該当記事がなかった場合 <p>記事がありませんでした</p> <?php endif; ?>
WordPressでは、このループで記事を出力しています。(実際にはレイアウト用のいろんな要素を含みますが、ここでは割愛しています。)
例えばトップページなどでは、いくつ記事を表示するか、ダッシュボードのこの画面で指定していますよね?先ほどのループで、この回数を繰り返しているわけです。
このブログのトップページで表すとこんな感じ。上記で示した3~5行目が、指定回数繰り返されています。
でも、ちょっと不思議だと思いませんか?the_title()とthe_post_thumbnail()、the_content()という、(php上では)同じことしか書いていないのに、それぞれ違ったタイトルや本文が出力されています。
ループの中の現在地が「the」!
ここで言うtheは、「ループ内の○回目の」というような意味なんじゃないかなと思います。
だから、毎回違った内容を出力してくれるんですねー!
theっていうのはそもそも、「その」とか、そういう意味ですよね?Codexにはよく「現在の」という形で書いてありますね。なるほど、「ループの中で使う」というのはこういうことだったのかー。
1個しかなくてもループを使っている
それと、今ご覧頂いているこの単一記事や、固定ページなども上記のメインループで出力されています。ループって聞くと複数出てきそうな気がしちゃいますが、各記事はループの中で該当記事がひとつしかない、というイメージです。
だから、単一記事や固定記事でもthe_title()などが使えるんですね。
メインループとサブループ
さて、ここまで紹介してきたメインループは正直あんまり意識しなくても使っているし、知らなくてもブログは書けます。でも、もっとカスタマイズしたいという気持ちが芽生えてきますよね。例えば、記事の終わりに関連記事を何件か出してみたり、フッターやサイドバーに新着記事やランダムに記事を出してみたり。これらも、ループを使って出力します。
こういった目的のものはメインループに対してサブループと呼ばれ、get_posts()、またはWP_Query()という関数を使って出力するのが一般的です。
WP_Query()のほうが指定しなければならないパラメーターが多いみたいです。でも書き方はメインループと似ていて、なんとなく玄人好みな印象。
例:get_posts()で新着記事5件
php
<ul>
<?php
global $post;
$args = array( 'posts_per_page' => 5 );
$myposts = get_posts( $args );
foreach( $myposts as $post ) {
setup_postdata($post);
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
}
wp_reset_postdata();
?>
</ul>
このように書いてみると、リスト形式で新着記事を5件表示してくれます。9行目が繰り返される部分です。書く場所は、サイドバーでもフッターでも、メインループの中でも外でも大丈夫です。
html
<ul> <li><a href="ひとつめのURL">ひとつめのタイトル</a></li> <li><a href="ふたつめのURL">ふたつめのタイトル</a></li> <li><a href="みっつめのURL">みっつめのタイトル</a></li> <li><a href="よっつめのURL">ひとつめのタイトル</a></li> <li><a href="いつつめのURL">ひとつめのタイトル</a></li> </ul>
出力されたhtmlはこのようになります。ここでも、theはループ内の現在地の値を、その回数分だけ出力してくれていますよね。
the_xxx()とget_the_xxx()の違い
では、やっと本記事のタイトルに迫ってみます。
the_xxx()
php
この記事のタイトルは「<?php the_title(); ?>」です。
こちらのコードを任意のphpファイルのループ内に書いてみてください。
html
この記事のタイトルは「XXXXXXX」です。
出力されたhtmlには、このように該当記事のタイトルが書かれているはずです。
get_the_xxx()
php
この記事のタイトルは「<?php get_the_title(); ?>」です。
では、今度はgetをつけてみましょう。htmlを見てみると…?
html
この記事のタイトルは「」です。
記事タイトルが出てこなくなってしまいました。何故でしょうか?これは、getが(一般的に)「取得」するタグだからなんです。
表示と取得
WordPressはphpという言語で動いていて、様々な条件分岐によってその都度適した形のhtmlを出力してくれます。この条件分岐などの内部的な処理は、htmlに出力されない形で行います。(全部出力されちゃったら困りますよねw)
この内部的に使われる、出力されない形として保持するのが「取得」なんです!
the_xxx()… 表示 → htmlへ出力する形get_the_xxx()… 取得 → 内部処理に使われる形
ざっくり言うと、こんな感じ。ちなみに、取得した値も出力してあげれば表示することができます。
php
この記事のタイトルは「<?php echo get_the_title(); ?>」です。
さっきのコードに「出力する」という意味のechoを加えてやると、
html
この記事のタイトルは「XXXXXXX」です。
このようにthe_xxx()と同じ結果が得られます。
イメージ的にはこんな感じでしょうか。
getをつけるのは危ないこともあるぞ、ということを後述してありますので、ぜひそちらもご参照ください。表示と取得の使い分けの例
比較に使う
先日書いたこの記事のコードを例に見てみると、
<div id="publishing">公開日:<time datetime="<?php the_time('c'); ?>"><?php the_time('Y/m/d'); ?></time></div>
<?php if (get_the_time('Ymd') < get_the_modified_time('Ymd')): ?>
<div id="update">更新日:<?php the_modified_time('Y/m/d'); ?></div>
<?php endif; ?>
2行目は、公開日と更新日を比較している部分です。条件を満たさなければ3行目は表示しないという、条件分岐になっています。内部処理なので、get_the_xxx()を使います。
1行目と3行目では、それぞれ公開日と更新日を「表示」するので、the_xxx()を使っています。
引数に使う
例えば、サムネイルを表示するこのテンプレートタグ。
<?php the_post_thumbnail(); ?>
このままでも表示はされますが、画像の大きさを指定したいなーとか、altに記事タイトルを入れたいなー、という場合。
<?php the_post_thumbnail( array(100, 100), array('alt' => get_the_title()) ); ?>
the_post_thumbnail()は「表示」の形ですが、カッコ内に入れる引数のget_the_title()は「内部処理される形」でないといけません。
get_the_xxx()を使うべき内部処理の場所に、出力のthe_xxx()を書いてしまうと、処理がうまく走らない上に、html上の変なところにthe_xxx()の内容が出力されたりします。(よくやりますw)重要な追記
大変重要なことを教えて頂けました!こちらの記事にあるとおり、
the_*() の値と get_*() の値は必ずしも同じじゃないことに注意しよう!
先ほどの例のように、htmlの出力だけだと同じように見えることも、内部では同じ動きをしていないこともある、ということです!
the_*() と get_*() の値は必ずしも同じとは限らない上に、セキュリティ上重要な処理が抜け落ちたりしますので、 get_*() 関数を使いたくなったら、その前に the_*() のソースをきっちり確認する習慣を身につけましょう。
「値が欲しいから安易にgetつけちゃえ」だと、テンプレートタグによってはセキュリティリスクの発生が起こる可能性もあるとのことなので、必ずどのような動きをしているか確認してから使わなければいけませんね!ご指摘くださって大変有難いです!
例外もたくさん
さて、ここまで書いてきてしまいましたが、全部のテンプレートタグがこの法則に当てはまるというわけでもないのです…。
ループ外でもtheを使えるものもある
例えばこちらのフォーラムを拝見すると、get_the_ID()はループ外でも使えるみたいです。
「ループ内の現在位置」じゃなく、「現在表示している記事IDの」という意味で使いたい時、という感じですね。
タグごとに書き方が違いそうですが、ループ外でtheを使うなら、基本的にはかっこの中に$post->IDを入れてやると、「現在表示している記事IDの」という意味になるんじゃないかなーと。トップページ、アーカイブページ(カテゴリ・ダグ一覧とか)ではループ内じゃないと駄目だと思うです_(:3 」∠)_
get_the_が存在しないタグもある
例えばですが、パーマリンクに関するタグは、the_permalink()はあるのにget_the_permalink()はなくて、get_permalink()ならあるんです。
これは、前述のセキュリティリスクのことに関係があるのかな…、と、なんとなく。
getだけど出力するのもある
例えば、get_calendar()はgetと書いてありますが、これだけでカレンダーの出力をしてくれたります。
その都度Codexで書き方を参照する!
いろいろ書いてみましたが、つまりはこの一言に尽きるのではないかと…。身も蓋もないですが_(:3 」∠)_
わたしのこの記事の記述で、間違ってたり不適切な部分がありましたらご指摘くださると大変ありがたいです!
以上、私的まとめでした
いかがでしたでしょうか。分かっている方には今更なことだと思うのですが、少なくともわたしはこの違いが理解できてから、Codexなどに書いてあることの理解度も高まり、「こう書けばいいはず」というコードの予想が立てられるようになってきました。
分からないことが分かるようになるのって、楽しいな…!WordPress、楽しいな…!(*´ω`*)
コメントを残す