$_SERVER[‘REQUEST_URI’]をWordPressがWPのQueryが読み込む前に書き換えればいいと思います
ざっくり分けて、二つの作業があります。
- get_permalink等パーマリンク出力時にフィルターして、http://sample.com/ja/aaa/bbb/ というリンクを出力できるようにする
- http://sample.com/ja/aaa/bbb/ を内部で解釈出来るようにする
の二つの重たーい作業があります。
get_permalink等パーマリンク出力時にフィルターして、http://sample.com/ja/aaa/bbb/ というリンクを出力できるようにする
パーマリンクの出力は、なんてことはないです。現在のロケールを取得し、その値に応じて、URLを書き換えるだけです。home_url
を書き換えるのが一番手軽です。パーマリンクの出力時にはこの関数が噛んでいるので。ただし、それだと仕様上面倒くさいことも想定されたりするので、その場合は、post_link
, page_link
, post_type_link
等に対し、個別に対応していく必要があります。
また、post_link
, page_link
等については、プレビュー機能などもありますので、そこでURLの変更がかからないように手を打つ必要があります。
とりあえずここまで。
http://sample.com/ja/aaa/bbb/ を内部で解釈出来るようにする
ざっくりとしたことを書きますが、rewrite_rules_array
というフィルターが WP_Rewrite::rewirte_rules に存在します。ここのフィルターですべてのリライトルールが入った配列に対してフィルター出来るので、それを用いて、各言語ごとのスラッグを足したリライトルールを追加してしまうのが、一番簡単かなとは思います。
'page/?([0-9]{1,})/?$' => 'index.php?&paged=$matches[1]'
みたいなルールがあった場合、
'ja/page/?([0-9]{1,})/?$' => 'index.php?&paged=$matches[1]&lang=ja'
みたいなルールを追加してしまうと言うことです。
リライトルール自体は確か前方一致だったはずなので、既存のルールの前に突っ込むような方がエラーが少ない気がします。
対応する言語が多い場合は、正規表現なども使わないと配列が巨大になってパフォーマンスに関わる気がしますので、また別の対応が必要かもです。
Bogo — WordPress Plugins
の、includes/link-template.php と includes/rewrite.php が参考になります。