WordPressの「current_post」を使って投稿を表示する際の「ループ数」を取得する方法

WordPressの投稿一覧を表示する時に、例えば「3番目に表示される投稿」に対して処理を加えたいってことはあると思います。つまり「特定の投稿数が表示された時に何かをしたい」ってことですね。

その場合には、一例ですが、以下のように投稿を表示する際の「ループ数」を利用すればできます。

パターン1

if ( have_posts() ) :
 $count = 1;
 while ( have_posts() ) : 
  the_post();
  echo $count;
  ++$count;
 endwhile;
endif;

上のコードでは、ループ外に変数「count」を用意して初期値「1」を格納しています。そして、ループされるたびに数字を1ずつ増やしています。

表示する投稿が5件あるとしたら、2番目に表示される投稿には「2」、3番目なら「3」が変数「count」に格納されます。仕組み的にはシンプルですよね〜。僕は割とこの方法で実装しています。

current_postを使う方法もあるよ

ところで、先日こちらの記事「WordPressの the_post() ってそもそも何者?」を読んで、WordPressのループ処理にはループカウンタ「current_post」が用意されている(要はループ数が格納されている)ことを知りました。

というわけで、以下のように「current_post」を利用する方法でも似たようなことができます。

パターン2

if ( have_posts() ) :
 while ( have_posts() ) :
  the_post();
  $count = $wp_query->current_post + 1;
  echo $count;
 endwhile;
endif;

グローバル変数「wp_query」に格納されている「current_post」のループ外の初期値は「-1」となっていて、1番目の投稿の「current_post」には「0」が格納されています。2番目の投稿なら「1」です。ループされるたびに変数「current_post」の数字を1ずつ増やしてくれます。

そして「2番目に表示される投稿には「2」、3番目なら「3」が変数「count」に格納されるように「+1」をして調整しています。

WP_Query関数でもcurrent_postを使うことができる

上記のようなメインクエリじゃなくって、条件をいろいろと加えて投稿を取得するにはWP_Query関数を使うこともあると思います。そんな場合でも、以下のように「current_post」を使うことができます。

$args = array( 'posts_per_page' => 5 );
$the_query = new WP_Query( $args );

if ( $the_query->have_posts() ) :
 while ( $the_query->have_posts() ) :
  $the_query->the_post();
  $count = $the_query->current_post + 1;
  echo $count;
 endwhile;
endif;

wp_reset_postdata();

どっちを使ってもいいと思うけれども

こんな記事を書いておいて何ですが、WordPressで用意されている「current_post」を使ってループ数を取得してもいいと思いますが、パターン1の書き方を覚えておけば、WordPress以外でPHPを使ってループ数を利用して何かをしたい時には汎用的に使えるんじゃないかと思います。

PHPはガンガンにできてもWordPressは経験が少ない、っていう方も僕の周りには多いので「ああ、ここはループカウンタ作ってるんだね」っていうのがパターン1だと比較的わかりやすいと思いますし(ループ数の取得の処理にWordPressで用意されているものを使っていない、という意味ではわかりやすいはずです)。

「どちらで書いた方が処理が高速か」ということまでは検証していませんので、「こっちの方が速いよ」というなら速い方を採用する可能性もありますし、いろんなスキルの方がコードを書くような運用・保守の体制の元では「わかりやすさ」を重視した書き方にしたっていいんじゃないかと思います(何を「わかりやすい」とするかにも依りますね)。

とはいえ「current_postを使ってもできるんだな」ってことがわかったので、僕個人的には勉強になりました。

著者:bouya Imamura