Wordpressの記事ループの中で、最初や最後の記事とかを判別する

<?php
function isFirst(){
    global $wp_query;
    return ($wp_query->current_post === 0);
}

function isLast(){
    global $wp_query;
    return ($wp_query->current_post+1 === $wp_query->post_count);
}

function isOdd(){
    global $wp_query;
    return ((($wp_query->current_post+1) % 2) === 1);
}

function isEvery(){
    global $wp_query;
    return ((($wp_query->current_post+1) % 2) === 0);
}

Wordpressのテンプレートで、記事を表示する部分は while(have_post()) でループして作ります。
最初のエントリーや最後のエントリーにだけ、ちょっと変える必要がでたんですが、Wordpressのテンプレートタグや関数では、判別方法が提供されてませんでした。
なので、作ってみました。
最初と最後のエントリーを判別する関数と、ついでに奇数番目と偶数番目のエントリーを判別する関数です。
見てのとおり大したことはしてません。

注意とか

ループ中に使用可能。

Wordpressテンプレートタグには the_title() や the_content() のように、ループ中にのみ使用できる物が結構あります。
この判別用の関数も、同様にループ中にのみ使用できます。

動作確認

WordPress 2.9.1 でのみ確認してます。
もっといえば PDO (SQLite) For WordpressプラグインでWordpressをSQLiteで動かしてみた - kanonjiの日記 で構築した環境です。

導入方法

テーマにはたいていの場合 functions.php というファイルがあります。
このファイルは、自動的にWordpressの初期化中に読み込まれるので、ここに書いておけば使えると思います。

Wordpressはスネークケースだけど、キャメルケースにした。

is_last() とか is_first() という名前にしようかとも思ったけど、将来的にWordpress本体の条件分岐タグ*1とぶつかる危険性もあるかもなので。

使用例

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div class="post <?php if(isLast()) echo 'last'; ?>">
  <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
  <small><?php the_time('F jS, Y'); ?></small>
  <div class="entry">
    <?php the_content(); ?>
  </div>
  <p class="postmetadata">Posted in <?php the_category(', '); ?></p>
</div>
<?php endwhile; else: ?>
<p>Sorry, no posts matched your criteria.</p>
<?php endif; ?>

最後のエントリーにだけ、特別なcssを適用するために class="post last" にする使用例です。
これで下記のようなcssができます。

.post{
  border-bottom:1px solid #666;
}
.last{
  border-bottom:0;
}

コードにtypoがあったので修正しました。

*1:Conditional Tags