カスタム投稿アーカイブページの最大表示件数を 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' );
これで処理が極端に早くなったりするわけではありませんが、変更したいものが一箇所にまとまっているので
後々変更を加えるのが容易というメリットもありますね。