カテゴリリストでのページング
IMG_1424
よく企業サイト等で固定ページをトップに据えておき最新情報とかをカテゴリ指定してループで回すような構造の場合、何かのタイミングでnext_posts_link()等がちゃんと動作しなくなる場合がある。症状としてリンク先が404の場合とか、最初のページと同じものが次のページに出てしまうケース等がある。ページングの関数が不安定なのかなんなのか、コードを追ってみてもイマイチ掴めなかったのと、この問題にハマって延々と直すハメになったので忘れないように覚書。

具体的な状況は次の通り。
・通常のテキスト通りなループである
・カテゴリベースで回している(cat=2とか)
・paged=1は正しく動作するが、paged=2以降はpaged=1の内容が表示される
・エントリ数は正しくカウントされている(最終ページ等は正しくハンドリングしている)
・同一ソース内にカテゴリ別に複数の同じようなループがある(cat=nで切り分け、共用部分なし)
・コード的にはこんな感じ。

<div class="post_title" >
	<div class="post_title_text" >
		<?php the_title(); ?>
	</div>
</div>
<div class="content_main" >
	<div class="entry" >
		<?php the_post_thumbnail(); ?>
		<?php the_content(); ?>
	</div>
</div>


ハイ、教科書通りって感じですね。これだけなのは、URIでwww.example.com/?cat=2とかやっているせいで、通常コレで回るハズなんだけれど、どうも動作が怪しい。直接クエリした中身を拾ってみると、その段階でちゃんとデータを持ってきてないことが判明。んじゃぁ…とあれこれ試行錯誤した結果、最もオーソドックスに全部ちゃんと自前で指定すればちゃんと動作するということが判明。ちなみにググったら結構似たような問題…カテゴリループでのページ送りでエラーを出している人が。大半はパーマリンク系で、デフォルトパーマリンクでデータがスリップして同一のデータが表示されるってのはなかった。

で、解決策はというと次の通り。

$query = new WP_Query( array( 'cat' => カテゴリのID, 'paged' => get_query_var( 'paged' ), ) );

if( $query->have_posts() ) {
	while( $query->have_posts() ) {
		$query->the_post();
...


なんてことないですね。ループ直前でちゃんと指定してやっただけで上手く動作するように。あ〜つかれた。このカテゴリ系のルーピングって今ひとつちゃんと動作していないようなそうでないようなところがあって、そもそもタグと抱き合わせてるってところで微妙になってるのかも知れないなぁ。ここいらのベースコードは既にレガシーコード認定してもいいくらいだから、そろそろAPI含めて綺麗に書き直した方がえぇんじゃないすか?とでも提案してみるかな。アメリカ人に「オマエの使い方が悪い」とか言われそうだけれど(汗。

※当たり前だけれど、next_posts_link()とかは単にクエリを参照してリンク作ってるだけなので無罪(笑。

add your comment

*First time to comment? Please comment in English or Japanese to avoid your comment as spam.