WordPressで投稿とカスタム投稿の1ページあたりの表示件数を変えたい場合
更新コンテンツが多いWebサイトを作っていると、WordPressで投稿とカスタム投稿の1ページあたりの表示件数を変えたい、またはカスタム投稿タイプ毎に表示件数を変えたいといった場合が発生します。

通常の投稿は、「設定」の「表示設定」→「1ページに表示する最大投稿数」から変更してください。
これに加えて、ブログは1ページに20件、ギャラリーは15件表示したいとします。
その場合は「function.php」に以下を追加してください。
funciton.phpにコピペでOK
/* ギャラリーの1P件数 */
function change_posts_per_page($query) {
if ( is_admin() || ! $query->is_main_query() )
return;
if ( $query->is_post_type_archive('gallery') ) { //カスタム投稿タイプを指定
$query->set( 'posts_per_page', '15' ); //表示件数を指定
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
「gallery」と「15」の部分を、変更したいカスタム投稿タイプスラッグと件数に変更してください。
タクソノミー一覧の件数も同様に変更したい場合
/* ギャラリーの1P件数 */
function change_posts_per_page($query) {
if ( is_admin() || ! $query->is_main_query() )
return;
if ( $query->is_post_type_archive('gallery')|is_tax( 'gallery_cat' ) ) { //カスタム投稿タイプを指定
$query->set( 'posts_per_page', '15' ); //表示件数を指定
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
「gallery_cat」の部分を変更したいカスタムタクソノミースラッグに変更してください。
複数のカスタム投稿タイプの表示件数を変更したい場合は以下になります。
複数のカスタム投稿タイプの件数を変更したい場合
/* カスタム投稿タイプの1P件数 */
function change_posts_per_page($query) {
if ( is_admin() || ! $query->is_main_query() )
return;
if ( $query->is_post_type_archive('gallery') ) { //カスタム投稿タイプを指定
$query->set( 'posts_per_page', '15' ); //表示件数を指定
}
if ( $query->is_post_type_archive('voice') ) { //カスタム投稿タイプを指定
$query->set( 'posts_per_page', '10' ); //表示件数を指定
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
上記の場合はギャラリー(gallery)は1ページに15件、お客様の声(voice)は1ページに10件です。
pre_get_postsフック使用時の注意点と設定の関係性
今回、WordPressのカスタム投稿の表示件数を変更するのに使用たい pre_get_posts
フックですが、便利な反面、注意点を知らずに使うと意図しない表示や不具合の原因になることもあります。
以下に押さえておくべきポイントを解説します。
1. is_main_query() を必ず使う
pre_get_posts
はすべてのクエリに作用するフックのため、条件を指定しないと管理画面やサブクエリにも影響を与えてしまいます。
if ( is_admin() || ! $query->is_main_query() ) return;
このコードで、管理画面とメインクエリ以外の変更を防いでいます。
2. 条件分岐(is_post_type_archive() など)を使って絞り込む
サイト全体に影響しないよう、対象のカスタム投稿アーカイブページに限定するのが鉄則です。
if ( $query->is_post_type_archive('custom_post') ) {
$query->set( 'posts_per_page', 10 );
}
必要に応じて is_tax()
や is_category()
、is_search()
などと組み合わせるとより柔軟に制御できます。
3.表示設定(管理画面の「表示設定」)とは別に動作する
WordPress管理画面の「設定 → 表示設定」にある「1ページに表示する最大投稿数」は、標準投稿(post)や未変更のアーカイブページにしか影響しません。
カスタム投稿タイプの表示件数を個別に変更したい場合は、pre_get_posts
を使う必要があります。
4. query_posts() との違いに注意
pre_get_posts
は本来のクエリを書き換える安全な方法です。一方、query_posts()
はクエリを強制的に再実行するためトラブルが起きやすく、非推奨とされています。
5.ページネーションが効かなくなる原因にもなりうる
表示件数を変えるだけなら問題ありませんが、クエリの条件を大幅に変更したり、メインループの前で $query->set()
を忘れると、ページ送り(pagination)が正しく動作しなくなる場合があります。
変更後はページネーションが正しく動作しているか確認しましょう。
6.関連プラグインとの競合にも注意
SEOプラグインやカスタム投稿系プラグインが、裏でクエリに手を加えていることがあります。pre_get_posts
で追加の条件を書いた場合、思わぬ競合が起きる可能性もあります。
プラグイン導入時は、意図通り動いているか都度テストが必要です。
まとめ
pre_get_posts
フックは非常に強力ですが、正しく使わないとトラブルのもとになります。
以下の3点を意識すれば、安全に活用できます。
is_main_query()
とis_admin()
のチェックを必ず入れる- 対象を絞る条件分岐を入れる
- ページネーションと競合動作のチェックを忘れずに
必要であれば、この記事にこのまま組み込める文章に整形して納品形式にすることも可能です!
さらに補足したい項目があればお知らせください。
コメント