前の記事で検討した仕様に従い、まずは会員登録フォームを作成していきます。
会員登録の基本形
フォームのURLは固定ページで作成しましょう。固定ページのスラッグを entry とすると、固定ページテンプレート page-entry.php にフォームのHTMLを記載していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<form action="<?php the_permalink(); ?>" method="post"> <dl> <dt>お名前</dt> <dd> <input type="text" name="nickname" /> </dd> <dt>メールアドレス</dt> <dd> <input type="email" name="user_email" /> </dd> <dt>パスワード (半角6文字以上)</dt> <dd> <input type="password" name="user_pass" /> </dd> </dl> <button type="submit">登録</button> </form> |
そして、functions.php に処理を記載していきます。
処理が多くなるので、functions ファイルを分割するか、プラグインファイルとして作成しても良いでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
add_action( 'template_redirect', 'entry_init' ); function entry_init() { if ( ! is_page( 'entry' ) ) { return; } if (isset($_POST['nickname'])) { $user = array(); $user['user_login'] = 'user' . date( 'YmdHis' ) . sprintf( '%03d', mt_rand( 0,999 ) ); $user['user_pass'] = $_POST['user_pass']; $user['user_email'] = $_POST['user_email']; $user['nickname'] = $_POST['nickname']; $user['display_name'] = $_POST['nickname']; $user['role'] = 'contributor'; $inserted = wp_insert_user($user); } } |
フォームから受け取ったデータを元に、wp_insert_user() でユーザーを作成します。
user_login は重複が起こりにくいように、日時と乱数で生成しています。
role には、寄稿者 (contributor) を指定しています。
wp_insert_user() の引数(である配列のキー)には、wp_users テーブルの項目のほか、last_name, first_name, nickname など一部の user meta 項目も指定することができるので、氏名などはこのあたりの項目を使うと便利です。
wp_insert_user() で入れられない項目は、update_user_meta() を用いて登録することになります。
登録に成功した場合、$inserted には登録したユーザーのIDが入るので、これを引数に指定します。
また、名前を display_name にも入れておくと、the_auther() などの関数がこの値を返すようになるので、便利です。
会員登録フォームの実装
エラーチェックと、CSRF対策を追加します。
また、登録完了時には自動的にログインされるようにしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<form action="<?php the_permalink(); ?>" method="post"> <?php wp_nonce_field( 'entry', 'entry_nonce' ) ?> <?php if ( ! empty( $error['global'] ) ): ?><p><?php echo $error['global']; ?></p><?php endif; ?> <dl> <dt>お名前</dt> <dd> <?php if ( ! empty( $error['nickname'] ) ): ?><p><?php echo $error['nickname']; ?></p><?php endif; ?> <input type="text" name="nickname" value="<?php echo $value['nickname']; ?>" /> </dd> <dt>メールアドレス</dt> <dd> <?php if ( ! empty( $error['user_email'] ) ): ?><p><?php echo $error['user_email']; ?></p><?php endif; ?> <input type="email" name="user_email" value="<?php echo $value['user_email']; ?>" /> </dd> <dt>パスワード (半角6文字以上)</dt> <dd> <?php if ( ! empty( $error['user_pass'] ) ): ?><p><?php echo $error['user_pass']; ?></p><?php endif; ?> <input type="password" name="user_pass" /> </dd> </dl> <button type="submit">登録</button> </form> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
add_action( 'template_redirect', 'entry_init' ); function entry_init() { if ( ! is_page( 'entry' ) ) { return; } global $value, $error; $value = array( 'nickname' => '', 'user_email' => '', 'user_pass' => '' ); $error = array(); if ( isset( $_POST['entry_nonce'] ) ) { //nonceチェック if ( ! wp_verify_nonce( $_POST['entry_nonce'], 'entry') ) { $error['global'] = '不正な遷移です'; } else { //エラーチェック foreach ( $value as $key => $val ) { if ( isset( $_POST[$key] ) ) { $value[$key] = $_POST[$key]; } if ( $value[$key] === "" ) { $error[$key] = '必須項目です'; } else if ( $key == "user_email" && ! is_email( $value[$key] ) ) { $error[$key] = 'メールアドレスの形式が間違っています'; } else if ( $key == "user_email" && get_user_by( 'email', $value[$key] ) ) { $error[$key] = 'このメールアドレスは既に登録されています'; } else if ( $key == "user_pass" && strlen( $value[$key] ) < 6 ) { $error[$key] = '6文字以上で入力してください'; } } } if (empty($error)) { //登録実行 $user = array(); $user['user_login'] = 'user' . date( 'YmdHis' ) . sprintf( '%03d', mt_rand( 0,999 ) ); $user['user_pass'] = $_POST['user_pass']; $user['user_email'] = $_POST['user_email']; $user['nickname'] = $_POST['nickname']; $user['display_name'] = $_POST['nickname']; $user['role'] = 'contributor'; $inserted = wp_insert_user($user); if ( is_wp_error( $inserted ) ) { $error['global'] = $inserted->get_error_messages(); } else { //ログイン実行 $creds = array(); $creds['user_login'] = $user['user_login']; $creds['user_password'] = $user['user_pass']; $creds['remember'] = true; $user = wp_signon( $creds, false ); //完了ページへリダイレクト wp_safe_redirect( get_page_link( get_page_by_path( 'entry/thanks' )->ID ) ); } } } } |
CSRF対策には、お決まりの wp_nonce_field() または wp_create_nonce() と、wp_verify_nonce() を使います。
形式チェックに加えて、get_user_by() を用いて、同一のメールアドレスをもつユーザーが存在しないことをチェックします。
wp_insert_user() は、登録に失敗した場合、WP_Error オブジェクトを返すので、この場合もエラー扱いにします。
WP_Error オブジェクトは、is_wp_error() 関数によって判定することができ、get_error_codes() や get_error_messages() などによってエラー内容を取得することができます。
登録成功時の自動ログイン処理は wp_signon() を用いて行います。
ただし、WordPressがログイン認証を行うのは、 template_redirect アクションや init アクションよりも前なので、画面をリロードするかリダイレクトしないと、画面上はログイン状態になりません。
マイページを作成する場合は、マイページにリダイレクトする処理を入れるのも良いでしょう。