【WordPress】全記事一覧ページを作成する方法|ページテンプレート・ページネーション対応

WordPressの標準機能だけでは「全記事の一覧」を1ページにまとめて表示する仕組みはありません。この記事では、カスタムページテンプレートを使って独自の全記事一覧ページを作る方法を解説します。ポイントは、クリックできるリンク・抜粋表示・ページネーションを備えることです。

この記事でわかること

  • 全記事一覧用のカスタムページテンプレートの作り方
  • リンク付きタイトル+抜粋で実用的な一覧にする
  • posts_per_page => -1 を避けたページネーション対応
スポンサーリンク

カスタムページテンプレートを作成する

子テーマのフォルダ直下に、新しいPHPファイルを作成します(ファイル名は任意。例:page-all-posts.php)。ファイル先頭のコメントでテンプレート名を宣言すると、固定ページ編集画面の「テンプレート」欄から選べるようになります。

page-all-posts.php:テンプレート宣言と一覧表示
<?php
/*
Template Name: 全記事一覧
*/
get_header();

$paged = max(1, get_query_var('paged')); // 1ページ目は0が返るため1に

$query = new WP_Query(array(
  'post_type'      => 'post',
  'posts_per_page' => 20,  // 全件(-1)にせず件数を指定
  'paged'          => $paged,
));

if ($query->have_posts()) :
  echo '<ul class="all-posts-list">';
  while ($query->have_posts()) : $query->the_post();
    echo '<li>';
    echo '<h2><a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a></h2>';
    the_excerpt(); // the_content() ではなく抜粋を表示
    echo '</li>';
  endwhile;
  echo '</ul>';

  // the_posts_pagination() はグローバル$wp_queryしか見ないため、
  // 固定ページ(メインクエリのmax_num_pagesは常に1)ではpaginate_links()を使う
  echo paginate_links(array(
    'total'    => $query->max_num_pages, // このカスタムクエリの総ページ数
    'current'  => $paged,
    'mid_size' => 2,
  ));
  wp_reset_postdata(); // サブループ後は必ずリセット
else :
  echo '<p>記事が見つかりませんでした。</p>';
endif;

get_footer();
?>
the_content() と posts_per_page => -1 は使わない
「全記事一覧」だからといって the_content()(本文)をそのまま出すと、記事が100件あれば100記事分のフル本文が1ページに連続表示され、実用に耐えません。一覧には the_excerpt()(抜粋)を使いましょう。また posts_per_page => -1(全件取得)は、記事数が多いサイトでメモリ不足・タイムアウトの原因になります。件数を指定してページネーションで分割するのが安全です。ページネーションの詳しい実装・404対策はカスタム投稿の一覧ページを作成する方法も参考になります。
固定ページのカスタムクエリでは the_posts_pagination() が効かない
the_posts_pagination()グローバルの $wp_query(メインクエリ)の総ページ数しか見ません。固定ページのテンプレート内でこの関数を呼んでも、メインクエリ(固定ページ自体の表示)の max_num_pages は常に1のため、ページネーションが何も表示されません。カスタムクエリのページ送りには、$query->max_num_pages を明示的に渡せる paginate_links() を使ってください。
タイトルは必ずリンクで囲む
the_title(); だけではプレーンテキストで、クリックしても記事に飛べません。<a href="<?php echo esc_url(get_permalink()); ?>"> で必ずリンクにし、esc_url() / esc_html() でエスケープして出力します。

固定ページを作成してテンプレートを適用する

  1. 管理画面の「固定ページ」→「新規追加」を開く
  2. タイトルを入力(例:「記事一覧」)
  3. 右側の「ページ属性」→「テンプレート」で「全記事一覧」を選択
  4. 「公開」をクリック

一覧ページへの導線を作る

作成した固定ページのURLを、ナビゲーションメニューやフッターに追加して訪問者が見つけられるようにします。除外したい投稿がある場合は一覧ページに特定の投稿を表示しない方法、ランダムに並べたい場合は一覧ページで記事をランダムに表示するも参考になります。カスタム投稿タイプだけに絞った処理はカスタム投稿の一覧ページでのみ処理を行う方法で解説しています。

よくある質問(FAQ)

Q記事数が多い場合、全件表示(-1)で大丈夫ですか?
Aおすすめしません。posts_per_page => -1 は全件を一度に取得するため、記事数が多いとメモリ不足やタイムアウトの原因になります。posts_per_page に具体的な件数を指定し、the_posts_pagination() でページ送りにするのが安全です。
Q年月別・カテゴリ別に整理して表示するには?
A年月別は投稿ループ内で get_the_date('Y年n月') を前の投稿と比較し、変わったタイミングで見出しを挿入します。カテゴリ別は get_categories() で全カテゴリーを取得し、カテゴリーごとに WP_Query を実行します(記事数が多い場合はトランジェントでのキャッシュを検討してください)。
Q一覧にサムネイル画像も出したいです。
Aループ内に if (has_post_thumbnail()) { the_post_thumbnail('thumbnail'); } を追加します。アイキャッチが未設定の記事にはデフォルト画像を出す方法もあわせて検討するとよいでしょう。

まとめ

  • テンプレートTemplate Name: コメント+固定ページで適用
  • 表示:タイトルは get_permalink() でリンク化、本文は the_excerpt()
  • 件数-1 は避けて件数指定+the_posts_pagination()
  • 後片付けnew WP_Query の後は wp_reset_postdata()

クリックできる・軽い・ページ送りできる、の3点を押さえれば、実用に耐える全記事一覧ページになります。