WP-PageNaviで2ページ目以降が404になる時の対処法

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つずつ確認してみてください。