【WordPress】カスタム投稿の一覧ページ(アーカイブ)を作成する方法|has_archive・テンプレート・ページネーション

カスタム投稿タイプ(商品情報・スタッフ紹介・実績など)を作ったら、その投稿をまとめて表示する一覧ページ(アーカイブページ)が欲しくなります。この記事では、アーカイブを有効にする設定からテンプレートの作成・ページネーション・404対策までを解説します。

一覧ページ作成の流れ

  • register_post_type()has_archive => true を設定
  • archive-投稿タイプ名.php テンプレートを作成(ページネーション込み)
  • 設定 → パーマリンクを保存してリライトルールを更新
スポンサーリンク

has_archive を有効にして投稿タイプを登録する

一覧ページを持たせるには、投稿タイプの登録時にhas_archive => true が必須です。functions.php に次のように追加します。

functions.php:アーカイブ付きでカスタム投稿タイプを登録
function my_register_portfolio() {
  register_post_type('portfolio', array(
    'label'       => 'ポートフォリオ',
    'public'      => true,
    'has_archive' => true, // 一覧ページを有効にする(必須)
    'supports'    => array('title', 'editor', 'thumbnail'),
  ));
}
add_action('init', 'my_register_portfolio');
has_archive が無いと一覧ページ自体が存在しない
has_archive を設定しない(既定 false)と、アーカイブURLにアクセスしても404になります。has_archive => 'works' のように文字列を渡すと、一覧ページのスラッグを変更できます。ラベルやアイコンなど登録オプションの詳細はカスタム投稿タイプを追加する方法を参照してください。

アーカイブテンプレートを作成する

一覧ページのテンプレートは archive-投稿タイプ名.php という命名規則でテーマ(子テーマ)に作成します。今回は archive-portfolio.php です。見つからない場合は archive.phpindex.php がフォールバックとして使われます。

一覧ページにはページネーションを必ず入れましょう。投稿が増えたとき、これが無いと2ページ目以降にアクセスできません。

archive-portfolio.php:一覧+ページネーション
<?php get_header(); ?>

<main id="main" class="site-main">

  <?php if (have_posts()) : ?>

    <?php while (have_posts()) : the_post(); ?>
      <article class="portfolio-item">
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <?php the_post_thumbnail('medium'); ?>
        <?php the_excerpt(); ?>
      </article>
    <?php endwhile; ?>

    <?php the_posts_pagination(); // ページ送り(必須) ?>

  <?php else : ?>
    <p>まだ投稿がありません。</p>
  <?php endif; ?>

</main>

<?php get_footer(); ?>
表示件数や並び順を変えたい場合
アーカイブのメインクエリを変更するには pre_get_posts を使います。並び順のカスタマイズはカスタム投稿タイプのアーカイブページを任意の順序で並び替える方法、一覧ページだけで処理を行う条件分岐はカスタム投稿の一覧ページでのみ処理を行う方法を参照してください。

パーマリンクを更新する(404対策)

投稿タイプを登録・変更したら、設定 → パーマリンクを開き、何も変えずに「変更を保存」をクリックしてリライトルールを更新します。これを忘れると、一覧ページや個別ページが404になります。

404になったときのチェックリスト
パーマリンク再保存をしたか ②has_archive => true を設定したか ③スラッグが固定ページ等と衝突していないか。それでも解決しない場合はカスタム投稿の記事が404になる原因と対処法(完全解説)で切り分けてください。

関連カスタマイズ

よくある質問(FAQ)

Qカスタム投稿タイプの一覧ページが表示されません(404)。
Aまず register_post_type()has_archive => true があるか確認し、設定 → パーマリンクを再保存してリライトルールを更新してください。テンプレートが無い場合は archive.phpindex.php が使われるため、404の原因はテンプレートではなく設定側です。詳しくは404になる原因と対処法を参照してください。
Q一覧ページのURL(スラッグ)を変更するには?
Arewrite => array('slug' => 'custom-slug') で個別ページのスラッグを、has_archive => 'archive-slug' で一覧ページのスラッグを変更できます。変更後はパーマリンクの再保存を忘れずに。
Qタクソノミーで絞り込める一覧を作るには?
AGETパラメータでタームを受け取り、tax_query を組み立てて pre_get_posts でメインクエリに反映するか、WP_Query で取得します。一覧ページだけに適用する条件分岐は一覧ページでのみ処理を行う方法が参考になります。

まとめ

  • 設定has_archive => true(無いと一覧自体が404)
  • テンプレートarchive-投稿タイプ名.phpthe_posts_pagination()
  • 反映:設定 → パーマリンクを再保存(404の最多原因)
  • カスタマイズ:並び順・件数は pre_get_posts

has_archive・テンプレート・パーマリンク再保存の3点を押さえれば、カスタム投稿の一覧ページは確実に表示できます。