WordPress

WordPress数字4桁で404ページに飛ぶ問題

以前WordPressサイトカスタマイズの件でちょっと悩んだ数字4桁問題について書いてみる。

現象:数字4桁のスラッグにした時に対象ページが404ページになる

WordPressは管理画面から「パーマリンクの設定」という項目があり、URLのドメイン以降の部分の指定ができるようになっています。
その部分で投稿名をベースにパーマリンクを設定した場合、
http://ohoho.com/%postname%/
みたいにしていた場合、ページによっては正しく表示されずに404ページになってしまう現象が起こった。

解説

これを調査した所、どうも数字4桁をスラッグに登録している場合は404ページに飛ぶようになっているらしく、404ページに行ってしまうページのスラッグにアルファベット1文字でも追加すると正しく表示されるようになった。

WordPressにはリライトルールというものがあります。それは
/index.php?p=123
で表示される情報を
/p/123/
でも表示させなさいよ~というルールです。
リライトルールについてここが分かりやすい

で、今回の数字4桁問題の場合、パーマリンクを、
http://ohoho.com/index.php?p=投稿ID
で表示される情報を
http://ohoho.com/投稿名(スラッグ)/
でも表示されるようにしなさいよ~っていう風に設定していた場合404ページに飛んでいってしまう。

WPでは
デフォルトでも色々なリライトルールが設定してあり、その中に
http://ohoho.com/2015/05/sample-post/
ってな感じで年別・月別にアーカイブページを作成してくれる機能があります。

Rewrite Rules Inspector多分この絡みで年のリライトルールが優先されているんだろうなと思いRewrite Rules Inspectorというプラグインを入れて確認してみた。
(↑はい!これ便利)
このプラグイン、有効化すると「ツール」→「Rewrite Rules」で、現在のサイトにはどの様なリライトルールが設定されているのかを一覧にして教えてくれます。

そのリライトルールで見つけた、はいこの部分!
数字4桁で年月アーカイブページを表示するリライトルール
数字4桁のスラッグを指定した場合、見事にこのルールに引っかかります。

つまりWPは数字4桁だと
http://ohoho.com/2015/
と同じように解釈して、
http://ohoho.com/5025/
と、5025年に書いた記事の一覧を表示してくれようとしてくれているのです!

で、当然そんなページは無いですので、まぁしゃあねぇかと404ページを表示してるんですね~
人間ならわかるのにっ!!
自分で勝手に馬鹿やって1人で落ち込んでいるような状態です。
もぅ~WPったらプログラムなんだから~ん(●´艸`)ヾ
って感じです。

だからWPでスラッグを数字4桁にしちゃそもそもダメなんですね。

解決策

今更スラッグ変えられね~よっ!って場合の対応策は下記。
下記コードを使用中のfunction.phpに追記。

さっき見つけた数字4桁だったら年別アーカイブを表示しなさいよ~ってリライトルールを消しちゃってくださいという命令です。

function CustomRewriteRules($rules) {  //パラメーター:他のリライトルール全部の配列
	//  $rules の中は配列で
	//  $rules['当てはまる正規表現'] = index.php?year=$matches[1](表示したいページの本当の姿)
	//  の形になっているので、該当の配列を削除                                      
	unset($rules['([0-9]{4})/?$']); 
	return $rules;
}
add_filter('rewrite_rules_array','CustomRewriteRules');  //リライトルールが作成された時にCustomRewriteRules関数を呼び出しなさい

上記のやり方で数字4桁のスラッグを指定しているページも正しく表示されるようになりました。
今度は年月アーカイブのページが見られなくなっちゃいますけど、ブログ以外にWPを使用している場合は年月アーカイブはあまり必要では無かったりするので、それであればこれでOK!

上記を追加した後は、忘れずにパーマリンクを再更新してください。

著者