カスタム投稿アーカイブページの最大表示件数を is_main_queryを使ってページごとに設定する。

カスタム投稿アーカイブページの最大表示件数を is_main_queryを使ってページごとに設定する。

例. 新着情報一覧(カスタム投稿) ー 最大表示件数=15件
ブログ記事一覧(カスタム投稿) ー 最大表示件数=20件
のようにそれぞれで最大表示件数を設定したい場合は、query_postsを使えば簡単です。

  
    <?php query_posts('&posts_per_page=10'); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
  

しかし、上記の記述方法はあまり推奨されていません。
ループ部分の記述で一度データベースに情報を取りに行ったのにその前の一行はもう一度データベースにアクセスする命令をしています。
問題なく動いているかもしれませんが、無駄な処理をしているので、あまりいい方法ではありませんね。

そこで、functions.phpを使ってそれぞれで最大表示件数を設定する方法をご紹介します。

pre_get_posts

functions.phpに以下を記述します。

  
    function change_posts_per_page($query) {
        if ( is_admin() || ! $query->is_main_query() )
            return;
        if ( $query->is_post_type_archive( 'new' )  ) { //表示させる投稿ページの種類
            $query->set( 'posts_per_page', '15' ); //最大投稿表示数を15件に変更
        }
        if ( $query->is_post_type_archive( 'blog' )  ) {//表示させる投稿ページの種類
            $query->set( 'posts_per_page', '20' ); //最大投稿表示数を20件に変更
        }
    }
    add_action( 'pre_get_posts', 'change_posts_per_page' );
  

( ‘new’ )、( ‘blog’ )の所を適宜変更してください。こちらはカスタム投稿名です。

解説

コピペ等で見慣れた記述かもしれませんが、改めて使用例などを交えて解説していきたいと思います。

  
    function change_posts_per_page($query) {}
    add_action( 'pre_get_posts', 'change_posts_per_page' ); //アクションフックと呼ばれる関数を呼び出す記述です。
  

では関数を呼び出しています。 他には function exclude_category( $query ) {}
//特定のカテゴリーを除外する add_action( ‘pre_get_posts’, ‘exclude_category’ ); などがあります。

  
    if ( $query->is_post_type_archive( 'post-type' )  ) {}
  

ではページの種類等を判別する条件分岐をしています。 他には is_single() is_category() is_search()
等々たくさんあります。

  
    $query->set( 'posts_per_page', '20' );
  

では出力方法を変更しています。 他には、

  
    //例.未分類の'1',投稿ID'1347'を除外して処理を行う
    $query->set( 'cat', '-1,-1347' );
  

等があります。

以下その他使用例です。

  
    //検索結果から固定ページや投稿タイプを含める,除外する
    function search_filter( $query ) {
      if ( !is_admin() && $query->is_main_query() ) {

        if ( $query->is_search ) {
          $query->set( 'post_type', 'post-type' ); //検索結果から固定ページや投稿タイプを除外
        }
        if ($query->is_search) {
          $query->set( 'post_type', array( 'post-type' ) ); //検索結果から固定ページや投稿タイプを含める
        }
      }
    }
    add_action( 'pre_get_posts','search_filter' );
  

これで処理が極端に早くなったりするわけではありませんが、変更したいものが一箇所にまとまっているので
後々変更を加えるのが容易というメリットもありますね。

SNSシェア

WP TECH WordPress技術専門 Tips

コーポレートサイトへ

WP TECH WordPress技術専門 Tips

採用サイトへ