web-dev-qa-db-ja.com

ユーザー名なしでメールでログインするにはどうすればいいですか?

2、3日探して2年前のスレッドを読んだ後、私はユーザーに電子メールだけでログインさせるという問題の解決策を見つけるのが難しくなっています。

最初はWP_Email_Loginがあなたがまだログインにあなたのユーザー名を使うことができることを知るためだけに会えてうれしかったです。これをプラグインとして書く方法についてはよくわかりません。私の考えはregister_new_user関数を上書きすることです。私はこれを「プラグ可能な」機能リストには載っていませんでした。これを達成するためにフィルタ/アクションを使用できますか?

コアファイルを編集するのは流行ではないことに気付いたので、解決策があることを望んでいますが、もしそれが存在しなければ私のチャンスを享受します。 wp-login.phpの "register_new_user"関数の最初の行に、以下を追加できます。

$nickname_variable(??) = $user_login // set the nickname to the username
$user_login = $user_email; // set the user_login/username to the email address

WordPressはユーザーが自分のユーザー名を変更することを許可していないので、これは非常にうまく機能します。登録画面(フォーム)で、ユーザー名とEメールを要求します。ユーザー名をニックネーム変数に設定したい(ニックネーム変数が何であるか、または登録中に設定されている場所を教えてもらえれば幸いです)。

乾杯、

スミス

16
agentsmith666

更新: ログイン用のプラグインを作成し、登録し、電子メールでパスワードを取得します。 https://wordpress.org/plugins/smart-wp-login/ /

要するに、あなたは電子メールでログインするようにWordPressを設定することができます。

3つのステップ:

  • デフォルトの認証機能を削除
  • カスタム認証機能を追加
  • Wp-login.phpのテキスト「Username」を「Email」に変更します。

1つの注:

  • コアファイルを編集しないでください。

WordPressのデフォルト認証機能を削除します。

WordPressは " authenticate "フィルタを使用してユーザーログイン時に追加の検証を実行します。

remove_filter('authenticate', 'wp_authenticate_username_password', 20);

カスタム認証機能を追加

add_filter('authenticate', function($user, $email, $password){

    //Check for empty fields
    if(empty($email) || empty ($password)){        
        //create new error object and add errors to it.
        $error = new WP_Error();

        if(empty($email)){ //No email
            $error->add('empty_username', __('<strong>ERROR</strong>: Email field is empty.'));
        }
        else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //Invalid Email
            $error->add('invalid_username', __('<strong>ERROR</strong>: Email is invalid.'));
        }

        if(empty($password)){ //No password
            $error->add('empty_password', __('<strong>ERROR</strong>: Password field is empty.'));
        }

        return $error;
    }

    //Check if user exists in WordPress database
    $user = get_user_by('email', $email);

    //bad email
    if(!$user){
        $error = new WP_Error();
        $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
        return $error;
    }
    else{ //check password
        if(!wp_check_password($password, $user->user_pass, $user->ID)){ //bad password
            $error = new WP_Error();
            $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
            return $error;
        }else{
            return $user; //passed
        }
    }
}, 20, 3);

Wp-login.phpのテキスト「Username」を「Email」に変更します。

gettext filterを使用して、コアファイルを編集せずにテキスト "Username"を "Email"に変更できます。

add_filter('gettext', function($text){
    if(in_array($GLOBALS['pagenow'], array('wp-login.php'))){
        if('Username' == $text){
            return 'Email';
        }
    }
    return $text;
}, 20);

私は私のブログで詳細な記事を書きました http://www.thebinary.in/blog/wordpress-login-using-email/ /

15
Nishant Kumar

それは可能です、あなたは名前のフィルタを変更しなければなりません。

// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// add custom filter
add_filter( 'authenticate', 'fb_authenticate_username_password', 20, 3 );
function fb_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) )
        $user = get_user_by( 'email', $username );

    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
}

別の方法はプラグインで、そこではプラグインレポジトリの中でGoogle oderを通して見つけます。多分 このプラグイン

5
bueltge

上記のコードを使用する:

// Change login credentials
// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// add custom filter
add_filter( 'authenticate', 'my_authenticate_username_password', 20, 3 );
function my_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) ) {
        //if the username doesn't contain a @ set username to blank string
        //causes authenticate to fail
        if(strpos($username, '@') == FALSE){
                $username = '';
            }
        $user = get_user_by( 'email', $username );
        }
    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
} 

私たちがしなければならなかったのは、提供されたユーザー名が少なくともEメールのように見え、そうでなければユーザー名をSabotageすることだけでした。

4
Vigs

すでにWP-COREに入っています。

今ワードプレスはすでにユーザー名としてEMAILを登録することができます。あなたがすでに登録済みのユーザーについて話しているのであれば、その後、記載されている答えを試してみてください。

3
T.Todua

上記のコードを少し修正するだけで、洗練されたソリューションを作成できます。 authenticateフックのドキュメントWP_UserオブジェクトかWP_Errorオブジェクトのどちらかが返されるべきであると述べています。

wp_authenticate_username_password関数のソースコード は、いくつかの非常に単純な検査を経て実行されます。これらのチェックが行われた方法を複製して、Eメールアドレスを処理するための新しいWP_Errorオブジェクトを作成するだけです。代わりに、wp_authenticate_username_passwordコードをジャックして、必要ならばそれを修正することさえ可能ですが、実際に物事がどのように機能するかをカスタマイズしたいのでなければ不要です。以下のコードでうまくいくはずです。(私は自分でテストしていませんが…)

// Remove the default authentication function
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );

// Add the custom authentication function
add_filter( 'authenticate', 'custom_authenticate_username_password', 20, 3 );

function custom_authenticate_username_password( $user, $username, $password ) {

    // Get the WP_User object based on the email address
    if ( ! empty( $username ) ) {
        $user = get_user_by( 'email', $username );
    }

    // Return a customized WP_Error object if a WP_User object was not be returned (i.e. The email doesn't exist or a regular username was provided)
    if ( ! $user ) {
        return new WP_Error( 'invalid_username_email', sprintf( __( '<strong>ERROR</strong>: Invalid username. Please log in with your email address. <a href="%s" title="Password Lost and Found">Lost your password</a>?' ), wp_lostpassword_url() ) );
    }

    // Hand authentication back over to the default handler now that we a have a valid WP_User object based on the email address
    return wp_authenticate_username_password( null, $username, $password );
}
0
Andrew Odri

そのためのプラグインがあります。

メールログインを強制する

https://br.wordpress.org/plugins/force-email-login/ /

Githubにもあります: https://github.com/miya0001/force-email-login

0