WP-PageNaviを設置したのに、2ページ目以降をクリックすると「404 Not Found」になってしまう…このエラー、WordPress制作をしていると一度は踏むと言っても過言ではないくらい”あるある”なトラブルです。原因はだいたい決まったパターンに絞られるので、順番に確認していきましょう。
原因1. 確認しているURLがそもそも間違っている
カテゴリー一覧(category.php)にページネーションを置いた時にありがちなのが、確認時のURLが間違っているというものです(※パーマリンク設定がカスタム構造の「/%category%/%postname%/」の場合)。
例えば「news」というカテゴリー一覧ページを表示する時、本来のURLはhogehoge.jp/category/newsのはずですが、なんとhogehoge.jp/newsでも一覧ページが表示されてしまうことがあります。この状態でページネーションを操作すると、次のページは「404 Not Found」になります。
今確認しているのは「hogehoge.jp/カテゴリー名」のページになっていませんか? そのURLでもページ自体は表示されてしまうため、制作に夢中になっていると気づかずに”ニセモノ”のページで確認し続けてしまいがちです。hogehoge.jp/category/カテゴリー名のように、きちんと「category」を含めたURLで確認し直してみてください。functionsやプラグインで意図的に「/category」を消している場合は、この原因ではない可能性が高いです。
原因2. カスタムループでpaged変数が渡っていない
URLは合っているのに直らない場合、次に疑うべきはWP_Queryで自作したループです。category.phpなどでメインループをそのまま使わず、独自にWP_Queryを組んでいる時に特に起きやすいトラブルです。
ページ番号を正しく引き継ぐには、現在のページ番号を取得して、明示的にクエリの引数へ渡す必要があります。
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'paged' => $paged,
);
$my_query = new WP_Query( $args );この'paged' => $pagedの指定が抜けていると、WP_Queryは常に1ページ目のデータしか取得しなくなり、2ページ目のURLにアクセスした瞬間に404になってしまいます。
ここがハマりどころなのですが、WordPressの仕様上、トップページ(静的フロントページ)だけはページ番号の変数名がpagedではなくpageになります。同じコードをフロントページに使うと、上記のget_query_var( 'paged' )では正しい値が取れず、やはり2ページ目が404になります。フロントページで使う場合は、両方の変数名を確認するようにしましょう。
まとめ
- まず、確認しているURLが「category」を含んだ本来のURLになっているか見直す
- それでも直らない場合、独自の
WP_Queryループに'paged' => $pagedが渡っているか確認する - フロントページで使う場合は、変数名が
pagedではなくpageになる点に注意する
「あれ、なんで2ページ目だけ404になるんだろう…」と1人で悩む時間、結構つらいですよね。大体はこの2パターンのどちらかなので、慌てずに1つずつ確認してみてください。