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%/” と設定していますね。
パーマリンク設定 | 値 |
共通設定 > カスタム構造 | /%category%/%postname%/ |
オプション > カテゴリーベース | . |
WordPressでは、URLのクエリ文字列(最初に出てくる “?” 以降のパラメーター)から、ページにどのテンプレートを使用するかを決めます。
次の順序でURLからWebページが表示されます。
- クエリ文字列とクエリタイプを照合し、どの種類のページ(カテゴリーページ、検索ページ等)かを判断
- ページの種類から、テンプレートを選択
- テンプレートから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の投稿ページを表示してしまうことがあります。
これを回避するためには次のようにしてください。
- 子カテゴリーと一致するURLの投稿ページを作成
- 公開 → 非公開 と変更しながら、作成した投稿ページが表示されることを確認
“/parent/child/”のカテゴリーならば、”parent”カテゴリーに”child”の投稿ページを作成します。
なぜかはわかりませんが、公開 → 非公開 にすると、別の投稿ページのリダイレクトがなくなり”parent/child”の投稿ページを表示するようになりました。
functions.phpに追加する内容
なんやかんやありましたが、この2つを回避するにはこのようになります。
- 子カテゴリーの404を回避
- カテゴリーのページ送りの404を回避
これをfunctions.phpにコピペしてください。