WP_Queryクラスのcurrent_postプロパティを使って、ループ内で現在の投稿が何番目の投稿かを取得していろいろやりたいときのメモです。
current_postを使って、ループ内の何番目の記事かカウントする
<?php
if ( have_posts() ) :while ( have_posts() ) :the_post();
$count = $wp_query->current_post + 1;
echo $count;
endwhile;
endif;
?>
WP_Queryクラスの中に格納されているcurrent_postを使います。
$count = $wp_query->current_post + 1;
は、ループ内で現在の投稿のインデックス(0から始まる)を取得し、それに1を加えて1から始まる順序付けされたインデックスを取得します。
何番目の記事かをカウントすれば、「n番目の記事の時にxxxしたい」ということも簡単ですね。
current_postはサブループでも利用することができます。
current_postを使って最初の投稿かどうかを判定して特別な処理をする
ループ内で「最初の記事の時だけ大きく表示したい」というのはよくあります。そんな時に有効です。
<?php if (have_posts()) : while (have_posts()) : the_post();
if ($wp_query->current_post == 0) :
// 最初の投稿の時
endif;
// 通常の投稿
endwhile;
endif;
?>
最後の投稿を判定するには
current_postとは関係しませんが最後の投稿か判定する場合も載せておきます。
<?php
if ( have_posts() ) :
$total_posts = $wp_query->found_posts;
$current_post = 0;
while ( have_posts() ) :
the_post();
$current_post++;
if ( $current_post === $total_posts ) {
// 最後の投稿にclassを追加する
$class = 'last-post';
}
?>
<div class="<?php echo $class; ?>">
<?php the_title(); ?>
</div>
<?php
endwhile;
endif;
?>
$total_posts = $wp_query->found_posts;
で現在のクエリによって見つかった全体の投稿数を取得します。
post_countとfound_posts
found_posts
現在のクエリによって見つかった、全体の投稿数。post_count
現在のクエリによって取得された投稿のうち、現在のページで表示される投稿の数。ページネーションがある場合、1ページに表示される投稿数によって異なる。
current_postで投稿インデックスの偶数奇数を判定する
投稿記事の偶数、奇数でグループ分けして、それぞれに異なるスタイルを適用するためのクラスを割り当てたい。。。という時など。
<?php
if ( have_posts() ) :while ( have_posts() ) :the_post();
if(($wp_query->current_post + 1) % 2 == 0):
$class = 'even';
else:
$class = 'odd';
endif;
?>
<div class="<?php echo $class; ?>"><?php the_title(); ?></div>
<?php
endwhile;
endif;
?>
N件ごとに処理を加える
wordpressのプロパティcurrent_postを使う例として「投稿数N件ごとにdivで囲みたい」場合。
<?php
$col = 4; // グリッドの列数
if (have_posts()) :
while (have_posts()) :
the_post();
if (0 === ($wp_query->current_post) % $col) : // グリッドの列の最初の投稿かどうかをチェック
?>
<div class="grid">
<?php
endif;
?>
//ループ内の表示
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h2><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
<?php the_content('Read more...'); ?>
</article>
<?php
if (0 === ($wp_query->current_post + 1) % $col || ($wp_query->current_post + 1) === $wp_query->post_count) : // グリッドの列の最後の投稿かどうかをチェック
?>
</div>
<?php
endif;
endwhile;
endif;
?>
変数col
に代入された数字ごとに <div class="grid"></div>
で囲むようにします。