カスタム投稿タイプとカスタムタクソノミーの一覧ページの表示件数を指定する方法

カスタム投稿タイプとカスタムタクソノミーの一覧ページの表示件数を指定する方法

一度確認しつつ、忘れてた点なのでメモしときます。
カスタム投稿タイプを使用する際は注意するポイントだと思います。

functions.phpで『pre_get_posts』をフックして表示件数を設定

例えばカスタム投稿タイプ『食品』ページを作り、カスタムタクソノミー『野菜』『肉』で分類したとします。

それぞれのスラッグは『食品:food』『野菜:vegetables』『肉:meat』。
すると『食品』の一覧ページはテンプレートファイル『archive-food.php』、
『野菜』『肉』は『taxonomy.php』を使用して表示されます。

65-01

表示件数が『投稿』タイプと同じであれば、管理画面の【表示設定】の設定で済みます。
しかし、『投稿』タイプと違う件数にしたい場合はfunctions.phpの方で設定をする必要があります。

方法は独自の関数(ここでは『posts_per_page』)を作り、『pre_get_posts』をフックして、上書きします
また、『is_post_type_archive()』でカスタム投稿タイプ、『is_tax() 』でカスタムタクソノミーを条件分岐し、数値を指定。

ここでは『食品』『野菜/肉』の一覧ページを10件にしています。

function posts_per_page($query) {

//管理画面とメインクエリー以外の場合は除外
if ( is_admin() || ! $query->is_main_query() ){
return;
}
if ( $query->is_post_type_archive( 'food' ) ) {
$query->set( 'posts_per_page', '10' );
}
if ( $query->is_tax() ) {
$query->set( 'posts_per_page', '10' );
}
}
add_action( 'pre_get_posts', 'posts_per_page' );

(カスタム投稿タイプが『food』しかなければ、コード中の『’food’』という指定は必須ではない。)

注意すべき、というか自分が忘れていたのは、カスタム投稿タイプの表示件数を設定すれば、分類したタクソノミーのアーカイブページもそれに準じると思っていた点です

実際は『is_tax() 〜』で別途設定する必要があり、これを記述しなかったため、タクソノミーのアーカイブページは『投稿』の【表示設定】の件数での出力になってしまっていました。

補足:別パターンのタクソノミーの表示件数の設定方法

同じ例でもう少し詳しく、他のパターンの設定方法も。

タクソノミーごとのアーカイブで別の表示件数に設定

上記例は『野菜』と『肉』のアーカイブページが同じ件数でしたが、別にする場合。
『is_tax』の()にタクソノミーのスラッグを入れて条件分岐させます。

function posts_per_page($query) {

if ( $query->is_tax('vegetables') ) {
$query->set( 'posts_per_page', '15' );
}

if ( $query->is_tax('meat') ) {
$query->set( 'posts_per_page', '20' );
}
}
add_action( 'pre_get_posts', 'posts_per_page' );

タクソノミーのタームごとに設定

さらにタクソノミー『野菜』のターム『じゃがいも(スラッグ:potato)』『にんじん(スラッグ:carrot)』のアーカイブページの件数を設定する場合。
タクソノミーのスラッグのあとにタームを入れます。

function posts_per_page($query) {

if ( $query->is_tax('vegetables', 'potato') ) {
$query->set( 'posts_per_page', '5' );
}
if ( $query->is_tax('vegetables' 'carrot') ) {
$query->set( 'posts_per_page', '8' );
}
}
add_action( 'pre_get_posts', 'posts_per_page' );

タクソノミーと件数の設定が複数ある場合

タクソノミーが『野菜』『肉』の他にも沢山あり、『野菜』『肉』だけ10件にしたい場合は下記のように書けば手短に記述できるかと思います。

function posts_per_page($query) {

//野菜と肉のタクソノミーの表示件数を10件に
if ( $query->is_tax('vegetables')  ||  $query->is_tax('meat') ) {
$query->set( 'posts_per_page', '10' );
}
//野菜と肉以外のタクソノミーの表示件数を20件に
if ( $query->is_tax() ) {
$query->set( 'posts_per_page', '20' );
}
}
add_action( 'pre_get_posts', 'posts_per_page' );