WordPressで、「カスタム投稿タイプのページネーション2ページ目以降(2ページ目以降じゃなくても、nページ目以降で)が404になる」という現象にちょいちょい陥ったことがあるものの、いつもその場しのぎの応急処置しかしていなかったけど、今回それじゃだめな仕様を実装しなければいけなくなったので、その原因とちゃんとした解決法を調べた。
現象が発生する条件
この現象が発生するのは以下のとき。
- カスタム投稿タイプの一覧ページで、
- WP_Queryによる定義を行っており、
- ‘posts_per_page’で1ページの記事表示数を指定していて、
- 管理画面の「設定→表示→1ページに表示する最大投稿数」で設定した数値より3の数値のほうが小さいとき。
つまり、管理画面で「1ページに表示する最大投稿数」を10にしていて、カスタム投稿タイプ”shop”の表示数を5とかにしたい場合、ページネーションがうまく機能しなくなる。
原因
この原因は、かいつまんで言うと
WordPressさんが、表示させるテンプレートを決定する前に、管理画面から設定した値を参照する。このときはまだそのテンプレートに書かれたquery_postsは読まれていない。
そして、テンプレートが読まれquery_postsが読まれた段階でも管理画面から設定した値は参照されたままになっており、2つの値がぶつかり合う
という感じのようです。
つまり、例えば
- デフォルト投稿記事数が20
- 管理画面からの設定数が10
だった場合、デフォルト投稿は2ページ目まで表示されます。
そしてなんと、カスタム投稿タイプもこれに合わせて2ページ目までしか表示されないということらしいです。
カスタム投稿の記事数が30,管理画面の設定数が5だとしても、どんな値でもデフォルト投稿のページ数になってしまう。
そういうことか。。。一見ほとんどバグじゃないかと思いますが、WordPressの仕様らしいのでしょうがないですね。
しょうがないので、解決してみましょう。
応急処置
ググったらよく出てくるやつ。
シンプルでいいです。確かにこれなら理論上いけますね。
簡単なテーマやサイトであればこれでいいと思いますが、「いや、それじゃ困る。なぜならデフォルト投稿の表示数も管理画面から設定できるようにしないといけないから」というパターン、あると思います。
というわけで、もっと自然に解決する方法がこちら。
自然に解決
functions.phpに以下を記述
1 2 3 4 5 6 7 8 9 10 11 |
<?php add_filter( 'parse_query', 'custom_per_page' ); function custom_per_page( $query ) { if ( is_admin() || is_singular() || !is_main_query() ) { // 管理画面とsingleとメインループじゃない部分は除く return false; } if ( get_query_var( 'post_type' ) == 'event' ) { $query->set( 'posts_per_page', '6' ); } } |
そして、テンプレート側では’posts_per_page’を指定しない。
カスタム投稿ごとに表示数を設定したい場合は、単純に増やせばOK
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php add_filter( 'parse_query', 'custom_per_page' ); function custom_per_page( $query ) { if ( is_admin() || is_singular() || !is_main_query() ) { // 管理画面とsingleとメインループじゃない部分は除く return false; } if ( get_query_var( 'post_type' ) == 'event' ) { $query->set( 'posts_per_page', '6' ); } if ( get_query_var( 'post_type' ) == 'blog' ) { $query->set( 'posts_per_page', '5' ); } } |
以上、現場からでした。
こっちの記事もどうぞ
いちばんやさしいWordPressの教本第3版 人気講師が教える本格Webサイトの作り方 (「いちばんやさしい教本」)
コメント
ちょうど同じ原因で悩んでおりました。
無事解決できました。
ありがとうございます!!