• 【WordPress】2ページ目が404NotFound!TaxonomyのページングでURLをリライトする

taxonomy pagenation 404

ページング処理を追加した時、パーマリンクをカスタム構造にしていると、よくありがちな事ですが、page/2になると、404になってしまうという現象に遭遇する時があります。今回、私はカスタム投稿タイプでのページングでその現象が現れました。


1.5日ほど悩んだ結果、プラグインも色々探しましたが、結局、function.phpにURLリライト処理を書くことで解決しました。

 

以下、その内容を紹介します。

 

【前提】

  • カスタム投稿タイプ名  : [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;
}

最終的なソースコードは以下、参考にしました。

★参考:関数リファレンス/WP Rewrite

以上、参考になればと思います。

 

 

 

あとがき

よくある事ですが、カテゴリーを階層構造のパーマリンクにしたい場合、パーマリンクの設定をカスタム構造にし、

 /%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リダイレクトのプラグインはあったんですけど、それじゃなぁ。。とモヤモヤしていました。

 

こういうのがプラグインに出来たらいいなぁと思うのですが、気力があれば作りたいと思います。

 

 

Clip to Evernote
このエントリーをはてなブックマークに追加