WordPressのアーカイブページには、投稿やカスタム投稿で作成したページが一覧で表示されます。この記事数は、WordPressの「1ページに表示する最大投稿数」が反映されるようになっています。

しかし、この設定で入力した数は、すべてのアーカイブページに共通して反映されてしまいます。当記事では、様々な条件に応じて、アーカイブの記事数を変更する方法についてご紹介します。

「1ページに表示する最大投稿数」の設定について詳しく知りたい方は、以下をご覧ください。

アーカイブページの記事数を変更するには?

冒頭で解説した通り、「1ページに表示する最大投稿数」で設定した数値はすべてのアーカイブに反映されます。この場合、投稿とカスタム投稿のアーカイブで記事数を変えることができなくなってしまうんですね。

さらに、アーカイブページで渡される投稿の情報は、URLをもとにすでに決まっています。そのため、WP_Queryクラスのように引数で簡単に記事数を変えることができません。

そこで利用するのがWordPressの「pre_get_posts」と呼ばれるフックです。

「pre_get_posts」の使い方

「pre_get_posts」はメインクエリを実行する前に呼び出されるアクションフックです。呼び出された時点でメインクエリの解析は終わっているため、ここで記事一覧の表示条件を上書きしていく形になります。

do_action_ref_array ( 'pre_get_posts', $query );

基本的な使い方は以下になります。カテゴリーアーカイブの記事数を15に変更する記述ですので、functions.phpに記入して動作をご覧ください。

// 投稿カテゴリーアーカイブの記事一覧数を15に変更する
add_action( 'pre_get_posts', function( $query ){

  // 管理画面を除く && メインクエリに限定する
  if ( ! is_admin() && $query->is_main_query() ) {

    // カテゴリーアーカイブのみ
    if( $query->is_category() ){

      // 記事数を15に変更
      $query->set( 'posts_per_page', 15 );
    }

  }
} );

それでは順番に解説していきます。

  • 「pre_get_posts」を使う時の注意点
  • 条件を反映させるページに限定する
  • 記事数を変更する

「pre_get_posts」を使う時の注意点

このアクションフックは、ただ単にフロントページの投稿一覧に反映されるわけではありません。管理画面にも反映されますし、投稿以外(メディアライブラリやナビゲーションメニューなど)の様々なクエリにも影響を及ぼします。

そのため、アーカイブページの記事数を変更するという目的であれば、以下の条件の中で必ず実行してください。

// 管理画面を除く && メインクエリに限定する
if( ! is_admin() && $query->is_main_query() ){
  // この中に処理を書く
}

こちらは本当に必須ですので、もし開発中に挙動がおかしい箇所があれば、上記の条件が抜けていないかご確認ください。

条件を反映させるページに限定する

さきほど紹介した条件内でそのまま処理を実行すると、すべてのメインクエリで実行されてしまいます。次は、どのページのクエリを上書きするかの条件を決めましょう。

ここでは、WordPressの条件分岐タグ(WP_Queryクラスのメソッド)を利用できるので、以下のような条件を指定しましょう。

if( $query->is_category() ){
  // カテゴリーページで実行したい処理をココ
}

カスタム投稿アーカイブであれば、以下の方法で条件分岐できます。

// カスタム投稿「news」の場合
if( $query->is_post_type_archive( 'news' ) ){
  // カスタム投稿「news」のアーカイブページで実行したい処理をココ
}

その他の条件分岐タグに関しては、以下をご覧ください。

記事数を変更する

最後に指定した条件の中で記事数を変更していきます。1ページあたりの記事数を変更する時には、WP_Queryクラスのメソッド「set()」を利用します。

WP_Query::set( $query_var, $value );

このメソッドは、クエリ変数に指定した値をセットできるため、記事数以外の条件を上書きすることもできます。今回は、1ページあたりの記事数を変更するので、第一引数に「posts_per_page」、第二引数に「記事数」を指定して実行しましょう。

// 1ページあたりの記事数を「15」に上書き
$query->set( 'posts_per_page', 15 );

これで記事数を変更する一連の流れは以上になります。なお、以下のように他のクエリ変数も上書きできるので、色々と試してみてください。

// 投稿IDが2648の記事を除外
$query->set( 'post__not_in', array( 2648 ) );

// 並び順をランダムに変更
$query->set( 'orderby', 'rand' );

// 投稿タイプを「投稿」に変更
$query->set( 'post_type', array( 'post' ) );

まとめ

今回は「pre_get_posts」を使ってアーカイブページの記事数を変更する方法について解説しました。使い方を間違えると、様々な箇所に影響を与えるので、条件を正しく指定して利用しましょう。

なお、アーカイブページを開発する時は、ページネーションもセットで実装しますよね。以下にWordPressのページネーションの自作方法をご紹介してますので、ぜひご覧ください。