functions.phpで一覧ページの表示件数を複数設定する

functions.phpで一覧ページの表示件数を複数設定するのアイキャッチ画像

通常WordPressは管理画面の設定>表示設定>1ページに表示する最大投稿数で、1ページあたりの最大投稿数を設定しますが、トップページは3件カテゴリーは6件アーカイブは20件など複数の設定をする場合はfunctions.phpから設定するのが一元管理できていい感じです。

pre_get_postsで表示件数を調整する

posts_per_pageで表示件数を設定します。

  <?php
  //表示件数制御
  add_action('pre_get_posts','my_pre_get_posts');
  function my_pre_get_posts( $query ) {
    if(is_admin() || ! $query -> is_main_query()) return;
    if($query -> is_front_page()) { //フロントページ
      $query -> set('posts_per_page',10); //10件
    }
    if($query->is_home()){ // トップページ
      $query->set( 'posts_per_page',20); //20件
    }
    if($query->is_month()){ // 月別アーカイブ
      $query->set('posts_per_page',-1); // -1ですべて表示
    }
    if($query->is_year()){ //年別アーカイブ
      $query->set('posts_per_page',10); //10件
    }
    if($query->is_author()){ // 作成者アーカイブ
      $query->set('posts_per_page',10); // 10件
    }
    if($query->is_category()){ // カテゴリーアーカイブ
      $query->set('posts_per_page',9); // 9件
    }
    //newsというカスタム投稿タイプのアーカイブページ
    if($query -> is_post_type_archive('news')){
      $query -> set('posts_per_page',10); //10件
      $query -> set('order','ASC'); //昇順
      $query -> set('orderby', 'date'); //日
    }
    //newscatというタクソノミーの一覧ページ
    if ($query -> is_tax('newscat')) {
      $query -> set('posts_per_page', 10); //10件
      $query -> set('order', 'DESC'); //降順
      $query -> set('orderby', 'date'); //日
    }
  }
  ?>

ループから特定のタームを除外する

$tax_queryで特定のタームを指定すればループから特定のタームを除外することができます。

  if($query -> is_post_type_archive('news')){
       $tax_query = array(
           array(
               'taxonomy' => 'newscat',
               'terms' => array('other'),
               'field' => 'slug',
               'operator' => 'NOT IN',//一致しない場合は実行
               )
           );
       $query -> set('posts_per_page', 10);
       $query -> set('order', 'DESC');
       $query -> set('orderby', 'date');
       $query -> set('tax_query', $tax_query);
  }

特定のカテゴリを除外する場合

以下はトップページに特定のカテゴリーを表示させない例です。カテゴリーIDに「-」をつけます。

  if($query->is_home()){ // トップページ
    $query->set( 'cat', '-カテゴリID' );
  }

pre_get_postsでメインのループを制御

メインループに条件を加えて制御する場合はpre_get_postsがやっぱ手軽だと思います。