【WordPress】記事一覧に連番を振る方法|カウンター変数・ページネーション対応・CSSカウンター

WordPress

WordPressの一覧ページやカテゴリーページで、記事に連番(1, 2, 3…)を振る方法を紹介します。ランキングページや「読む順番」の提示に使え、ループ内にカウンター変数を1つ用意するだけで実装できます。ページネーションで番号を続ける方法や、PHP不要のCSSカウンターも合わせて解説します。

この記事でわかること

  • ループ内のカウンター変数で連番を振る基本
  • ページネーションで番号をリセットせず続ける方法
  • PHPを使わずCSSカウンターで番号を振る方法
  • ランキング風の番号バッジ(1〜3位の色分け)CSS
スポンサーリンク

カウンター変数で連番を振る(基本)

ループの前に変数を初期化し、各記事で出力してから1ずつ増やします。テンプレート(archive.phpcategory.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方式を使ってください。

ランキング風の番号バッジにする

連番を丸いバッジにして、上位を色分けするとランキング風になります。基本コードの .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と、目的に合わせて選んでください。