wordpressのサインアップフォームの仕様を変更してみる
マルチサイト環境でログインしていないユーザーにサイトの登録のみを許可する
不特定多数の人が利用できるブログ系インターネットサービスを構築することを想定してwordpressを利用している。
サインアップ画面では、ログインしていないユーザーが、新規にブログサイトを開設するためのフォームとして利用できるようにしたいのだが、wordpressのマルチサイトではその条件でユーザー登録フォームを構成することは標準ではできない。以下はマルチサイトの[ネットワークの設定]画面の一部。
未ログインユーザーにブログサイトの開設を許可するためには、一番下の
[新規サイトおよびユーザーアカウントの登録をどちらも許可する]
を選択することになる。それ以外のオプションでは未ログインユーザーに対してユーザー登録を許可することはできるが、ブログの登録は許可できない。
上のオプションを選択した状態で実際のサインアップフォーム(一部)は以下のようになる。
ユーザー名とメールアドレスを入力する欄のあるフォームなのだが、カスタマイズするのは赤枠の部分になる。
ラジオボタンで、
- サイトを作成
- ユーザー登録のみ
のどちらか一方をユーザーが選択できるようになっているが、開発しようとしているブログサービスでは、[サイトを作成]のみを許可したい。この部分をカスタムするためにwordpressのコアファイルを変更するのはおすすめできない。
カスタムしたい部分をコアファイルから探し出し前後にdo_actionとapply_filtersがないか確認
wordpress3.8だとユーザー登録関連の処理は
wp-signup.php
というコアファイルに記述されている。その中のsignup_userという関数内に今回カスタマイズしたい赤枠部分のHTMLが記述されている。本エントリーの最初の画像で示した、[新規登録の許可]オプションに従い$active_signupの値が変更されるようになっている。今回の場合だと、$active_signupの値はallに設定されており、その条件に従い該当するHTML(赤枠部分のHTML)を出力するようになっている。
この部分をblogに変更すれば、赤枠部分を非表示にできるだけでなく、値をhiddenで設定できるフォームが出力される。そのため、
$active_signupをall → blog
へ変更する処理をプラグインに記述すれば意図した状態になる。
$active_signupの条件分岐の前後を確認すると
do_action( 'signup_hidden_fields', 'validate-user' );
というカスタマイズポイントが用意されている。今回はこのsignup_hidden_fieldsにアクションを追加して$active_signupの値をカスタムしてみたい。
- do_actionに対してadd_action
- apply_filtersにadd_filter
という要領でwordpressはカスタマイズすることが可能。コアファイルを確認するといたる箇所にdo_actionとapply_filtersがセットされているので、カスタマイズしたい箇所の前後からそれらを探し出し、開発者自身がプラグインでactionとfilterを追加していくことで希望するwordpressを開発することができる。
値の変更処理はプラグイン内でシンプルに記述できる
変更内容とカスタマイズポイントが明確になれば、後はシンプルに作業をすることになる。今回の場合は変数の値変更なので以下のようになる。
プラグインのconstruct内にadd_actionを追加
add_action('signup_hidden_fields', array($this, 'change_active_signup'));
change_active_signupは以下のようにした。
function change_active_signup() { global $active_signup; $active_signup = 'blog'; }
マルチサイト全体を初期化するためのプラグインのベースについてはfunctions.phpではなくプラグインでマルチサイトを制御の記事を参考にしてほしい。
マルチサイト初期化プラグインに上記のカスタマイズを行うことでユーザー登録フォームから上の画像で示した赤枠部分をフォームの機能を損ねることなく非表示にすることができるようになった。