wordpressのユーザー登録画面とブログ開設画面を多言語化する
マルチサイトへのブログ登録はルートドメインで行う
wordpressのマルチサイト構成では、開設したブログサイトのすべてに[登録]というユーザー登録のためのリンクを設置できるものの、
リンクをクリックするとルートドメインの登録画面にリダイレクトされる仕様になっている。つまりユーザー登録とブログ開設はルートドメインからすべてのユーザーが行うことになる。
単一言語であれば特に問題にならないが、ユーザー登録プロセスを多言語化しようとすると工夫が必要になってくる。各ブログの管理画面や個別のブログサイトの言語設定は、
wp_optionsテーブル → WPLANG
から設定値を取得するようになっているが、ユーザー登録の時点ではログインをしていないので、WPLANGの値を利用して該当する言語パックを取得するということができない。
locale filter hookでランタイム上で言語パックを切り替え可能
引数の渡し方
言語を特定する引数の渡し方はGET引数で行うようにしてみた。具体的には以下のようになる。
デフォルトURL
test.com/wp-signup.php
多言語対応URL
test.com/wp-signup.php?lang=en_US
langで言語を指定できるようにする方法になる。上の多言語対応URLを各ブログの[登録]リンクのリンク先にカスタマイズ方法については別のエントリーで取り上げようと思う。
セッション変数の利用設定
PHPのセッション変数を利用して複数存在するユーザー登録プロセスでlang引数のデータを継続して利用できるようにする。基本的な設定として、
wp-config.php
に以下の2行を先頭に追記した。
session_set_cookie_params (0 , '/', '.test.com'); session_start();
1行目の設定は、ドメイン間でセッションを維持するために必要になる。wordpressマルチサイトのユーザー・ブログ登録プロセスは、ルートドメインから個別のブログへと画面が遷移していくので、上の設定が必要になる。設定しないとアクティベーション時にサブドメインへレダイレクトする際にセッションが維持できず、結果としてlangで指定した言語で表示することができなくなる。
locale filter hook
localeフィルターフックを利用してランタイム上で言語を切り替える。
add_action('setup_theme', array($this, 'change_lang_signup'));
マルチサイト初期化プラグインのconstructでアクションを設定する。アクションのフック先はsetup_themeになる。initだと翻訳されずに表示されるので注意してほしい。change_lang_signupの内容は以下のとおり。
function change_lang_signup() { if( $_GET['lang'] or $_SESSION['WPLANG'] ) { add_filter('locale', array($this, 'get_language')); //ロケール情報の変更 } } function get_language() { //セッションで言語情報を持っていればその言語をセッションでもっていない場合はGET引数をセッションに格納してからreturn if( $_SESSION['WPLANG'] ) { } else { $_SESSION['WPLANG'] = $_GET['lang']; } return $_SESSION['WPLANG']; }
この方法でユーザー登録、およびブログ開設プロセスを翻訳することができる。