사용자 이름없이 이메일로 로그인하는 방법은 무엇입니까?


20

며칠 동안 검색하고 2 년 된 스레드를 읽은 후 사용자가 전자 메일로만 로그인하는 문제에 대한 해결책을 찾는 데 어려움을 겪고 있습니다.

처음에는 WP_Email_Login을보고 기뻐서 사용자 이름을 사용하여 로그인 할 수 있다는 것을 알게되어 기뻤습니다. 이것을 플러그인으로 작성하는 방법을 잘 모르겠습니다. 내 생각은 register_new_user 함수를 재정의하는 것입니다. "pluggable"기능 목록에서 이것을 보지 못했습니다. 필터 / 액션을 사용하여이 작업을 수행 할 수 있습니까?

핵심 파일을 편집하는 것이 유행이 아니라는 것을 알고 있으므로 해결책이 없기를 바랍니다.하지만 존재하지 않는 경우 기회를 잡을 것입니다. 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에서는 사람들이 자신의 사용자 이름을 변경할 수 없기 때문에 이것은 아주 잘 작동합니다. 등록 화면 (양식)에서 사용자 이름 및 이메일을 요청합니다. 사용자 이름을 닉네임 변수로 설정하고 싶습니다 (다른 사람이 닉네임 변수가 무엇인지 또는 등록 중에 설정 된 위치를 알려 줄 수 있다면).

건배,

스미스


사용자 이름을 완전히 없애려고합니까? 왜 이메일 로그인 플러그인이 작동하지 않습니까?
Ryan

사용자 이름이 WordPress의 모든 사용자 정보의 기초이기 때문에 사용자 이름을 없애고 싶은 이유가 정말 궁금합니다. Posts를 없애려고 노력하는 것과 같습니다. 많은 보수를받지 않고 많은 일을하고 길 아래의 문제를 보장합니다.
SickHippie

1
@ Ryan- 나는 사용자 이름을 제거 할 수 없다고 생각하므로 사용자 이름을 이메일 주소와 동일하게 강제합니다.
agentsmith666

@SickHippie-로그인 이메일은 사용자 이름보다 낫고 독창적이라고 생각합니다. 오히려 사용자가 게시 할 때 사용자 이름을 닉네임으로 사용하고 싶습니다. 당신은 옳습니다. 변수 "username"을 "제거"하는 것이 고통스럽기 때문에 이것이 아닙니다. 등록 할 때 사용자의 사용자 이름을 선택하고 있습니다 (사용자 이름은 전자 메일 주소가되고 별명은 사용자 이름으로 입력 한 이름이됩니다). 결국 모든 변수가 손실되지 않습니다.
agentsmith666

1
@SickHippie-Wordpress의 기본값은 사용자가 자신의 사용자 이름을 변경하도록 허용하지 않기 때문에 맞습니다. 연락처 이메일 주소를 변경하더라도 사용자 이름 / 이메일 주소는 동일하게 유지됩니다. 처음부터 본인의 경험에 의하면 사람들이 이메일 주소를 거의 "삭제"하지 않는 것으로 나타났습니다. 그들은 새로운 것을 얻을 수도 있지만 일반적으로 여전히 오래된 것을 가질 것입니다. 그리고 드문 상황이 아닌 경우 데이터베이스에서 수동으로 변경합니다. 귀하의 의견과 통찰력 SickHippie에 감사드립니다. 지금은 :) 내 게시물에 대한 솔루션에 대한 희망
agentsmith666

답변:


19

업데이트 : 로그인, 등록 및 이메일로 비밀번호 검색을위한 플러그인을 만들었습니다. https://wordpress.org/plugins/smart-wp-login/

간단히 말해, 이메일로 로그인하도록 WordPress를 구성 할 수 있습니다.

세 단계 :

  • 기본 인증 기능 제거
  • 맞춤 인증 기능 추가
  • wp-login.php의 "Username"텍스트를 "Email"로 변경

하나의 참고 사항 :

  • 핵심 파일을 편집하지 마십시오.

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
Andrew Bartel

유능한! 내 경우에는 이메일 특수 문자를 제거하고 사용자 이름으로 만듭니다. 그래서 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 );
}

대안은 플러그인이며, 플러그인 저장소에서 Google oder를 통해 찾을 수 있습니다. 어쩌면 이 플러그인 .


답장을 보내 주셔서 감사하지만 내 게시물을 읽었는지 또는 명확하지 않은지 확실하지 않습니다. 후자에 대해 사과드립니다. 원래 게시물에서 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!

이제 워드 프레스는 이미 사용자 이름으로 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.