wordpressのquery_postsとかwp_queryでoffsetを使わずにオフセットする

前回の記事で、WP_QueryやQuery_postsで’offset’のプロパティを使用すると、ページャーにエラーが出て同じ記事しか表示されない…的なことを書きました。
WordPressでページネーション実装したときのWP_Queryとquery_posts共通のハマりポイント

で?なに?if(have_posts()): while(have_posts()): the_post();でいいじゃん?

って方も多いと思いますが、上記のような問題は、ページにループを2つ作る場合に非常に困るんですよね。

query_postsとかwp_queryでoffsetを使わずにオフセットする

最新記事のみ「ループ1」2番目以降は「ループ2」で出力したい時とかあると思うんですね。
ループ2の最初の記事は先頭から2記事目を表示したい、ということです。

WP-PageNaviとoffsetの関係 -WordPress(ワードプレス) (wald-grun/blog)
一応ここにそれっぽい解決法がありましたが、どうも上手く行かず。

なので、事実上offsetは諦めて先頭記事をループ2から除外することにしました。

WP_Queryやquery_postsでoffsetを指定せずに2番めの記事から表示する

では、どうするか…

先頭記事のIDを取得して、ループ2からそれを除外します。
WP_QueryやQuery_postsにはそれぞれ、投稿を除外するアレがありますね。
テンプレートタグ/query posts – WordPress Codex 日本語版
関数リファレンス/WP Query – WordPress Codex 日本語版

‘post__not_in’に指定するIDを取得する

get_the_IDをループ2の直前で使います。
関数リファレンス/get the ID – WordPress Codex 日本語版

それを、WP_Queryの引数として指定する配列にブチ込みます。

ループ1と2の扱いはこんな感じ。

ちょっと素人クサイかもしれませんが、これでイケました!

ページャーで次のページにジャンプした時、そのページでの先頭記事がスッポ抜けるかと心配していましたが…それも無事回避していました!やったね!

おそらく、ループ2の外でget_the_ID()しているのがミソかと思います。
試していませんが、ループの中だと各記事のIDを取ってしまうのではないかと。

これを思いつく前にふと、最初の記事だけ漠然と判別できれば…と思いましたが、それをどうするかイマイチ閃かなかったので、こっちでも「こうやれば同じこと出来るよ!」とかアイデアがあれば是非是非お申し付けくださいませ

 

今回はWP_Queryで実装していましたが、理屈は同じ(?)なのでquery_postsでも大丈夫だと思います。ダメだったら言ってください。satohmsysが陳謝します。

 

でわ!

投稿者 satohmsys