web-dev-qa-db-ja.com

登録後の自動ログイン

登録フォームに記入した後に送信されるEメールのリンクをクリックすると、ユーザー名とパスワードを入力せずにユーザーが自動的にログインするようにします。

どうやってやるの?

1
user3055211

これが基本的なアプローチです。

まず、ユーザーをログインさせるために使用できるユーザー情報をリンクに渡す必要があります。これを行うには、ユーザー宛ての電子メールをフィルタリングする必要があります。 (実際にはカスタムの新規ユーザー登録Eメールをロードすることは可能ですが、その機能はプラグ可能な機能であるため、これはプラグインとして実行する必要があります。登録メールの場合)

//登録メール本文にフィルタを追加

add_filter( 'wp_mail', 'set_up_auto_login_link' );

function set_up_auto_login_link( $atts ) {

    // if the email subject is "Your username and password"
    if ( isset ( $atts ['subject'] ) && $atts['subject'] = 'Your username and password' ) {
        if ( isset( $atts['message'] ) ) {

            $old = '/wp-login.php';
            $new = '/wp-login.php?user=' . $_POST['user_login'];

            $atts['message'] = str_replace( $old, $new, $atts['message'] );
        }
    }
    return $atts;
}

これにより、登録フォームから選択されたユーザー名がログインリンクに追加されたクエリ文字列の形式で電子メールに送信されます。そのユーザー名は、ユーザーがリンクをクリックしたときにログインするために使用できます。

これを行うために、私はinitアクションに夢中になりました。これはクエリ文字列内の "user"パラメータをチェックします。存在する場合は、get_user_byを使用して、ユーザー名でユーザーデータを取得します(ログイン)。それが有効なユーザーを返す場合、ユーザー名と取得したユーザーIDを使用してユーザーをログインさせることができます。

add_action( 'init', 'log_user_in' );
function log_user_in() {
    if ( isset( $_GET['user'] ) ) {

        // get the username from the URL
        $user_login = $_GET['user'];

        // get the user data (need the ID for login)
        $user = get_user_by( 'login', $user_login );

        // if a user is returned, log them in
        if ( $user && ! user_can( $user->ID, 'manage_options' ) ) {
            wp_set_current_user( $user->ID, $user_login );
            wp_set_auth_cookie( $user->ID );
            do_action( 'wp_login', $user_login );
            wp_redirect( home_url() );
            exit();
        }
    }
}

有効なユーザ名を持つ人なら誰でもそのユーザとしてログインできるので、このプロセスでは本当のセキュリティは得られません。ログインしているユーザーが管理者でないことを確認するためのチェックを行います(user_can( 'manage_options'))。そうしないと、管理ユーザーログインを持つユーザーがアクセスできる可能性があります。追加のチェックを組み込むのが賢明でしょう - おそらくリンクに追加するためのキーやハッシュを作成します。これは登録時に行われ、ユーザーの検証に使用される可能性があります。

1
butlerblog