【404エラー】WordPressでページ送りすると2ページ目以降が404になってしまう!解決方法!

WordPressのカテゴリ一覧のURLから「category」を消した場合に、カテゴリ一覧でページ送りすると2ページ目以降が404エラーになってしまいます。

それを改善する方法と原因をご紹介します。

解決方法

下記ソースをfunction.phpに入れると404エラーはなくなり、2ページ目以降も正常に表示されるようになります。

function adjust_category_paged( $query = []) {
  if (isset($query['name'])
   && $query['name'] === 'page'
   && isset($query['page'])
   && isset($query['category_name'])) {
    $query['paged'] = intval($query['page']); // 念のため整数化しておく
    unset($query['name']);
    unset($query['page']);
  }
  return $query;
}
add_filter('request', 'adjust_category_paged');
注意点

「function.php」を編集する前にはバックアップをとっておき、問題が発生してもすぐに元に戻せるようにしておきましょう。

どのような処理か簡単に説明

add_filter('request', 'adjust_category_paged');

add_filterのhook「request」は「追加クエリ変数・プライベートクエリ変数が追加された後に適用される。(https://wpdocs.osdn.jp/プラグイン_API/フィルターフック一覧より引用)」タイミングで「adjust_category_paged」という関数を呼び出します。

読み込む投稿の条件を調整する処理です。

処理の内容(adjust_category_paged)

それでは、「adjust_category_paged」に関して簡単に説明しておきます。

function adjust_category_paged( $query = []) {
  if (isset($query['name'])
   && $query['name'] === 'page'
   && isset($query['page'])
   && isset($query['category_name'])) {
    $query['paged'] = intval($query['page']); // 念のため整数化しておく
    unset($query['name']);
    unset($query['page']);
  }
  return $query;
}

次項の「原因」に載せますが、調査した結果、「$query」が404エラーと正常のときで下表のような違いがありました。また、他のページを調べたところ404エラーの時になるpage=2、name=pageというパターンは見つかりませんでしたので、これを条件に正常な「$query」に調整すれば良いと判断できました。
※「page=2」は3ページ目であれば、「page=3」となり、nページ目だと「page=n」となります

ページ paged page name category_name
カテゴリ一覧
2ページ目
404エラー
2 page {カテゴリー
スラッグ}
カテゴリ一覧
2ページ目
正常
2 {カテゴリー
スラッグ}

よって、「page=整数」かつ「name=page」かつ「category_nameが設定されている」とき、$queryを正常な状態に調整、つまり「page」の値を「paged」に入れ、「page」「name」を削除すればOKです。

「adjust_category_paged」関数ではその処理が行われています。

原因

WordPressのカテゴリ一覧のURLから「category」を消す前後で、カテゴリー2ページ目以降の「追加クエリ変数・プライベートクエリ変数が追加された後のqueryの状態」が異なるためだと思われます。

というのも、下記で様々なページの$queryの値を調査・比較した結果から判断しました。そして、各ページのqueryの値を調べたことで、本ページでの解決方法で問題ないだろうという結論に至りました。

様々なページの$queryを調べた概要

まず、404エラーになっているカテゴリ一覧ページの2ページ目の$queryの値は「page=2(整数)」「name=page」「category_name=カテゴリースラッグ」でした。

この値を他のページと比較してみると、「page=2(整数)」「name=page」の2つは他のページと違いがあることが分かりました。正常な場合は下記の値が設定されていました。

  • pageは「投稿の個別ページ」または「固定ページ」に対して共通して空文字が設定されていました
  • nameは「投稿の個別ページ」に投稿のスラッグが設定されていました

404エラーになっているページ以外の$queryの値は似た性質のページと同じような値が設定されていて、違和感に感じる箇所はありませんでした。

 

それでは、各ページを調査した結果を載せておきます。興味のある方は下記もご覧ください。

各ページのquery一覧

※トップ(最新の投稿)、トップ(固定ページ)、固定(投稿ページ)にある「最新の投稿」「固定ページ」「投稿ページ」の意味は設定>表示設定>ホームページ表示で設定している値を書いています

ページ paged page pagename post_type name category_name
トップ
(最新の投稿)
トップ
2ページ目
(最新の投稿)
2
トップ
(固定ページ)
固定
(投稿ページ)
空文字 {指定した
スラッグ}
固定
2ページ目
(投稿ページ)
2 {指定した
スラッグ}
固定 空文字 {指定した
スラッグ}
投稿一覧 post
投稿一覧
2ページ目
2 post
投稿個別 空文字 {投稿タイプ
スラッグ}
{カテゴリー
スラッグ}
カテゴリ一覧 {カテゴリー
スラッグ}
カテゴリ一覧
2ページ目
404エラー
2 page {カテゴリー
スラッグ}
カテゴリ一覧
2ページ目
正常
2 {カテゴリー
スラッグ}
ページ paged page post_type {投稿タイプ
スラッグ}
name
カスタム
投稿一覧
{投稿タイプ
スラッグ}
カスタム
投稿一覧
2ページ目
2 {投稿タイプ
スラッグ}
カスタム
投稿個別
空文字 {投稿タイプ
スラッグ}
{指定した
スラッグ}
{指定した
スラッグ}
ページ paged author_name year monthnum s
著者別
投稿一覧
{ユーザスラッグ}
著者別
投稿一覧
2ページ目
2 {ユーザスラッグ}
年別一覧 {西暦}
年別一覧 2 {西暦}
月別一覧 {西暦} {月}
月別一覧 2 {西暦} {月}
検索結果 {検索文字列}
検索結果
2ページ目
2 {検索文字列}

まとめ

WordPressのカテゴリ一覧のURLから「category」を消した場合には、2ページ目以降が404エラーになってしまいます。

下記ソースをfunction.phpに入れて、404エラーを回避しましょう。

function adjust_category_paged( $query = []) {
  if (isset($query['name'])
   && $query['name'] === 'page'
   && isset($query['page'])
   && isset($query['category_name'])) {
    $query['paged'] = intval($query['page']); // 念のため整数化しておく
    unset($query['name']);
    unset($query['page']);
  }
  return $query;
}
add_filter('request', 'adjust_category_paged');
注意点

「function.php」を編集する前にはバックアップをとっておき、問題が発生してもすぐに元に戻せるようにしておきましょう。