前回に続いて、ログインフォームを作成していきます。
ログインの基本形
ログインページのURLは、前回同様固定ページで作成します。
固定ページのスラッグを login とすると、page-login.php にフォームのHTMLを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<form action="<?php the_permalink(); ?>" method="post"> <dl> <dt>メールアドレス</dt> <dd> <input type="email" name="user_email" /> </dd> <dt>パスワード</dt> <dd> <input type="password" name="user_pass" /> </dd> </dl> <button type="submit">ログイン</button> </form> |
続いて functions.php 等に処理を記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
add_action( 'template_redirect', 'login_init' ); function login_init() { if ( ! is_page( 'login' ) ) { return; } $user = get_user_by( 'email', $_POST['user_email'] ); $creds = array(); $creds['user_login'] = $user->data->user_login; $creds['user_password'] = $_POST['user_pass']; $creds['remember'] = true; $user = wp_signon( $creds, false ); } |
ログイン処理には、 wp_signon() を用いますが、
今回はメールアドレスでログインさせるため、一旦メールアドレスをもとに get_user_by() でユーザー情報を取得し、取得したログインID (user_login) と入力されたパスワードでログインを実行します。
実践的なログインフォーム
入力チェックとエラー処理、CSRF対策、ログイン成功時のリダイレクト処理を加えると、以下のようになります。
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"> <?php wp_nonce_field( 'login', 'login_nonce' ) ?> <?php if ( ! empty( $error ) ): ?><p><?php echo $error; ?></p><?php endif; ?> <dl> <dt>メールアドレス</dt> <dd> <input type="email" name="user_email" value="<?php echo $email; ?>" /> </dd> <dt>パスワード</dt> <dd> <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 |
add_action( 'template_redirect', 'login_init' ); function login_init() { if ( ! is_page( 'login' ) ) { return; } global $email, $error; $email = ""; $error = ""; if ( isset( $_POST['login_nonce'] ) ) { //nonceチェック if ( ! wp_verify_nonce( $_POST['login_nonce'], 'login') ) { $error .= '不正な遷移です'; } else { //入力チェック if ( ! empty( $_POST['user_email'] ) ) { $email = $_POST['user_email']; } else { $error .= "メールアドレスを入力してください"; } if ( ! empty( $_POST['user_pass'] ) ) { $password = $_POST['user_pass']; } else { $error .= "パスワードを入力してください"; } } if ( ! $error ) { //ユーザー取得 $user = get_user_by( 'email', $email ); if ( false === $user ) { $error .= "メールアドレスが間違っています。"; } else { //ログイン実行 $creds = array(); $creds['user_login'] = $user->data->user_login; $creds['user_password'] = $password; $creds['remember'] = true; $user = wp_signon( $creds, false ); if ( is_wp_error( $user ) ) { if ( array_key_exists( 'incorrect_password', $user->errors ) ) { $error .= "パスワードが間違っています。"; } else { $error .= "ログインに失敗しました。"; } } else { //リダイレクト wp_safe_redirect( home_url() ); } } } } } |
会員(寄稿者)ユーザーにADMINバーを表示させない
会員ユーザーもWordPressのユーザーで作成しているため、このままだとログイン後は管理者と同じADMINバーが表示されてしまいます。
そのため、寄稿者 (contributor) の場合はADMINバーが非表示になるよう、functions.php 等で以下のようにフックを登録します。
1 2 3 4 5 |
add_filter( 'show_admin_bar' , 'hide_admin_bar' ); function hide_admin_bar( $content ) { return ( current_user_can( 'publish_posts' ) ? $content : false ); } |
判定の方法はいくつか考えられますが、ここでは publish_post (投稿を公開する) 権限をもつかどうかで判定しています。
つまり、管理者、編集者、投稿者にはADMINバーが表示され、寄稿者、購読者には表示されないという設定です。
会員(寄稿者)ユーザーを管理画面に入れない。
ADMINバーを非表示にしても、WordPressの管理画面のURLに直接アクセスされると、ログイン状態であれば閲覧できてしまいます。
寄稿者 (contributor) であれば管理画面にアクセスもできないように、以下のようにフックを登録します。
1 2 3 4 5 6 7 8 9 |
add_action( 'auth_redirect', 'contributor_redirect' ); function contributor_redirect( $user_id ) { $user = get_userdata( $user_id ); if ( ! $user->has_cap( 'publish_posts' ) ) { wp_redirect( home_url() ); exit(); } } |