FeeeeeLog

WordPressのカテゴリーの2ページ目以降と子カテゴリーが404エラーになる時の対処法

   

WordPressでパーマリンク設定によっては、カテゴリーのページ送りで2ページ目以降が404になったり、子カテゴリーが404になったりします。

  • カテゴリーのページ送りの2ページ目”/page/2″以降が404(ページが見つからない)になる
  • 子カテゴリーを表示すると次のどちらかになる
    • 404になる
    • 別の投稿ページを表示

プラグインの導入でリンクの設定を変えることもできるのですが、リンクの変更は非常に重要なのでプラグインはちょっと・・・。なんとか自分で修正したいという方に向けての記事です。
なお、すべての環境で対応可能という方法でありませんのでご注意ください。

本記事では、こちらの情報を提供します。

  • functions.phpの修正で対処する
  • 子カテゴリーの404をなくす
  • カテゴリー・子カテゴリーのページ送りの404をなくす
  • 対象読者
    • functions.phpの修正ができる。もしくは、プラグイン化して導入できる。
    • 推奨:動作確認・検証・修正のためにサーバーのファイル操作ができる。
  • functions.phpの修正は自己責任でお願いします

 

スポンサーリンク

 

もくじ

WordPressのパーマリンク設定

パーマリンクを変更すると何が問題か

作成したばかりでソーシャルブックマークがほとんどないようなサイトは、パーマリンクを修正しても何の問題もありません。
しかし、ある程度訪問者が増えて順調に運営しているサイトでパーマリンクを変更すると次の問題があります。

  • ソーシャルブックマークがクリアされる

せっかくソーシャルブックマークが増えたのに、0からやり直しはしたくないという場合はパーマリンクを変えずに対応しましょう。

なお、リンクを変えても301リダイレクトすればページの評価は受け継がれるので、リダイレクトすれば問題ないという場合はパーマリンクを変えても良いです。

パーマリンク設定の何が影響して404になるか

パーマリンクから/category/を消すために、カテゴリーベースに “.” を設定していませんか。
さらに、カスタム構造に “/%category%/%postname%/” と設定していますね。

WordPress パーマリンク設定

WordPress パーマリンク設定

パーマリンク設定
共通設定 > カスタム構造 /%category%/%postname%/
オプション > カテゴリーベース .

WordPressでは、URLのクエリ文字列(最初に出てくる “?” 以降のパラメーター)から、ページにどのテンプレートを使用するかを決めます。

次の順序でURLからWebページが表示されます。

  1. クエリ文字列とクエリタイプを照合し、どの種類のページ(カテゴリーページ、検索ページ等)かを判断
  2. ページの種類から、テンプレートを選択
  3. テンプレートからWebページを生成

今回は、子カテゴリーとカテゴリーの/page/2/がエラーになるケースですので、クエリ文字列はありません。

それぞれのアクセスページとURLの関係は次のようになります。

アクセスページ URL
子カテゴリー https://ドメイン/category-parent/category-child/
カテゴリーの2ページ目 https://ドメイン/category-parent/page/2/
子カテゴリーの2ページ目 https://ドメイン/category-parent/category-child/2/

次に、WordPressにURLから判断してほしいページの種類と情報を記載します。
このように解釈してくれると正しく子カテゴリーや2ページが表示されます。

URL ページの種類 カテゴリーのスラッグ
(category_name)
投稿のスラッグ
(name)
投稿の固定ページ
(page)
ページ送りのページ番号
(paged)
https://ドメイン/category-parent/category-child/ カテゴリー category-parent/category-child なし なし なし
https://ドメイン/category-parent/page/2/ カテゴリー category-parent なし なし 2
https://ドメイン/category-parent/category-child/2/ カテゴリー category-parent/category-child なし なし 2

現状では、おそらく次のような間違った解釈になっています。

URL ページの種類 カテゴリーのスラッグ
(category_name)
投稿のスラッグ
(name)
投稿の固定ページ
(page)
ページ送りのページ番号
(paged)
https://ドメイン/category-parent/category-child/ 投稿ページ category-parent category-child なし なし
https://ドメイン/category-parent/page/2/ 固定ページ category-parent page 2 なし
https://ドメイン/category-parent/category-child/2/ 投稿ページ category-parent category-child なし 2

投稿のスラッグがあると、投稿ページと判断されます。
投稿のスラッグがあって、固定ページの値があると固定ページと判断されます。

というように、正しくページの種類が判断されずに誤ったページを表示しようとします。
その結果404に・・・

これは、URLからはカテゴリーか投稿ページかというような情報が読み取れないために、判断を間違えてしまうからです。
このために、カテゴリーは /category/ としておくことで区別できるようになっていました。

また、投稿ページに拡張子がある場合も投稿スラッグとカテゴリーのスラッグなどの判断ができ、正しく解釈されます。

補足:パーマリンクを変えて404を無くす方法

「パーマリンクを変えていいよ!」という場合は、様々なサイトで推奨している次の設定に変えてください。

パーマリンク設定
共通設定 > カスタム構造 /%category%/%postname%.html
オプション > カテゴリーベース .

あとは301リダイレクトを設定すれば完了です。
Googleの評価を引き継がなくて良いのならばリダイレクトは不要です。

子カテゴリーの404を回避する

  URL ページの種類 カテゴリーのスラッグ
(category_name)
投稿のスラッグ
(name)
投稿の固定ページ
(page)
ページ送りのページ番号
(paged)
https://ドメイン/category-parent/category-child/ 投稿ページ category-parent category-child なし なし
https://ドメイン/category-parent/category-child/ カテゴリー category-parent/category-child なし なし なし

「誤」の解釈を「正」の解釈に修正します。

functions.php(カテゴリーをハードコーディング)

分かりやすさのために、固定の子カテゴリー”category-parent/category-child”のみを対象に正しくページの種類を判断できるようにしています。

DBに先に問い合わせて、カテゴリーの一覧を取得し、ループで処理することもできます。

functions.php(カテゴリーを取得して判断)

この方法を用いる場合、カテゴリーが大量にあったり、閲覧数が多いような場合はパフォーマンスに影響が出る可能性を考慮してください。
親カテゴリーが一致すると、親カテゴリーに属するすべての子カテゴリーをチェックします。

なお、本プログラムでは、カテゴリーに”parent/child”のように”/”を含む場合はカテゴリーは正しいとして処理します。

カテゴリーのページ送りの404を回避する

  URL ページの種類 カテゴリーのスラッグ
(category_name)
投稿のスラッグ
(name)
投稿の固定ページ
(page)
ページ送りのページ番号
(paged)
https://ドメイン/category-parent/page/2/ 固定ページ category-parent page 2 なし
https://ドメイン/category-parent/category-child/2/ 投稿ページ category-parent category-child なし 2
https://ドメイン/category-parent/page/2/ カテゴリー category-parent なし なし 2
https://ドメイン/category-parent/category-child/2/ カテゴリー category-parent/category-child なし なし 2

カテゴリーのページ送りの404の回避のためには、子カテゴリーの404の回避も必要です。
そうしないと子カテゴリーが表示されませんので。

functions.php

分かりやすさのために、固定の子カテゴリー”category-parent/category-child”のみを対象に正しくページの種類を判断できるように変更しています。
子カテゴリーの404回避は分かりやすさのために省略しています。

(参考)カテゴリーが投稿ページを表示してしまう・・

“parent/child”のカテゴリーを開こうとすると、”parent/child/other-page”が開くような現象です。

この内容に関しては詳しく調べていません。
「こういうことをすると直るかもしれないよ」程度の情報として参考にしてください。

WordPressは、内部で投稿ページが見つからない場合にリダイレクトする機能があります。
このリダイレクトによって、カテゴリーを表示すると異なるURLの投稿ページを表示してしまうことがあります。

これを回避するためには次のようにしてください。

  1. 子カテゴリーと一致するURLの投稿ページを作成
  2. 公開 → 非公開 と変更しながら、作成した投稿ページが表示されることを確認

“/parent/child/”のカテゴリーならば、”parent”カテゴリーに”child”の投稿ページを作成します。

なぜかはわかりませんが、公開 → 非公開 にすると、別の投稿ページのリダイレクトがなくなり”parent/child”の投稿ページを表示するようになりました。

functions.phpに追加する内容

なんやかんやありましたが、この2つを回避するにはこのようになります。

  • 子カテゴリーの404を回避
  • カテゴリーのページ送りの404を回避

これをfunctions.phpにコピペしてください。