Como fazer o login com e-mail apenas sem nome de usuário?

16

Depois de pesquisar por alguns dias e ler tópicos com 2 anos de idade, estou tendo dificuldades em encontrar uma solução para o problema de fazer com que os usuários façam login apenas por e-mail.

No começo, fiquei muito feliz em ver o WP_Email_Login apenas para descobrir que você ainda pode usar seu nome de usuário para fazer login. Não tenho certeza de como escrever isso como um plugin. Minha ideia é sobrepor a função register_new_user. Eu não vi isso na lista de funções "conectáveis". Posso usar filtros / ações para realizar isso?

Eu percebo que não está na moda editar os arquivos principais, então espero que a solução esteja disponível, mas se ela não existir, eu vou me arriscar. Na primeira linha da função "register_new_user" em wp-login.php eu posso adicionar:

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

Isso funciona muito bem, já que o WordPress não permite que as pessoas alterem seu nome de usuário. Na tela de registro (formulário), ele solicita o nome de usuário & O email; Eu gostaria de definir o nome de usuário para a variável Nickname (se alguém pode me dizer o que a variável de apelido é chamado ou onde é definido durante o registro que seria apreciado).

Felicidades,

Smith

    
por agentsmith666 09.05.2012 / 22:44

6 respostas

15

Atualização: Eu criei um plugin para login, registro e recuperar senha com e-mail. enlace

Responda, em resumo, você pode configurar o WordPress para fazer o login com e-mail.

Três etapas:

  • Remover a função de autenticação padrão
  • Adicionar função de autenticação personalizada
  • Alterar o texto "Nome de usuário" em wp-login.php para "E-mail"

Uma nota:

  • Não edite arquivos principais.

Remova a função de autenticação padrão do WordPress.

O WordPress usa o filtro " authenticate " para realizar uma validação adicional no login do usuário.

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

Adicione a função de autenticação personalizada

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

Mude o texto "Username" em wp-login.php para "Email"

Podemos usar o filtro gettext para alterar o texto "Username" para "Email" sem editar os arquivos principais.

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

Eu também escrevi um artigo detalhado no meu blog enlace

    
por Nishant Kumar 12.06.2014 / 15:59
5

É possível, você deve alterar o filtro para o nome.

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

Uma alternativa é um plugin, lá você encontra via Google oder no repositório de plugins; talvez este plugin .

    
por bueltge 10.05.2012 / 07:48
4

Usando o código acima:

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

Tudo o que precisávamos fazer era verificar se o nome de usuário fornecido parecia, pelo menos, um e-mail e, se não sabotássemos, o nome de usuário.

    
por Vigs 01.06.2013 / 02:34
3

já está em WP-CORE !

agora o wordpress já permite registrar o EMAIL como nome de usuário. mas se você estiver falando sobre usuários já registrados, tente as respostas listadas.

    
por T.Todua 17.07.2016 / 21:46
0

Pequenas modificações no código acima devem ser tudo o que é necessário para criar uma solução elegante. A documentação do gancho de autenticação indica que um objeto WP_User ou WP_Error deve ser retornado. / p>

O código fonte da função wp_authenticate_username_password é executado através de algumas verificações simples; podemos apenas replicar a maneira como essas verificações são feitas e criar um novo objeto WP_Error para lidar com o endereço de email. Alternativamente, poderíamos até usar o código wp_authenticate_username_password e modificá-lo se quiséssemos, embora isso pareça desnecessário, a menos que você realmente queira personalizar como as coisas funcionam. O código abaixo deve fazer o truque: (Embora eu não tenha testado isso sozinho ...)

// 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 );
}
    
por Andrew Odri 19.02.2014 / 20:31
0

Existe um plugin para isso:

Forçar login por e-mail

enlace

Também está no Github: enlace

    
por Lucas Bustamante 17.04.2018 / 16:29

Tags