Wordpress Tips

2016.08.18

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

カテゴリー:,

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

 <!--?php query_posts('&amp;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' );
 

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

ご相談・ご依頼に関して、まずは

ください。お気軽にどうぞ