いま担当している WordPress でサイトでは WP_Query を使って記事一覧を取得する機会が頻繁に発生しています。

記事アーカイブやカテゴリ、タグアーカイブページである程度条件を指定して記事を取得する場合は function.phppre_get_posts アクションフックを使ってメインクエリを制御すれば良いのですが、特定の記事を除外するために指定する記事 ID が pre_get_posts が動作するタイミングでは動的に取得できないので、メインクエリだけでは要件を満たせない場合があります。

そんな場合は WP_Query を使ったサブループで一覧を取得することになるのですが、そのサブループでのページネーションでどっぷりとハマってしまいました。そして解決策はとても簡単でした。

実はページネーションについての記事は探せばかなり沢山あって、しかも参考にしているところが似ているのかコードもほとんど同じものも有ったりします。その中で参考にさせていただいたのはデザインサプライ-DesignSupply.-さんの記事 ( 固定ページでWP_Queryのサブループを使ったアーカイブのページャーを実装する | 大阪市天王寺区SOHOホームページ制作 | デザインサプライ-DesignSupply.- )

しかしここでハマったのが1ページあたりの表示件数 posts_per_page でした。

この部分。基本的には WordPress の管理画面の表示設定にある「1ページに表示する最大投稿数」という項目の数値が適用されるのですが、WP_Query でサブループでの表示件数を設定することができます。

ところがその WP_Query で指定した数値と管理画面で設定した数字が合致しないとメインループとサブループでページ数が合わなくなり空ページ ( index.php ) が表示される、ということが発生します。

実際自分が遭遇したのはタグアーカイブページで管理画面では 10、WP_Query では 5、対象の記事数が 8だったとき、ページネーションでは2ページに分かれていたのが2ページ目 ( /page/2/ ) に遷移すると空ページが表示されました。これはメインループ側では記事が11以上ないと2ページ目は存在しないと判断してしまい空ページが表示されていたんですね。

なので管理画面で設定することで事足りるようであればその数値を合わせるようにして、カテゴリやタグ、タクソノミーごとに表示件数を変える場合は function.phppre_get_posts アクションフックに、それぞれの条件に合わせて

$query->set( 'posts_per_page', 1ページに表示する記事数 );

を指定することになりますが、もちろんここで設定する記事数は WP_Query の posts_per_page と数値を合わせましょう。

調べてみれば「まあ、そうだよね」という感じですがハマってしまうとなかなか気付けない盲点でした。本当はサブループではなくてメインループで処理してしまいたいんですけどね…。


0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください