WordPress カスタム投稿でページネーションが404になる原因と解決法

WordPressで、「カスタム投稿タイプのページネーション2ページ目以降(2ページ目以降じゃなくても、nページ目以降で)が404になる」という現象にちょいちょい陥ったことがあるものの、いつもその場しのぎの応急処置しかしていなかったけど、今回それじゃだめな仕様を実装しなければいけなくなったので、その原因とちゃんとした解決法を調べた。




現象が発生する条件

この現象が発生するのは以下のとき。

  1. カスタム投稿タイプの一覧ページで、
  2. WP_Queryによる定義を行っており、
  3. ‘posts_per_page’で1ページの記事表示数を指定していて、
  4. 管理画面の「設定→表示→1ページに表示する最大投稿数」で設定した数値より3の数値のほうが小さいとき。

つまり、管理画面で「1ページに表示する最大投稿数」を10にしていて、カスタム投稿タイプ”shop”の表示数を5とかにしたい場合、ページネーションがうまく機能しなくなる。

原因

この原因は、かいつまんで言うと

WordPressさんが、表示させるテンプレートを決定する前に、管理画面から設定した値を参照する。このときはまだそのテンプレートに書かれたquery_postsは読まれていない。

そして、テンプレートが読まれquery_postsが読まれた段階でも管理画面から設定した値は参照されたままになっており、2つの値がぶつかり合う

という感じのようです。

つまり、例えば

  • デフォルト投稿記事数が20
  • 管理画面からの設定数が10

だった場合、デフォルト投稿は2ページ目まで表示されます。

そしてなんと、カスタム投稿タイプもこれに合わせて2ページ目までしか表示されないということらしいです。

カスタム投稿の記事数が30,管理画面の設定数が5だとしても、どんな値でもデフォルト投稿のページ数になってしまう。

そういうことか。。。一見ほとんどバグじゃないかと思いますが、WordPressの仕様らしいのでしょうがないですね。

しょうがないので、解決してみましょう。

応急処置

ググったらよく出てくるやつ。

管理画面の最大投稿数を1にする

シンプルでいいです。確かにこれなら理論上いけますね。

簡単なテーマやサイトであればこれでいいと思いますが、「いや、それじゃ困る。なぜならデフォルト投稿の表示数も管理画面から設定できるようにしないといけないから」というパターン、あると思います。

というわけで、もっと自然に解決する方法がこちら。

自然に解決

functions.phpに以下を記述

そして、テンプレート側では’posts_per_page’を指定しない

カスタム投稿ごとに表示数を設定したい場合は、単純に増やせばOK

以上、現場からでした。

こっちの記事もどうぞ

あんまりやりたくないパターンだけど、WordPressの固定ページテンプレート内で記事一覧を表示させ、あまつさえページネーションもつけたいと...