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