WordPressの一覧ページやカテゴリーページで、記事に連番(1, 2, 3…)を振る方法を紹介します。ランキングページや「読む順番」の提示に使え、ループ内にカウンター変数を1つ用意するだけで実装できます。ページネーションで番号を続ける方法や、PHP不要のCSSカウンターも合わせて解説します。
この記事でわかること
- ループ内のカウンター変数で連番を振る基本
- ページネーションで番号をリセットせず続ける方法
- PHPを使わずCSSカウンターで番号を振る方法
- ランキング風の番号バッジ(1〜3位の色分け)CSS
カウンター変数で連番を振る(基本)
ループの前に変数を初期化し、各記事で出力してから1ずつ増やします。テンプレート(archive.php・category.php など)に記述します。一覧の見出しは h2 以下にします(1ページに h1 を複数置かないため)。
PHP:カウンター変数で連番
<?php $count = 1; if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="post-item">
<span class="number"><?php echo $count++; ?></span>
<h2 class="title">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h2>
</div>
<?php endwhile; else : ?>
<p>記事が見つかりません。</p>
<?php endif; ?>
$count++ は「出力してから加算」echo $count++; は現在の値を出力してから1を足す後置インクリメントです。初期値を変えれば開始番号を調整でき、$count = 0; で0始まり、$count = 20; で20始まりになります。ページネーションで番号を続ける(重要)
上の基本コードには弱点があります。ページを移動するたびに $count が 1 に戻るため、2ページ目も「1, 2, 3…」と最初からになってしまいます。ページをまたいで通し番号にするには、現在のページ番号と表示件数から開始値を計算します。
PHP:ページをまたいで連番を続ける
<?php
// 現在のページ番号(1ページ目は paged が空なので 1 にする)
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$per_page = get_option('posts_per_page'); // 1ページの表示件数
// 例: 1ページ10件なら 2ページ目は 11 から始まる
$count = ($paged - 1) * $per_page + 1;
if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="post-item">
<span class="number"><?php echo $count++; ?></span>
<h2 class="title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
</div>
<?php endwhile; endif; ?>
独自の
メインループではなく
WP_Query なら自前の件数で計算メインループではなく
WP_Query を使う場合は、get_option('posts_per_page') ではなくクエリに渡した posts_per_page の値で計算してください。ページネーション自体の実装はプラグインなしのページネーション実装方法、「全◯件中◯件目」の表示は一覧ページに「全◯件中◯件〜◯件目を表示」を実装する方法を参照してください。PHPを使わず CSS カウンターで振る
「表示上の番号が振れればよい」なら、PHPを書かずに CSSの counter でも実現できます。親要素で counter-reset、各項目で counter-increment します。
CSS:counter で連番を表示
/* 親でカウンターを初期化 */
.post-list { counter-reset: post-number; }
/* 各タイトルでカウントアップし、頭に番号を表示 */
.post-list .title { counter-increment: post-number; }
.post-list .title::before {
content: counter(post-number) ". ";
font-weight: bold;
color: #0284c7;
}
CSSカウンターは「そのページ内」だけ
CSSカウンターは表示中の要素を数えるため、ページネーションをまたいだ通し番号にはなりません(各ページで1から)。ページをまたぐ連番が必要なら、前章のPHP方式を使ってください。
CSSカウンターは表示中の要素を数えるため、ページネーションをまたいだ通し番号にはなりません(各ページで1から)。ページをまたぐ連番が必要なら、前章のPHP方式を使ってください。
ランキング風の番号バッジにする
連番を丸いバッジにして、上位を色分けするとランキング風になります。基本コードの .number に次のCSSを当てます。
CSS:番号バッジと1〜3位の色分け
.number {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: 50%;
background: #64748b;
color: #fff;
font-weight: 700;
}
/* 1〜3位を金・銀・銅で色分け */
.post-list .post-item:nth-child(1) .number { background: linear-gradient(135deg, #fbbf24, #f59e0b); }
.post-list .post-item:nth-child(2) .number { background: linear-gradient(135deg, #cbd5e1, #94a3b8); }
.post-list .post-item:nth-child(3) .number { background: linear-gradient(135deg, #d6a36e, #b45309); }
人気記事をランキング表示したい場合は、WP_Query で閲覧数(カスタムフィールド)順に並べると本格的なランキングになります。複雑な条件での取得はWP_Queryで複雑な条件検索を実装する方法、投稿に採番フィールドを持たせる方法はカスタム投稿ごとに自動採番する連番フィールドの作り方も参考になります。
よくある質問(FAQ)
Q記事一覧ループで連番(1, 2, 3…)を表示するには?
Aループの前にカウンター変数を用意し、各記事で
echo $count++; します。例:$count = 1; while ($query->have_posts()) { $query->the_post(); echo $count++; }。ページネーションがある場合は ($paged - 1) * $per_page + 1 を開始値にして通し番号にします。Q2ページ目で番号が1に戻ってしまいます。
Aカウンターをページごとに
1 で初期化していると、各ページで1から振り直されます。$paged = get_query_var('paged') ?: 1; と表示件数から$count = ($paged - 1) * $per_page + 1; で開始値を計算してください。Q一覧の表示件数を変えるには?
A管理画面の「設定」→「表示設定」→「1ページに表示する最大投稿数」で変更します。
WP_Query を直接使う場合は 'posts_per_page' => 20 のように指定します。-1 で全件取得できますが、記事数が多いと重くなるので注意してください。まとめ
- 基本:ループ前に
$count = 1;、各記事でecho $count++; - ページネーション対応:
($paged - 1) * 表示件数 + 1を開始値にする - PHP不要:CSSの
counter(ただしページ内だけの番号) - ランキング風:
.numberをバッジ化しnth-childで上位を色分け
表示だけならCSS、通し番号が必要ならPHPと、目的に合わせて選んでください。

