WordPressの固定ページでアーカイブページを作る
前田 大地
先日、とある大規模WordPress案件との戦闘中、WordPressマスターから青魔法「固定ページでアーカイブページを作る」をラーニングしました。
詳しく調べてみると、実装方法を紹介している記事もちらほらと見かけます。せっかくなので、今回は、固定ページとサブループを使って独自のアーカイブページを作る方法をご紹介します。
目次
固定ページでアーカイブページを作るってどういうこと?
WordPressで投稿タイプを追加するとき、has_archive
をTRUE
にすることで、その投稿タイプのアーカイブ(記事一覧)ページが作成されます。
さらに、カスタム分類を使えば、分類ごとのアーカイブページが作成できます。
ほとんどの場合、これら2種類のアーカイブページがあれば事足ります。ですが、さらなるアーカイブページが欲しくなるケースもあります。
例えば、「カスタムフィールドが特定の値のものだけを抽出してアーカイブページを作りたい」場合や、「複数の投稿タイプをまとめたアーカイブページを作りたい」場合などです。
そんなとき、固定ページとサブループを使って独自のアーカイブページを作ることができます。
固定ページは複数ページに分割可能
ご存知の通りWordPressには、投稿や固定ページなどのシングルページも、「1ページ目」「2ページ目」といったページ分割ができるようになっています。
ブロックエディタの「ページ区切りブロック」を使えば、その前後でページを分けることができますよね。対応しているテーマなら、自動的に「次のページ」「前のページ」といったページ送りが表示されるはずです。
ページ分割時のパーマリンク構造も用意されています。例えば固定ページのスラッグが「topics」だった場合、1ページ目は「/topics/」、2ページ目は「/topics/page/2/」、3ページ目は「/topics/page/3/」でアクセスできます。
固定ページとサブループで擬似アーカイブページを作る
というわけで、WordPressにもともと備わっているページ分割機能とサブループを組み合わせれば、擬似的なアーカイブページを作ることができます。
<?php // // 固定ページのテーマファイル // get_header(); ?> <?php while ( have_posts() ) : the_post(); // メインループ開始 ?> <?php // アーカイブ用のサブループ $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; $args = [ 'post_type' => '【投稿タイプ名】', 'posts_per_page' => 10, // 1ページあたりの件数 'paged' => $paged, // 現在のページ番号(何ページ目か) ]; $my_query = new WP_Query( $args ); if( $my_query->have_posts() ): while( $my_query->have_posts() ): $my_query->the_post(); ?> <!-- サブループ内のコンテンツが入る --> <?php endwhile; endif; wp_reset_postdata(); ?> <?php endwhile; // メインループ終了 ?> <?php get_footer(); ?>
paged
に現在のページ番号(何ページ目か)という情報を渡してあげることで、ページ番号に合った投稿を取得してくれます。例えば1ページあたり10件の記事を表示しているなら、2ページ目は11〜20件目の投稿が表示されます。
WP_Query
で抽出する記事の条件をお好みで指定すれば、独自のアーカイブページが作成できます。WP_Queryの詳しい使い方は、解説記事がたくさんあるので自分で調べてね。
ページネーションには、wp-pagenaviプラグインを使うのが最も簡単です。wp_pagenavi
テンプレートタグに引数でWP_Queryオブジェクトを渡せば、それに合ったページネーションを出力してくれます。
<?php wp_pagenavi( [ 'query' => $my_query ] ); ?>
注意点
固定ページをアーカイブページにする場合、以下のような注意点があります。
wp_link_pages()は使えない
通常の固定ページの分割とは異なるため、ページ送り用のテンプレートタグwp_link_pages()
は使えません。max_num_pages
などを利用して独自のページ送りロジックを作るか、おとなしくwp-pagenaviを使いましょう。
投稿がなくても404ページにならない
通常のアーカイブページでは、記事が1件しかないときに2ページ目にアクセスすると404ページが表示されます。しかし、今回の方法では、存在しないページ番号にアクセスしても404ページにはなりません。if( $my_query->have_posts() ):
〜endif;
までのサブループが表示されなくなるだけです。
やってみた感想
スティングレイからマイティガードをラーニングするよりは簡単です。