前回書いたように固定ページのパーマリンクの不具合が生じた。なぜこのような不具合が生じたかというとちょっと経緯がある。まず。SEO対策のためにパーマネントリンクにpostnameを使っている。WordPressのメニューの設定の中にあるパーマリンク設定のカスタム構造を設定することで可能になる。
実はWordPress2.7.1を使っている時に最初に/%postname%/.htmlとしたのだがリンクがおかしくなってしまった。Not Foundと表示されてリンクが見つけられない。ぐぐるとhttp://ja.forums.wordpress.org/topic/500で同じような現象を発見。そのためカスタム構造を/page/%postname%.htmlにした。そしてこれによりきちんとリンクができるようになった。また/%postname%/.htmlとしてしまうと投稿と固定ページの区別がつかなくなるのでこれは避けたほうが無難かもしれない(実際はプログラムで回避しているのかもしれません)。
WordPress2.86にアップデートしたらカスタム構造を/page/%postname%.htmlにしていると固定ページのリンクがおかしくなってしまった。Not Foundと表示される。試しにページを新規で作っても同じ。ちなみにパーマネントのデフォルトで設定されている数字ベースなどにすると問題ない。またパーマリンクを編集して半角にするとOKなことからバイト文字だとだめなようだ。例えば、http://hoge.com/page/あ.htmlとしてもだめ。これを半角にしてhttp://hoge.com/page/1.htmlとするときちんとページはリンクされる。
JGREP2.exeとWinMergeを使いながら原因を探っていく。postnameが関係していることからこれをキーに原因となるところを探すのだがこれに半日以上かかってしまった。だがやっと原因を発見、それはwp-includesフォルダーの中のrewrite.php。これを試しに2.7.1のものと置き換えたら、パーマリンクがきちんと動いた。さらに原因となるコードを探っていくと、wp_rewrite_rules() という関数が問題だと判明。
<WordPress 2.8.6>
function wp_rewrite_rules() {
$this->rules = get_transient(‘rewrite_rules’);
if ( empty($this->rules) ) {
$this->matches = ‘matches’;
$this->rewrite_rules();
set_transient(‘rewrite_rules’, $this->rules);
}
return $this->rules;
}
<WordPress 2.7.1>
function wp_rewrite_rules() {
$this->rules = get_option(‘rewrite_rules’);
if ( empty($this->rules) ) {
$this->matches = ‘matches’;
$this->rewrite_rules();
update_option(‘rewrite_rules’, $this->rules);
}
return $this->rules;
}
この部分を2.7.1のものに書き換えると固定ページのパーマリンク不具合は解消される。今後、この書き換えにて問題ないか見ていく必要があるが今のところはなんの問題もなし。
今回は備忘録として残しておくこととした。
ちなみに2.8.6にすることによる動作だが今のところは特に問題はない感じ。