HOME>WEBプログラム覚書>WordPressで会員サイト開発:Roleを指定してユーザー登録編

WordPressで会員サイト開発:Roleを指定してユーザー登録編

前回の「WordPressで会員サイト開発:Role追加編」の続きで、今回はRoleを指定してユーザー登録編

ユーザー登録

まずは利用者が3つの中から選択してユーザー登録できるようにする。

ユーザー登録までの流れ

大まかな流れはこんな感じ。

--------------------
ユーザー登録申請

アクティベートのためのメールが送られる

URLをクリック

アクティベート完了

指定のブログにユーザー追加
--------------------

セキュリティ的な問題はあるのだが、この流れ自体ははWordPressがやってくれるので ポイントポイントで、処理を追加してやればよい。今回は特にやることはない。

--------------------
ユーザー登録申請
↓・企業|クライアント|派遣労働者の選択
↓・バリデート

アクティベートのためのメールが送られる

URLをクリック

アクティベート完了

指定のブログにユーザー追加
--------------------

ユーザー登録申請 wp-signup.php

フォームのエレメント追加

ここではユーザー名とメールアドレスに加え、 企業|クライアント|派遣労働者の選択を追加する。

既定のユーザー名、メールアドレス入力エレメントを表示後に実行される 「signup_extra_fields」というアクションがあるので、 そこでフォームのエレメントを出力するとフォームに追加される。

PHP

  1. <?php
  2. /**
  3.  * ユーザー登録フォームに
  4.  * どの属性で登録するか選択するエレメントを追加
  5.  *
  6.  * @param WP_Error $errors
  7.  * @return $void
  8.  */
  9. function nncoRoleSelector($errors)
  10. {
  11.     echo '<label for="user_role">登録する属性を選択してください。</label>';
  12.  
  13.     if ( $errmsg = $errors->get_error_message('user_role') ) {
  14.         echo '<p class="error">' . $errmsg . '</p>';
  15.         $_checked = NncoRoles::findByDefaultChecked();
  16.     } else {
  17.         $_checked = isset($_POST['user_role']) ? $_POST['user_role'] : NncoRoles::findByDefaultChecked();
  18.     }
  19.  
  20.     foreach (NncoRoles::find() as $key => $value) {
  21.         printf('
  22.        <lable><input type="radio" name="user_role" value="%s"%s />%s</label>
  23.        ',
  24.         $key,
  25.         $key === $_checked ? ' checked' : '',
  26.         $value['name']
  27.         );
  28.     }
  29. }
  30. add_action('signup_extra_fields', 'nncoRoleSelector');
  31. ?>
実行結果

バリデート

「wpmu_validate_user_signup」フィルターがあるのでフックする。 invaildなデータだった場合、引数に取れる$resultのerrorsにエラーを追加すると エラーメッセージを表示することができる。

PHP

  1. <?php
  2. /**
  3.  * POSTされたロールのバリデート
  4.  * ms-functions.php wpmu_validate_user_signup()で呼ばれる
  5.  *
  6.  * @param Array $result
  7.  *                 'errors' => class WP_ERROR
  8.  *
  9.  * @return Array $result
  10.  */
  11. function wpmu_validate_user_signup_role($result)
  12. {
  13.     //$result = array('user_name' => $user_name, 'orig_username' => $orig_username, 'user_email' => $user_email, 'errors' => $errors);
  14.     // 管理画面から追加する場合、全ての権限を選択できる。
  15.     if (!is_admin()) {
  16.         if (!isset($_POST['user_role']) || !array_key_exists($_POST['user_role'], NncoRoles::find())) {
  17.             $result['errors']->add('user_role', __('ロールエラー'));
  18.         }
  19.     }
  20.     return $result;
  21. }
  22. add_filter('wpmu_validate_user_signup', 'wpmu_validate_user_signup_role');
  23. ?>
エラー時

エラーがなかった場合、ユーザーを追加するブログとRoleをmetaに入れる

PHP

  1. <?php
  2. function add_signup_meta_custom()
  3. {
  4.     $meta = array(
  5.         'add_to_blog' => 1,
  6.         'new_role'    => $_POST['user_role']
  7.     );
  8.     return $meta;
  9. }
  10. add_filter('add_signup_meta', 'add_signup_meta_custom');
  11. ?>

アクティベートのためのメール送信

ここでは特にやることはなし。メッセージは「wpmu_signup_user_notification()」で処理される。 メールのサブジェクト(wpmu_signup_user_notification_subject)、本文(wpmu_signup_user_notification_email)を変更するためのフィルターも存在している。

本文は

PHP

  1. <?php
  2. apply_filters( 'wpmu_signup_user_notification_email',
  3.             __( "To activate your user, please click the following link:\n\n%s\n\nAfter you activate, you will receive *another email* with your login.\n\n" ),
  4.             $user, $user_email, $key, $meta
  5.         )
  6. ?>

サブジェクトは

PHP

  1. <?php
  2. apply_filters( 'wpmu_signup_user_notification_subject',
  3.             __( '[%1$s] Activate %2$s' ),
  4.             $user, $user_email, $key, $meta
  5.         )
  6. ?>

という引数をフィルタで受け取れる。

アクティベート用のURLをクリック wp-activate.php

アクティベート用のURLにアクセスがあると wpmu_activate_signup($key)が実行される。

ここでアクティベートが成功すると、'wpmu_activate_user' または 'wpmu_activate_blog'フックが利用できる。 アクティベート時になにかしたい場合、これらをフックしてやればよい。ユーザー登録で利用するのはwpmu_activate_user

クリック後の流れは、wpmu_welcome_user_notification()でパスワードを送信。

次にadd_new_user_to_blog( $user_id, $user_email, $meta )が実行される。 ユーザーをどのブログに追加するか指定があれば、add_user_to_blog( $blog_id, $user_id, $role )が実行されここで 指定ブログに指定のRoleでユーザーが登録される。

add_new_user_to_blog( $user_id, $user_email, $meta )では$meta['add_to_blog'](追加するブログのID)が存在する場合、 add_user_to_blog( $blog_id, $user_id, $role )が実行される。このadd_user_to_blog()で実際に ユーザーを$roleでブログに登録する。ブログにユーザーが登録されると「add_user_to_blog」アクションが利用できる。

PHP

  1. <?php
  2. do_action('add_user_to_blog', $user_id, $role, $blog_id);
  3. ?>

処理がwpmu_activate_signup()に戻ってきて、アクティベート完了のwpmu_activate_userアクションが設定されるので フックすればここでも何かできる。

PHP

  1. <?php
  2. do_action('wpmu_activate_user', $user_id, $password, $meta);
  3. ?>

とりあえずこれで登録したroleでログインできるようになる。

ユーザー登録時にユーザー固有の情報を入力するための投稿を作成したいので このあたりを次回利用する。次回は登録時にカスタム投稿タイプで投稿する編の予定。

プラグインを有効にする場所

気のせいかもしれないけどwp-activate.phpはネットワークでプラグインを有効にしないと プラグインファイルを読み込んでくれないっぽい。 wp-signup.phpはサイトで有効にすればOKなのになんでwp-activate.phpはダメなんだ?

今回wp-signup.phpの処理の一部を追ってみたけどすごかった。 これをメンテナンスしてるってすごい。自分なら二度と手を入れること出来ないわw

ってか全体的にタブなのかスペース2つなのか4つなのか、if文の{}あったりなかったりとか WordPress開発者たちのアンチェインっぷりもすごい。

改めて自分には他人のソースを読む力が足りてないんだなと思いました。 これはいい修行になりそうです。

投稿日 2011年6月 7日 03:59
カテゴリ PHP
タグ WordPress
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1224

コメント

コメントする
Name
Email Address
URL