2026年6月2日
2026年6月2日
WordPressのフルサイト編集でアーカイブテンプレートを作成する方法
ブロックテーマでカテゴリーやタグ、投稿者などの一覧ページの見た目を変えるには、templates/ に archive.html や category.html といったアーカイブテンプレートを作り、その中にクエリーループブロックを置きます。ポイントは、クエリーループに「テンプレートのクエリーを引き継ぐ」設定を使い、表示する記事の絞り込みはWordPress本体に任せることです。この記事では、テンプレートの作り方(サイトエディターとファイルの両方)、どのアーカイブにどのテンプレートが使われるか、1ページの表示件数の変え方、カスタム投稿タイプのアーカイブ、表示されないときの確認点までを説明します。
どのアーカイブにどのテンプレートが使われるか
ブロックテーマでも、使われるテンプレートはクラシックテーマと同じテンプレート階層で決まります。違いは、ファイルが templates/ フォルダ内の .html になることです。代表的な対応は次のとおりです。
- カテゴリー一覧:
category-{スラッグ}.html→category.html→archive.html→index.html - タグ一覧:
tag-{スラッグ}.html→tag.html→archive.html→index.html - 投稿者一覧:
author-{ユーザー名}.html→author.html→archive.html→index.html - 日付アーカイブ:
date.html→archive.html→index.html - カスタムタクソノミー:
taxonomy-{タクソノミー}-{ターム}.html→taxonomy-{タクソノミー}.html→taxonomy.html→archive.html→index.html - カスタム投稿タイプ:
archive-{投稿タイプ}.html→archive.html→index.html
左にあるものほど優先されます。まず archive.html を1つ作ってアーカイブ全体の共通デザインにし、カテゴリーだけ説明文を出したい、特定のカテゴリーだけレイアウトを変えたい、といった必要が出たら、より具体的なテンプレートを追加していくと管理しやすくなります。
なお、ブログのトップ(投稿一覧)は home.html、検索結果は search.html で、厳密にはアーカイブとは別のテンプレートです。
作業前の準備
- 子テーマで作業する:配布テーマを直接編集すると、更新で変更が消えます。ブロックテーマの子テーマに
templates/archive.htmlを置けば、親テーマの同名テンプレートより優先されます。 - バックアップとステージング:テンプレートの記述ミスで一覧が空になることがあります。変更前にバックアップを取り、ステージング環境で確認してから本番に反映してください。
- 既存のテンプレートを確認する:多くのブロックテーマには
archive.htmlがすでに入っています。新規に作る前に、親テーマのtemplates/を見て、何が用意されているかを把握しておきます。
サイトエディターで作る
コードを書かずに作る場合は、サイトエディターを使います。
- 「外観」→「エディター」を開き、テンプレートの一覧に進む
- 新しいテンプレートを追加する操作を選ぶ
- 「すべてのアーカイブ」「カテゴリー」「タグ」「投稿者」など、対象の種類を選ぶ(カテゴリーなどは、特定のタームだけのテンプレートも選べます)
- 表示されたパターンから選ぶか、空の状態から組み立てる
- クエリーループの設定を確認して保存する
メニューや選択肢の表記はWordPressのバージョンによって変わります(2026年10月現在)。名前が多少違っても、「テンプレートを追加」から種類を選ぶ流れは共通です。
サイトエディターで保存したテンプレートは、テーマのファイルではなくデータベース(投稿タイプ wp_template)に保存され、同じ名前のファイルより優先されます。後からファイルを直しても反映されないときは、このデータベース側の版をリセットする必要があります。変更をファイルとして残したい場合は、WordPress.org で配布されている Create Block Theme プラグインでテーマに書き出せます。
ファイルで作る
テーマのファイルとして管理したい場合は、子テーマの templates/archive.html に次のように書きます。ヘッダーとフッターはテンプレートパーツで読み込み、中央にアーカイブのタイトル、説明、記事一覧、ページ送りを置いた構成です。
<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
<!-- wp:group {"tagName":"main","layout":{"type":"constrained"}} -->
<main class="wp-block-group">
<!-- wp:query-title {"type":"archive"} /-->
<!-- wp:term-description /-->
<!-- wp:query {"queryId":1,"query":{"inherit":true}} -->
<div class="wp-block-query">
<!-- wp:post-template -->
<!-- wp:post-featured-image {"isLink":true} /-->
<!-- wp:post-title {"isLink":true} /-->
<!-- wp:post-date /-->
<!-- wp:post-excerpt /-->
<!-- /wp:post-template -->
<!-- wp:query-pagination -->
<!-- wp:query-pagination-previous /-->
<!-- wp:query-pagination-numbers /-->
<!-- wp:query-pagination-next /-->
<!-- /wp:query-pagination -->
<!-- wp:query-no-results -->
<!-- wp:paragraph -->
<p>該当する記事はまだありません。</p>
<!-- /wp:paragraph -->
<!-- /wp:query-no-results -->
</div>
<!-- /wp:query -->
</main>
<!-- /wp:group -->
<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
使っているブロックの役割は次のとおりです。
- アーカイブタイトル(
query-title):「カテゴリー: お知らせ」のように、見ているアーカイブの名前を出します。接頭辞の表示有無はブロックの設定で変えられます。 - タームの説明(
term-description):カテゴリーやタグの編集画面で入力した説明文を出します。説明が空なら何も出力されません。 - クエリーループ(
query)と投稿テンプレート(post-template):記事1件ぶんの見た目を投稿テンプレートの中に作ると、それが件数ぶん繰り返されます。 - ページ送り(
query-pagination系):前へ・番号・次へのリンクです。 - 結果なし(
query-no-results):該当記事が0件のときだけ表示されます。
マークアップを手書きすると、属性と中身の食い違いでエディターに警告が出ることがあります。ファイルに保存した後、一度サイトエディターで開いて警告が出ないかを確認してください。
「テンプレートのクエリーを引き継ぐ」が要になる
上のコードの "query":{"inherit":true} が、アーカイブテンプレートで最も重要な設定です。これを有効にすると、クエリーループは独自の条件で記事を取りに行かず、今表示しているURLに対応するメインクエリー(カテゴリー一覧ならそのカテゴリーの記事)をそのまま使います。
エディターでは、クエリーループの設定パネルにある「テンプレートからクエリーを継承」や、クエリーの種類を「デフォルト」にする項目がこれに当たります(表記はバージョンにより異なります)。
この設定を切って、カテゴリーなどの条件を手動で指定してしまうと、次のような不具合が起きます。
- どのカテゴリーを開いても同じ記事が並ぶ
- 2ページ目以降に進んでも1ページ目と同じ記事が出る
- ページ送りの数が実際の記事数と合わない
アーカイブテンプレートでは、継承を有効にしたまま、見た目だけを投稿テンプレート側で整えるのが基本です。サイドバーの「人気記事」のように、ページとは関係なく決まった記事を出したい場合にだけ、継承しない2つ目のクエリーループを使います。
1ページの表示件数を変える
継承したクエリーの件数は、「設定」→「表示設定」の「1ページに表示する最大投稿数」に従います。アーカイブの種類によって件数を変えたい場合は、子テーマの functions.php で pre_get_posts フックを使い、メインクエリーを調整します。
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_category() ) {
$query->set( 'posts_per_page', 12 );
}
} );
is_admin() と is_main_query() の確認を入れないと、管理画面の一覧やウィジェットのクエリーまで変わってしまいます。クエリーループ側で件数を指定するのではなく、メインクエリーを変えるのは、ページ送りの計算をメインクエリーと一致させるためです。
カスタム投稿タイプのアーカイブ
カスタム投稿タイプの一覧ページ(例:/news/)を作るには、投稿タイプの登録時に has_archive を有効にしておく必要があります。
add_action( 'init', function () {
register_post_type( 'news', array(
'label' => 'お知らせ',
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
) );
} );
登録は init フックで行います。has_archive を後から有効にした場合は、「設定」→「パーマリンク」を開いて保存し直し、リライトルールを更新してください。これをしないと一覧URLが404になります。テンプレートは templates/archive-news.html として作るか、サイトエディターでその投稿タイプのアーカイブを選んで作成します。show_in_rest を有効にしておくと、ブロックエディターで投稿を編集できます。
表示されないときの確認ポイント
- 使われているテンプレートを確かめる:サイトエディターでテンプレートの一覧を見て、より優先度の高いテンプレート(
category.htmlなど)が別に存在していないかを確認します。 - データベース側の版が優先されていないか:エディターで一度保存したテンプレートは、ファイルより優先されます。ファイルの変更が効かないときはリセットを試します。
- 継承が有効か:どのアーカイブでも同じ記事が並ぶなら、クエリーループの継承設定を見直します。
- パーマリンクの更新:カスタム投稿タイプの一覧が404なら、パーマリンク設定を保存し直します。
- キャッシュ:ページキャッシュやCDNを使っている場合は、パージしてから確認します。
まとめ
- アーカイブテンプレートは
templates/archive.htmlを基本に、必要に応じてcategory.htmlなどのより具体的なテンプレートを追加します。 - クエリーループは「テンプレートのクエリーを引き継ぐ」設定を有効にし、記事の絞り込みとページ送りはWordPress本体に任せます。
- 表示件数は
pre_get_postsでメインクエリーを調整して変えます。 - カスタム投稿タイプの一覧は
has_archiveを有効にし、パーマリンクを更新してから作ります。 - サイトエディターで保存した版はファイルより優先されるため、反映されないときはまずそこを確認してください。