SimpleTaggingプラグインとの相性の悪さから、Gengo設定の「Gengo should append language codes to permalinks automatically.」をOFFにしているが、この設定におけるGengoの不具合発覚。

l10 helperプラグインは英日2言語を用意しているが、一方のページから他方の翻訳版リンクをクリックすると404エラーが発生。おかしい。

調べてみると、localeフィルタ関数内でページ名からロケールを判定する部分に甘さがあった。

Index: gengo.php
===================================================================
--- gengo.php   (revision 80)
+++ gengo.php   (working copy)
@@ -1222,7 +1222,7 @@
  } else {
    $value = $parser->query_vars['pagename'];
    if (($position = strpos($parser->query_vars['pagename'], '/')) !== false) {
-     $value = substr($value, $position + 1);
+     $value = substr($value, 0, $position);
    }
    $where = "p.post_name = '$value'";
    $join = "INNER JOIN $wpdb->posts AS p ON p.ID = p2l.post_id";

当該ページは英日ともに多階層構造になっていて、各相対リンクはこう:

software/wordpress-plugins/l10n-helper.html    <英>
software_ja/wordpress-plugins/l10n-helper.html <日>

上記変更前のコードで $value に代入される値はこう:

wordpress-plugins/l10n-helper.html <英>
wordpress-plugins/l10n-helper.html <日>

$wpdb->posts.post_nameには1階層分しか登録されてないのに修正前は2階層取得してしまっている。さらに最初の階層(software/software_ja)さえ異なっていれば以降の階層では同一名が使えるようになっているWordPressの仕様も考慮されていない。

ということで、最初の階層部分のみを取り出すようにコードを修正した。

…あ、これはキャッシュと関係なかったか。