【WordPress】カスタム投稿の表示件数を変更する方法|functions.phpで簡単設定!

WordPress

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() のチェックを必ず入れる
  • 対象を絞る条件分岐を入れる
  • ページネーションと競合動作のチェックを忘れずに

必要であれば、この記事にこのまま組み込める文章に整形して納品形式にすることも可能です!
さらに補足したい項目があればお知らせください。

この記事を書いた人
管理人

2012年にWebデザインの勉強を始め、2013年より制作会社に勤務。
これまでに500件以上のWebサイト制作・運用に携わってきました。
現在も制作会社に勤務しながら、Webデザインスクールのトレーナーとしても後進の育成に取り組んでいます。
WordPressやデザインの実践的なノウハウを、初心者にもわかりやすく発信できるよう試行錯誤しています。

管理人をフォローする
WordPress
管理人をフォローする

コメント

タイトルとURLをコピーしました