045
投稿一覧を出力するときに、連番を振る / 現在の投稿が先頭から何番目の投稿かを取得する
Library
閲覧数やコメントの数が多い順に投稿を一覧する際、連番を一緒に表示したい場合があります。WordPressループの中では、$wp_queryのcurrent_postが、先頭から何番目の記事かという情報を保持していますので、このプロパティを使用することを考えます。
| 用例 |
|
|---|---|
| 関連 | |
| Codex |
現在の投稿が先頭から何番目かを知る
現在の投稿が先頭から何番目の投稿であるかは、$wp_queryのcurrent_postが保持しています。
<?php echo $wp_query->current_post; ?>たとえばWordPressループの中で次のように書くと、記事に連番を振ることができます。
<?php if ( have_posts() ) : ?>
<?php while( have_posts() ) : the_post(); ?>
<section id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<div class="entry-count">
<?php echo $wp_query->current_post + 1; ?>
</div>
<header class="entry-header">
<?php the_title( '<h2><a href="' . get_the_permalink() . '">', '</a></h2>' ); ?>
<time class="entry-date"><?php echo get_the_date(); ?></time>
</header>
<div class="entry-content">
<?php the_excerpt(); ?>
</div>
</section>
<?php endwhile;?>
<?php endif; ?>4~6行目で$wp_query->current_postを出力しています。この値は0始まりなので、1を足すことで数値が1から始まるように修正しています。
結果、たとえば次のような出力を得ることができます。

記事を一覧する際、先頭から順に連番を振る
$wp_query->current_postを用いれば連番を出力することができますが、記事一覧が複数ページにわたる場合、ページごとにこのカウントはリセットされてしまいます。したがって、2ページ目を表示すると再び1から表示されるため、連番という意味では思った通りの挙動をしてくれません。
そこで、現在のページ数を利用することでこの問題を解決します。1ページに表示する記事の件数が10件の場合、2ページ目の先頭の数字は11から、3ページ目は21から始まるべきですが、この数値は次のようにして求めることができます。
記事の番号 = (ページ数 - 1) * 1ページに表示する件数 + 現在のカウント + 1
たとえば2ページ目の先頭は、(2ページ - 1) * 10件 + 0 + 1となり、計算結果は11となります。思った通りの結果が得られていますね。この数式をコードに置き換えればよいのですが、そのためには現在のページ数と、1ページに表示する件数の2つを取得する必要があります。
まず、現在のページ数は$pagedというグローバル変数が持っています。2ページ目では2、3ページ目では3が入っているのですが、1ページ目だけは0が入っていることに注意してください。
次に、1ページに表示する件数についてですが、通常のループの場合、大きく分けて2つの方法があります。1つ目は、管理画面で設定されている「1ページに表示する最大投稿数」を取得する方法で、これはget_option( 'posts_per_page' )で実現できます。2つ目は、データベースに問い合わせる「クエリ」を行う際に1ページで何件分を取得するかを指定しているはずであり、この値を参照する方法です。これは$wp_query->query_vars['posts_per_page']に保存されています。
以上より、連番を得る計算式は次のように書けます。
<?php
$number = ( max( 1, $paged ) - 1 ) * $wp_query->query_vars['posts_per_page'] + $wp_query->current_post + 1;
echo $number;
?>max()は与えられた2つの数値のうち、大きいほうを出力する関数です。これによって、$pagedが0のときは1を、2のときは2を得ることができます。これにより、2ページ目以降でも下のように正しい数字を表示することができるようになりました。

ちなみに、この数値は、記事との関連性がまったくありません。記事にIDのような一意の数値を割り当てる方法については、別の機会で説明します。
カスタム投稿の場合
カスタム投稿の場合は、WP_Queryをnewした際に生成されるインスタンスが$wp_queryと同じような働きをします($wp_queryはWP_Queryクラスのインスタンスです)。たとえば、$query = new WP_Query( $args );としてインスタンスを生成した場合、$query->current_postや、$query->query_vars['posts_per_page']のように書くことができます。
Comment