【WordPress】2ページ目が404NotFound!TaxonomyのページングでURLをリライトする
- Category :
- Wordpress
- | 2013.07.26
ページング処理を追加した時、パーマリンクをカスタム構造にしていると、よくありがちな事ですが、page/2になると、404になってしまうという現象に遭遇する時があります。今回、私はカスタム投稿タイプでのページングでその現象が現れました。
1.5日ほど悩んだ結果、プラグインも色々探しましたが、結局、function.phpにURLリライト処理を書くことで解決しました。
以下、その内容を紹介します。
【前提】
- プラグイン「Custom Post Type Permalinks」
- プラグイン「WP-PageNavi」
- カスタム投稿タイプ名 : [blogs]
- カスタム投稿タイプのカスタム分類名 : [blogcat]
[管理] > [設定] > [パーマリンク設定] > カスタム投稿タイプのパーマリンクの設定:
/%blogcat%/%postname%/
themes テンプレート:
archive-blogs.php
taxonomy-blogcat.php
【現象】
★taxonomyのアーカイブで、ページングしようとしたらpage/2で404になった。
→ archive-blogs.php でのページングは正常に表示。
→ taxonomy-blogcat.php でのページングが404となってしまう。
【解決方法】
以下、function.phpに追加しました。
add_filter('rewrite_rules_array','wp_insertMyRewriteRules'); add_filter('query_vars','wp_insertMyRewriteQueryVars'); add_filter('init','flushRules'); function flushRules(){ global $wp_rewrite; $wp_rewrite->flush_rules(); // リライトルールを再生成 } function wp_insertMyRewriteRules($rules) { $newrules = array(); $newrules['blogs/(.+?)/page/?([0-9]{1,})/?$'] = 'index.php?blogcat=$matches[1]&paged=$matches[2]'; return $newrules + $rules; // 新しいルールを追加 } function wp_insertMyRewriteQueryVars($vars) { array_push($vars, 'id'); // 変数idを追加 return $vars; }
このソースの、12行目、$newrulesに代入しているのが今回目的のリライトルールです。
URLリライトしようと思いつくまでに、長かったです。
では、今回の事をもう少し詳しく紹介したいと思います。
【詳細】
まず、なにをどうやってリライトしたら良いのか?を知るために、Internal Rewrite Viewer というプラグインを入れて、wordperssがどんなリライトルールでURLを作っているか確認しました。
Internal Rewrite Viewer のインストールなどは以下参照。
★参考:WordPress Internal Rewrite Viewer | わーどぷれすっ!
で、Internal Rewrite Viewer を使用して、ページングを解決しているリライトルールを抜粋すると、私の場合、こんな感じで、出ました。
Wordpress Internal Rewrite Viewer Plugin by Dagon Design Array ( [blogs/blogcat/(.+?)/page/?([0-9]{1,})/?$] => index.php?blogcat=$matches[1]&paged=$matches[2] [blogs/(.+?)/page/?([0-9]{1,})/?$] => index.php?blogcat=$1&paged=$2 : (略) : )
このリライトルールは、こういったページングに関するURLを解決していますが
http://www.example.com/blogs/blogcat/diary/page/2
目的はこちらのURLで動いて欲しいので
http://www.example.com/blogs/diary/page/2
それにあわせて、独自のリライトルールを作成します。
[blogs/(.+?)/page/?([0-9]{1,})/?$] => index.php?blogcat=$matches[1]&paged=$matches[2]
★参考:WordPressのURLをhackする – 情報と音楽
参考サイトでも解説されていますが、 Internal Rewrite Viewer で表示された値を見ればわかるように、URL書き換えルールは連想配列で、キーが表向きのURL、値がindex.phpにパラメータが付いた形で定義されているので、それが、12行目の $newrules の部分にあたります。 これを function.php へ追加します。
add_filter('rewrite_rules_array','wp_insertMyRewriteRules'); add_filter('query_vars','wp_insertMyRewriteQueryVars'); add_filter('init','flushRules'); function flushRules(){ global $wp_rewrite; $wp_rewrite->flush_rules(); // リライトルールを再生成 } function wp_insertMyRewriteRules($rules) { $newrules = array(); $newrules['blogs/(.+?)/page/?([0-9]{1,})/?$'] = 'index.php?blogcat=$matches[1]&paged=$matches[2]'; return $newrules + $rules; // 新しいルールを追加 } function wp_insertMyRewriteQueryVars($vars) { array_push($vars, 'id'); // 変数idを追加 return $vars; }
最終的なソースコードは以下、参考にしました。
以上、参考になればと思います。
あとがき
よくある事ですが、カテゴリーを階層構造のパーマリンクにしたい場合、パーマリンクの設定をカスタム構造にし、
/%category%/%postname%/
という形で運営したい前提と考えると、URLに「category」と入ってしまうので、以下のように修正したくて、
- Before : http://www.example.com/category/seo/hoge
- After : http://www.example.com/seo/hoge
「WP No Category Base」というプラグインを入れるというのは有名ですね。
同様に、カスタム投稿タイプを使用するにあたり、カスタム分類(taxonomy)もカテゴリー階層構造のように扱いたいと思う時があります。
そういった場合に使うプラグインで「Custom Post Type Permalinks」というものが有名で、今回も採用したのですが、例えば、カスタム投稿タイプで投稿したシングルページのURLだと、このプラグインを使用すれば
- Before : http://www.example.com/hello
- After : http://www.example.com/blogs/diary/hello
といったような感じになって、これで万事OK!
・・・のはずが、今回、ページング(ページ送りやページネーションや改ページとも言われているもの)で、404になってしまうという現象が置きました。
例えば、
http://www.example.com/blogs/diary/page/2
とした場合、404になってしまうのですが、なんと、
http://www.example.com/blogs/page/2
http://www.example.com/blogs/blogcat/diary/page/2
などだったら、ちゃんとページングしてくれている。
ページングも、パーマりンクも一応ちゃんと動いてるには動いているということです。
プラグイン作者さんのページにも、それについての修正があってバージョンアップした形跡もあるようで・・。
★参考:Custom Post Type Permalinks 0.7.9.1をリリースしました@タクソノミーアーカイブでpage/2等が404になる
ただ、今回の私の場合は、404になってしまったので function.php にURLリライトを追加する事になりました。
カスタム投稿タイプは便利なのですが、ハマると本当にハマりますね。情報もそんな多くないですし。リライトのプラグインを他にも探したには探したのですが、あまり良さそうなものは無かったです。
URLリダイレクトのプラグインはあったんですけど、それじゃなぁ。。とモヤモヤしていました。
こういうのがプラグインに出来たらいいなぁと思うのですが、気力があれば作りたいと思います。