ユーザー名なしでメールのみでログインする方法は?


20

数日間検索して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ではユーザーがユーザー名を変更できないため、これは非常にうまく機能します。登録画面(フォーム)で、ユーザー名と電子メールを要求します。ユーザー名をニックネーム変数に設定したいと思います(ニックネーム変数が何と呼ばれているのか、登録中にどこに設定されているのかを教えていただければ幸いです)。

乾杯、

スミス


ユーザー名を完全に廃止しようとしていますか?メールログインプラグインが機能しないのはなぜですか?
ライアン

ユーザー名を廃止する理由は、WordPressのすべてのユーザー情報の基礎となっているためです。これは、Postsを廃止しようとするようなものです-それほど多くの見返りを求めずに多くの作業を行い、今後の問題を保証します。
シックヒッピー

1
@ Ryan-ユーザー名を削除することはできないと思うので、代わりにユーザー名をメールアドレスと等しくするように強制しています。
agentsmith666

@SickHippie-ログインの場合、メールはユーザー名よりも優れていてユニークだと思います。ユーザーが投稿するときにニックネームとしてユーザー名を使用したいです。確かに、変数 "username"を "rid"するのは苦痛です。だから私はそうではありません。ユーザーの登録時にユーザーのユーザー名を選択するだけです(ユーザー名はメールアドレスになり、ニックネームはユーザー名として入力したものになります)。結局、変数は失われず、すべてがそのままです。
agentsmith666

1
@SickHippie-Wordpressのデフォルトではユーザーがユーザー名を変更できないようにしているため、ユーザーの連絡先メールアドレスを変更してもユーザー名/メールアドレスは同じままです。私は最初から考えていましたが、私自身の経験では、人々がメールアドレスを「削除」することはめったにありません。彼らは新しいものを入手するかもしれませんが、通常はまだ古いものを持っています。そして、おそらくこれらのまれな状況ではない場合は、データベースで手動で変更します。SickHippieからのフィードバックと洞察に本当に感謝しています!今、私は私の投稿の解決策を期待しています:)
agentsmith666

回答:


19

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

要するに、メールでログインするようにWordPressを設定できます。

3つのステップ:

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

1つの注:

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

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

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

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フィルターを使用して、コアファイルを編集せずにテキスト「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/にも詳細な記事を書いています。


2
ニースの答えNishant
アンドリュー・バーテル

有用!私の場合、メールの特殊文字を削除して、ユーザー名にします。したがって、user @ example.comはuser_example_comになり、機能しました。
wpcoder

6

名前のフィルターを変更する必要があります。

// 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 );
}

代替手段はプラグインです。Googleoder経由でプラグインリポジトリにあります。多分このプラグイン


返信いただきありがとうございます。しかし、あなたが私の投稿を読んだかどうか、または私が十分に明確でなかったかどうかはわかりません。後者については謝罪します。私の最初の投稿で、WP_Email_Loginプラグインに言及しました。コードとリンクの正確なプラグイン。元の投稿は次のとおりです。「最初は、WP_Email_Loginが表示されて、ログインにユーザー名を使用できることを確認できたことが嬉しかったです。」<---まだユーザー名を使用できる問題を確認してください。そのため、このプラグインは機能しません。ユーザー名をなくすことはできないので、ユーザー名を電子メールアドレスと等しくすることで登録機能をオーバーライドすることを考えています。
agentsmith666

ただし、コアファイルを編集せずにこれを実現する方法を探しています。それが不可能な場合、それは結構ですが、私はどちらかの方法を知りたいです。ありがとう!
agentsmith666

これは、コアファイルを編集しない方法です。プラグインのコードをコピーし、アクティベートして準備をします。
-bueltge

4

上記のコードを使用:

// 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 );
} 

私たちがしなければならないことは、少なくとも提供されたユーザー名が電子メールのように見えることを確認し、そうでない場合はユーザー名を妨害することでした。


むしろのための原始的な文字列のチェックよりも'@'ユーザー名で、Wordpressのは、組み込みの機能を持って便利:sanitize_emailは、有効なメールアドレス形式または何もどちらかを返します:sanitize_email('email¬!"@business_com'); // Returns nothing
indextwo

3

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

現在、wordpressはすでにEMAILをユーザー名として登録することを許可しています。ただし、すでに登録済みのユーザーについて話している場合は、リストされている回答を試してください。


1

エレガントなソリューションを作成するために必要なのは、上記のコードをわずかに変更することだけです。認証フックドキュメントにはWP_UserオブジェクトまたはWP_Errorオブジェクトを返す必要があることが記載されています。

wp_authenticate_username_password関数ソースコードは、非常に単純なチェックをいくつか実行します。これらのチェックの実行方法を複製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 );
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.