É possível remover o campo de nome de usuário da página de registro? Se sim, como?

16

É possível remover o campo de nome de usuário da página de registro?

Quero que os usuários insiram apenas seus e-mails e senhas.
Um novo usuário deve ser criado com base apenas nesses dois parâmetros.

Isso é possível e, se sim, como?

phpnwordpress
fonte

Respostas:

11

Absolutamente SIM , você pode conseguir isso.

Regra 1: WordPress requer um nome de usuário. Devemos fornecer um nome de usuário.

Regra 2: não edite o código principal do WordPress.

Podemos conseguir isso ocultando o campo de nome de usuário, recebendo e-mail e armazenando-o como nome de usuário.

Etapa 1: remover o campo de texto Nome de usuário

add_action('login_head', function(){
?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript" src="<?php echo site_url('/wp-includes/js/jquery/jquery.js'); ?>"></script>
    <script type="text/javascript">
        jQuery(document).ready(function($){
            $('#registerform > p:first-child').css('display', 'none');
        });
    </script>
<?php
});

Etapa 2: remover o nome de usuário

//Remove error for username, only show error for email only.
add_filter('registration_errors', function($wp_error, $sanitized_user_login, $user_email){
    if(isset($wp_error->errors['empty_username'])){
        unset($wp_error->errors['empty_username']);
    }

    if(isset($wp_error->errors['username_exists'])){
        unset($wp_error->errors['username_exists']);
    }
    return $wp_error;
}, 10, 3);

Etapa 3: Manipular a funcionalidade de registro em segundo plano.

add_action('login_form_register', function(){
    if(isset($_POST['user_login']) && isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
});

Coloque o código acima no arquivo functions.php do seu tema .

Você também pode baixar um plugin completo para conseguir isso.

Plugin: https://wordpress.org/plugins/smart-wp-login/

Nishant Kumar
fonte
4

A etapa 3 da postagem de Nishant Kumars verifica se o isset($_POST['user_login'])que não funcionou para mim, pois o login é o que realmente queremos remover.

Minha solução é a seguinte (no functions.php do tema), também como uma função separada, para ficar com o estilo de código wordpress:

function copy_username_to_email (){
    if(isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
}
add_action('login_form_register', 'copy_username_to_email');
mcnesium
fonte
Eu estava recebendo uma mensagem de erro "ilegal caracteres", então eu substituiu o @e .no endereço de e-mail como nome de usuário:$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
GreatBlakes
4

@Nishant Kumar deu a resposta perfeita e deveria ser aceita para esta pergunta. No entanto, há uma falha após a versão do Wordpress 4.0 lançada. Do codex -

Nota: Desde a 4.0, essas propriedades são privadas, consulte [28511] .

registration_errors O filtro aqui requer uma pequena modificação.

//Remove error for username, only show error for email only.

add_filter('registration_errors', 'remove_username_empty_error', 10, 3);

function remove_username_empty_error($wp_error, $sanitized_user_login, $user_email){

    if(isset($wp_error->errors['empty_username'])){
        $wp_error->remove('empty_username');
    }    
    if(isset($wp_error->errors['username_exists'])){
        $wp_error->remove('username_exists');
    }
    return $wp_error;
}

Nota: Como o @mcnesium mencionou, se nos livrarmos completamente do campo de nome de usuário (no meu caso, usei Theme meu plugin de login para substituir o formulário de registro regular e acabei de remover o campo de nome de usuário), $_POST['user_login']será nulle a condição não corresponderá em absoluto. É melhor remover isso da condição, como @mcnesium sugerido.

maksbd19
fonte
2

Iterando na resposta de @ nishant-kumar, aqui está um JS vanilla, sem script js extra, 1 etapa, sem necessidade de edição de back-end, solução para criar um formulário de inscrição apenas com a entrada de email:

/** Hook your code to the login / Sign up page **/
add_action('login_head', function(){

    /* Style to hide the user_name field group */
    ?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript">
        /* Execute this action when the DOM is ready AND after everything in the page is loaded */
        let user_email;
        window.addEventListener('load',function() {
            user_email = document.querySelector('[name="user_email"]');
            if(user_email) { // Execute only if there is a user_email field on page
                user_email.addEventListener('keyup',syncUserName);
                user_email.addEventListener('change',syncUserName);
            }
        });

        /* sync user_email's value with the hidden user_login field */
        function syncUserName() {
                document.querySelector('[name="user_login"]').value = user_email.value;
        }

    </script>
<?php
});

Você só precisa adicionar esse código no seu arquivo functions.php (ou no seu plugin personalizado , se você tiver um)

Gfra54
fonte
1
Eu tentei isso e recebi um erro user_email is not defined at HTMLInputElement.syncUserName. Mover a parte "function syncUserName" para dentro da função superior remove o erro e o trecho de código funciona muito. Basta comentar para que outras pessoas possam encontrar o mesmo problema. Obrigado Gfra54.
Betty
Você está absolutamente certo @betty, eu corrigi minha resposta para colocar o user_emailvar no mesmo escopo. Obrigado.
Gfra54
1

Eu acho que qualquer solução para essa solicitação será um 'hack', pois o wordpress exige que haja um nome de usuário para todos os usuários registrados. Mesmo o plug-in mencionado acima provavelmente está apenas encontrando o nome de usuário por meio do endereço de e-mail e depois usando esse nome de usuário para fazer login no site.

Se você concorda com um hack, aqui está um conceito que pode funcionar:

1) Preencher previamente o campo de nome de usuário no seu formulário de registro com um número único, usando o carimbo de data / hora atual é uma boa idéia para evitar a duplicação de cópias. Você ocultaria esse campo para que o usuário não o veja na tela ao preencher seu formulário.

Se você estiver usando jQuery, poderá usar algo como:

$(document).ready(function() {
    var timestamp = (new Date).getTime();
    $('form input.username').val(timestamp);
    $('form input.username').css('display', 'none');
});

Neste exemplo, 'form input.username' seria o seletor jQuery para encontrar o campo de nome de usuário. Você precisará verificar a estrutura html na sua página para garantir que o seletor corresponda à estrutura.

2) Use um plug-in como o mencionado anteriormente ( http://wordpress.org/extend/plugins/wp-email-login/ ) para permitir que os usuários façam login com seu endereço de email.

Matt Keys
fonte