wordpressでサインアップ時に独自の値を設定する
signupとactivation
wordpressのマルチサイト機能を利用してブログサービスを開発しようとしている。
多言語対応のブログサービスにしたいので、ユーザー登録(ブログセットアップ)時にユーザー固有の言語情報を扱う必要がある。ユーザー登録は複数の画面で状態を維持しながら進行していくためsessionを利用して対応する予定であったが、アクティベーション時にルートドメインから個別のサブドメインURLへのリダイレクト処理が入るため、以下の要素を分けて考えることにした。
- signup
- activation
wordpressのユーザー登録は上の二つの要素をクリアすることで完了する。
当初、signup → activation間でsessionを維持する方向で検討していたが、signup時にユーザー毎のメタ情報を追加する方法があったので、そのメタデータ内で言語情報を扱いデータを永続化することにした。データを永続化した上で後にユーザーがactivationする方法になる。この方法の場合
signup → activation
の間でセッションを維持する必要がない。
add_signup_meta filter
ユーザーのサインアップ処理が行われると
wp_signups
というテーブルにユーザー情報が格納される。その後、ユーザーがアクティベーション処理を行うことでデータが有効になるのだが、このテーブルにmetaデータが格納されていて、標準では、
- lang_id
- public
という2つをkeyとする配列がシリアライズされた状態で保存されている。このmeta情報の中にsignup時に開発者が任意のデータを追加することができ、そのためのフィルターフックが、
add_signup_meta
になる。
ちなみに、lang_idというkeyは標準で1が設定されるようになっているのだが、このデータがwordpress内部で言語情報と関連しているかは不明である。webで検索してみたが、lang_idが1の場合はen_USで2だとes_ESということにはなっていないようだ。また、publicについては、検索エンジンのrobot制御に利用されている。
signupメタデータ追加方法
プラグイン内のconstructで以下のようにしてフィルターフックを定義する。
add_filter('add_signup_meta', array($this, 'signup_meta_lang') );
signup_meta_langという独自関数でメタデータに任意の言語情報を追加するコードを書く。
function signup_meta_lang( $meta ) { if( $_SESSION['WPLANG'] ) { $meta['language'] = $_SESSION['WPLANG']; } return $meta; }
上の方法でlanguageというkeyで新しいメタデータが追加される。
add_signup_metaは、データベーステーブルにデータを格納する直前にフックされているため、signup_meta_langのタイミングで任意のデータを格納することができる。
そして、メタデータとして登録した情報は、アクティベーション後に
wp_n_options
内でデータが永続化されることになっている。そのため、アクティベーション後は
$language = get_options('language');
という感じで任意に設定したデータにアクセスすることが可能となる。
ユーザー登録やブログの登録を独自のスキームにカスタマイズする際には有効な方法である。