rusica.net

pre_get_postsに関するメモ

メインクエリ(そのページに本来表示する内容)を変更する場合はquery_postsじゃなくてpre_get_postsフィルター使おうね、的なのを今更知ったのでメモっておく。

ちなみにサブクエリ(ブログのサイドバーに表示する「関連記事」みたいなのとか)の場合はget_posts使った方がいいらしい。

使い方

function my_posts_new($query){
     //管理画面またはメインクエリじゃない場合は何もしない
    if(is_admin() || ! $query->is_main_query() ) {
        return;
    }
    //以下変更内容を記述
}
//最後にadd_action
add_action('pre_get_posts','my_posts_new');

変更内容の記述について

if ( $query-> [条件指定] ) {
    $query->[詳細な変更内容];
}

みたいに書く。以下記述例。基本的にget_postsで指定できる内容が指定できるみたい。if文の条件指定部分は動作しないものがあるみたい。

カテゴリページのみ1ページ毎の表示件数を15件にしたい

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

トップページに投稿だけじゃなくカスタム投稿も含めた新着5件を表示したい

if ( $query->is_home() ) {
    $query->set('post_type', array('post', 'カスタム投稿名') );
    $query->set('posts_per_page', '5');
}