【WordPress】WP_Queryでpagedとoffsetが一緒に使えないけど、どうにかする
4月になりましたが、なんか寒いですね。今年も花粉症で鼻がむずむずのyanagimachiです。
さて、割としょっちゅう最新1件だけ大きく表示して、それ以外はグリッド状の一覧でその下にページャーみたいな一覧ページを作ることがあります。
こういうとき大抵WP Queryを使っているのですが、これではページング(paged)とオフセット(offset)が一緒に使えません。
いつもどうするんだったけなぁ・・・とググってしまうので、忘れないようにメモしておこうと思います。
ちなみにググると
paged と offset を同時に使ってクエリを投げると意図したように動かないのを回避 - Shinichi Nishikawa'sが上位に表示されます。
この記事は諸事情で別の方法を使っているのですが、普通ならpre_get_posts
を使えば良いんだそうです。
WP_Queryでoffsetを使わない
pre_get_posts
だとfunctions.phpもしくはそこから読んでいるファイルに書かねばならず、各ページに書いてしまいたいってときにはちょっと不便です。
そんなときに使えるのがWP_Query
でoffsetを使わない方法です。
まずWP_Query
で1件目の投稿を表示して投稿idを取得し、一覧のWP_Query
ではoffsetを使わないで1件目の投稿を除外します。
post__not_in
(投稿id(配列)で除外)を使います。
<?php
$paged = get_query_var( 'paged', 1 ); //現在のページ番号。デフォルトは1
$post__not_in = []; //最新1件目の記事idを後で入れる
$first_args = array(
'post_type' => 'staff',
'posts_per_page' => 1 //表示数
);
$first_query = new WP_Query( $first_args );
if ( $first_query->have_posts() ) : while ( $first_query->have_posts() ) : $first_query->the_post();
$post__not_in[] = $post->ID; //最新1件目の記事idを入れる
if ($paged == 1) { //1ページ目でだけ、最新1件目の記事を表示
//最新1件目の記事の表示したい内容
}
endforeach; endif;
$the_args = array(
'post_type' => 'staff',
'paged' => $paged,
'post__not_in' => array($post__not_in), //最新1件目の記事を除外
'posts_per_page' => 20 //表示数
);
$the_query = new WP_Query( $the_args );
if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();
//2件目以降の記事の表示したい内容
endforeach;
//ページャーはここに入れる
endif;
?>
これだとページ内で済むので、忘れっぽい私でも後から見て把握がしやすいです。
一緒にpagedとoffsetが使えれば一番いいんでしょうけども・・・