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

20

Após pesquisar por alguns dias e ler os tópicos de 2 anos, estou tendo dificuldade em encontrar uma solução para o problema de ter os usuários logados apenas por email.

No começo, fiquei encantado ao ver WP_Email_Login apenas para descobrir que você ainda pode usar seu nome de usuário para fazer login. Não sei como escrever isso como um plugin. Minha idéia é substituir a função register_new_user. Eu não vi isso na lista de funções "conectáveis". Posso usar filtros / ação para fazer isso?

Sei que não está na moda editar os arquivos principais, por isso espero que exista uma solução, no entanto, se não existir, vou me arriscar. Na primeira linha da função "register_new_user" no wp-login.php, 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), solicita o nome de usuário e o email; Eu gostaria de definir o nome de usuário para a variável apelido (se alguém puder me dizer como é chamada a variável apelido ou onde é definida durante o registro, isso seria apreciado).

Felicidades,

Smith

agentsmith666
fonte
Você está tentando eliminar completamente os nomes de usuário? Por que o plug-in de login por email não funciona para você?
Ryan
Estou realmente curioso para saber por que você quer acabar com os nomes de usuário, pois essas são a base de todas as informações do usuário no WordPress. É como tentar acabar com as Postagens - muito trabalho sem muito retorno e uma garantia de problemas futuros.
SickHippie
1
@ Ryan- Eu não acho que vou conseguir me livrar dos nomes de usuário, então estou forçando o nome de usuário a igualar o endereço de e-mail.
Agents6666 #
@SickHippie - para login, acho que o e-mail é melhor e mais exclusivo do que um nome de usuário. Prefiro usar o nome de usuário como apelido quando o usuário postar. Você está certo, seria uma dor se "livrar" da variável "nome de usuário" e é por isso que não sou. Estou apenas escolhendo o nome de usuário para o usuário quando ele se registrar (o nome de usuário será o endereço de email; o apelido será o que eles inseriram como nome de usuário). No final, nenhuma variável é perdida, tudo está intacto.
Agents6666 #
1
@SickHippie - Você está certo, já que o padrão do Wordpress não é permitir que o usuário altere seu nome de usuário, seu nome de usuário / endereço de e-mail permaneceriam os mesmos, mesmo que mudassem seu endereço de e-mail de contato. Eu considerei isso desde o início e, em minha própria experiência, descobri que as pessoas raramente "excluem" um endereço de email. Eles podem obter novos, mas normalmente ainda terão os antigos. E se não, talvez nessas raras circunstâncias, vamos alterá-lo manualmente no banco de dados. Eu realmente aprecio o seu feedback e visão SickHippie! Agora eu espero que uma solução para o meu post :)
agentsmith666

Respostas:

19

Atualização: Criei um plugin para login, registro e recuperação de senha por e-mail. https://wordpress.org/plugins/smart-wp-login/

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

Três etapas:

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

Uma nota:

  • Não edite arquivos principais.

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

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

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

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

Altere o texto "Nome de usuário" em wp-login.php para "Email"

Podemos usar o filtro gettext para alterar o texto "Nome de usuário" para "E-mail" 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);

Também escrevi um artigo detalhado no meu blog http://www.thebinary.in/blog/wordpress-login-using-email/

Nishant Kumar
fonte
2
Resposta agradável Nishant
Andrew Bartel
útil! No meu caso, apenas retiro caracteres especiais de e-mail e o torno um nome de usuário. então [email protected] se torna user_example_com e funcionou.
Wpcoder
6

É 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, você encontra no Google oder no repositório de plugins; talvez este plugin .

bueltge
fonte
Obrigado pela resposta, no entanto, não tenho certeza se você leu minha postagem ou se eu não estava suficientemente claro. Peço desculpas pelo último. Na minha postagem original, mencionei o plugin WP_Email_Login; o plug-in exato do qual seu código e link são. Aqui está o meu post original: "No começo, fiquei encantado em ver o WP_Email_Login apenas para descobrir que você ainda pode usar seu nome de usuário para fazer login." <--- Veja o problema, eu ainda posso usar um nome de usuário e é por isso que este plugin não funciona. Como não consigo eliminar os nomes de usuário, estou pensando em substituir a função de registro, forçando o nome de usuário a igualar o endereço de email.
Agents6666 #
No entanto, estou procurando uma maneira de fazer isso sem editar os arquivos principais. Se não for possível, tudo bem, mas eu gostaria de saber de qualquer maneira. Obrigado!
Agents6666 #
dessa maneira, sem editar os arquivos principais. Copie o código em um plugin, ative e esteja pronto.
bueltge
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 precisamos fazer foi verificar se o nome de usuário fornecido parecia pelo menos um e-mail e, se não, sabotar o nome de usuário.

Vigs
fonte
Mais do que a verificação da cadeia primitivo para '@'o nome de usuário, Wordpress tem um prático built-in função: sanitize_email irá retornar um formato de endereço de email válido ou nada:sanitize_email('email¬!"@business_com'); // Returns nothing
indextwo
3

já está dentro WP-CORE!

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

T.Todua
fonte
1

Pequenas modificações no código acima devem ser tudo o que é necessário para criar uma solução elegante. A documentação para o gancho de autenticação afirma que um WP_Userobjeto ou WP_Errorobjeto deve ser retornado.

O código fonte da função wp_authenticate_username_password é executado através de algumas verificações bastante simples; podemos apenas replicar a maneira como essas verificações são feitas e criar um novo WP_Errorobjeto para lidar com o endereço de email. Como alternativa, poderíamos até bloquear o wp_authenticate_username_passwordcódigo 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 o tenha testado ...)

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