Czy można usunąć pole nazwy użytkownika ze strony rejestracji? Jeśli tak to jak?

16

Czy można usunąć pole nazwy użytkownika ze strony rejestracji?

Chcę, aby użytkownicy wprowadzali tylko swój adres e-mail i hasło.
Nowy użytkownik powinien zostać utworzony wyłącznie na podstawie tych dwóch parametrów.

Czy to możliwe, a jeśli tak, to w jaki sposób?

phpnwordpress
źródło

Odpowiedzi:

11

Absolutnie TAK , możesz to osiągnąć.

Zasada 1: WordPress wymaga nazwy użytkownika. Musimy podać nazwę użytkownika.

Zasada 2: Nie edytuj kodu podstawowego WordPress.

Możemy to osiągnąć, ukrywając pole nazwy użytkownika, otrzymując e-mail i przechowując go jako nazwę użytkownika.

Krok 1: Usuń pole tekstowe Nazwa użytkownika

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

Krok 2: Błąd usuwania nazwy użytkownika

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

Krok 3: Zmodyfikuj funkcjonalność rejestracji w tle.

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'];
    }
});

Umieść powyższy kod w pliku functions.php swojego motywu .

Możesz również pobrać kompletną wtyczkę, aby to osiągnąć.

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

Nishant Kumar
źródło
4

Krok 3 w poście postu Nishant Kumars sprawdza, czy isset($_POST['user_login'])to nie zadziałało, ponieważ logowanie jest tym, co naprawdę chcemy usunąć.

Moje rozwiązanie jest następujące (w funkcji theme.php), również jako osobna funkcja, aby pozostać przy stylu kodu 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
źródło
@.$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
Otrzymywałem
4

@Nishant Kumar udzielił idealnej i należy ją zaakceptować odpowiedzi na to pytanie. Jednak po wydaniu wersji Wordpress 4.0 występuje usterka. Z kodeksu -

Uwaga: od wersji 4.0 te właściwości są prywatne, patrz [28511] .

registration_errors filtr tutaj wymaga niewielkiej modyfikacji.

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

Uwaga: Jak wspomniałem @mcnesium, jeśli całkowicie pozbyliśmy się pola nazwy użytkownika (w moim przypadku użyłem Theme mojej wtyczki logowania, aby zastąpić zwykły formularz rejestracyjny i tam właśnie usunąłem pole nazwy użytkownika), to $_POST['user_login']będzie nulli warunek nie będzie zgodny w ogóle. Lepiej usuńmy to ze stanu sugerowanego przez @mcnesium.

maksbd19
źródło
2

Iterując w odpowiedzi na @ nishant-kumar, oto waniliowy JS, bez dodatkowego skryptu js, 1 krok, nie wymaga edycji backendu, rozwiązanie do utworzenia formularza rejestracyjnego przy użyciu tylko e-maila:

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

Musisz tylko dodać ten kod do pliku functions.php (lub do niestandardowej wtyczki , jeśli ją masz)

Gfra54
źródło
1
Próbowałem tego i dostałem błąd user_email is not defined at HTMLInputElement.syncUserName. Przeniesienie części „function syncUserName” wewnątrz górnej funkcji usuwa błąd i fragment kodu działa bardzo dobrze. Po prostu komentuj, aby inni mogli napotkać ten sam problem. Dziękuję Gfra54.
Betty,
Masz absolutną rację @betty, poprawiłem swoją odpowiedź, aby umieścić user_emailvar w tym samym zakresie. Dzięki.
Gfra54
1

Myślę, że każde rozwiązanie tego żądania będzie „hackowaniem”, ponieważ wordpress wymaga podania nazwy użytkownika dla wszystkich zarejestrowanych użytkowników. Nawet wspomniana wyżej wtyczka najprawdopodobniej po prostu znajduje nazwę użytkownika za pomocą adresu e-mail, a następnie używa tej nazwy użytkownika do zalogowania się na stronie.

Jeśli nie masz nic przeciwko hackowi, oto koncepcja, która może działać:

1) Wypełnij wstępnie pole nazwy użytkownika w formularzu rejestracyjnym unikalnym numerem, używając aktualnego znacznika czasu to dobry pomysł, aby uniknąć uzyskiwania duplikatów. Następnie ukryłbyś to pole, aby użytkownik nie widział go na ekranie podczas wypełniania formularza.

Jeśli używasz jQuery, możesz użyć czegoś takiego:

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

W tym przykładzie „formularz input.username” byłby selektorem jQuery, aby znaleźć pole nazwy użytkownika, musisz sprawdzić strukturę HTML na swojej stronie, aby upewnić się, że selektor pasuje do struktury.

2) Użyj wtyczki takiej jak wspomniana wcześniej ( http://wordpress.org/extend/plugins/wp-email-login/ ), aby umożliwić użytkownikom logowanie się przy użyciu adresu e-mail.

Matt Keys
źródło