[WordPress] メインクエリの内容を書き換えて表示したい
アーカイブやインデックスページで「このページだけ昇順で並べたい」「表示件数を増やしたい」といった例外処理をしたいとき、functions.phpでpre_get_postsを使って書き換えをするのが本来のやり方です。
実装の検証など暫定的に動かしたい場合、functions.phpにコードを書きたくないケースもあります。
そこで、テンプレート上でメインクエリの内容を書き換えて再実行する方法を紹介します。
あくまで暫定対応用なので、検証ができたらpre_get_postsを使って書き換えましょう。
サンプルコード
$args = $wp_query->query;
$args = $args + array(
'order' => 'ASC',
'posts_per_page' => 20,
);
$the_query = new WP_Query( $args );
if( $the_query->have_posts() ) {
while( $the_query->have_posts() ) {
$the_query->the_post();
/* 記事の各情報を取得、表示 */
}
}
wp_reset_postdata();
仕組み、解説、補足など ※2019/7/1追記
「$args = $wp_query->query;」でメインクエリの各情報を取得します。
「$args = $args + array(~);」とすることで、既存のクエリはそのままで欲しい条件を追記していくことができます。
この方法はクエリを2回実行することになるので、パフォーマンスの面でよろしくありません。また、ページネーションの動きに悪影響が出る可能性もあります。
繰り返しになりますが、あくまで暫定的に検証するときに使用し、正式対応はpre_get_postsで行いましょう。
function set_my_query($query) {
if(is_admin() || !$query->is_main_query()) {
return;
}
if($query->is_post_type_archive('xxx')) {
$query->set('order', 'ASC');
$query->set('posts_per_page', 20);
}
}
add_action('pre_get_posts', 'set_my_query');
ご質問など受け付けています
記事の中でわかりにくかったところ、もっと知りたかったこと、間違っていることなど、何でもお気軽にご連絡ください。
ご連絡は下記フォームを利用いただくか、ツイッターアカウント@flat8migi宛てでもOKです。