WordPressのカテゴリ一覧のURLから「category」を消した場合に、カテゴリ一覧でページ送りすると2ページ目以降が404エラーになってしまいます。
WordPressのカテゴリ一覧のURLにある「category」を取り除きたいことってよくありますよね? 例えば、このサイトのWordpressカテゴリ一覧のURLは「https://lucklog.info/cate …
それを改善する方法と原因をご紹介します。
スポンサーリンク解決方法
下記ソースは基本にはなりますが、テーマやWordpressのバージョンによって多少のカスタマイズが必要になります。
後述する「処理の内容(adjust_category_paged)」の表の「カテゴリ一覧 2ページ目 正常(※2行目)」の値になる必要があります。
つまり、「paged=何ページ目か?(例:2)」、「category_name=カテゴリースラッグ(例:news)」となるようにカスタマイズする必要があります。
方法としては、「adjust_category_paged」関数内で「var_dump($query)」などで$queryの値を把握し、調整します。直接的な答えを書けず、申し訳ありませんが、ご注意ください。
下記ソースを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」を編集する前にはバックアップをとっておき、問題が発生してもすぐに元に戻せるようにしておきましょう。
スポンサーリンク