Можно ли удалить поле имени пользователя со страницы регистрации? Если так, то как?

16

Можно ли удалить поле имени пользователя со страницы регистрации?

Я хочу, чтобы пользователи вводили только свои адрес электронной почты и пароль.
Новый пользователь должен быть создан только на основе этих двух параметров.

Это возможно и если да, то как?

phpnwordpress
источник
Это сделать это? wordpress.org/extend/plugins/wp-email-login
saltcod

Ответы:

11

Абсолютно ДА , вы можете достичь этого.

Правило 1: WordPress требует имя пользователя. Мы должны предоставить имя пользователя.

Правило 2. Не редактируйте код ядра WordPress.

Мы можем добиться этого, скрыв поле имени пользователя, получить электронную почту и сохранить его как имя пользователя.

Шаг 1: Удалить текстовое поле Имя пользователя

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

Шаг 2: Удалить ошибку имени пользователя

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

Шаг 3: Управление функцией фоновой регистрации.

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

Поместите приведенный выше код в файл functions.php вашей темы .

Вы также можете скачать полный плагин для достижения этой цели.

Плагин: https://wordpress.org/plugins/smart-wp-login/

Нишант Кумар
источник
4

Шаг 3 в посте Nishant Kumars отправляет проверки, если isset($_POST['user_login'])это не сработало для меня, поскольку логин - это то, что мы на самом деле хотим удалить.

Мое решение заключается в следующем (в файле functions.php темы), а также в качестве отдельной функции, чтобы остаться в стиле кода 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
источник
Я получаю сообщение об ошибке «Недопустимые символы», поэтому я заменил на @и .в адресе электронной почты имя пользователя:$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
GreatBlakes,
4

@Nishant Кумар дал идеальный и должен быть принят ответ на этот вопрос. Однако после выхода версии для Wordpress 4.0 возникает сбой. Из кодекса -

Примечание. Начиная с версии 4.0 эти свойства являются частными, см. [28511] .

registration_errors Фильтр здесь требует небольшой модификации.

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

Примечание. Как уже упоминалось в @mcnesium, если мы полностью избавились от поля имени пользователя (в моем случае я использовал плагин Theme для входа в систему, чтобы переопределить обычную форму регистрации, и там я просто удалил поле имени пользователя), тогда $_POST['user_login']будет nullи условие не будет совпадать совсем. Мы лучше удалим это из условия, предложенного @mcnesium.

maksbd19
источник
2

Итерируя ответ @ nishant-kumar, мы видим ванильный JS, не требующий дополнительного js-скрипта, 1 шаг, не нужно редактирование бэкэнда, решение создать форму регистрации только с вводом электронной почты:

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

Вам просто нужно добавить этот код в ваш файл functions.php (или в ваш собственный плагин , если он у вас есть)

Gfra54
источник
1
Я попробовал это и получил ошибку user_email is not defined at HTMLInputElement.syncUserName. Перемещение части «function syncUserName» внутри верхней функции устраняет ошибку, и фрагмент кода работает очень хорошо. Просто прокомментируйте, чтобы другие могли столкнуться с той же проблемой. Спасибо, Gfra54.
Бетти
Вы абсолютно правы @betty, я исправил свой ответ, чтобы поместить user_emailvar в ту же область. Благодарю.
Gfra54
1

Я думаю, что любое решение этого запроса будет «взломать», так как WordPress требует, чтобы было имя пользователя для всех зарегистрированных пользователей. Даже упомянутый выше плагин, скорее всего, просто находит имя пользователя по адресу электронной почты, а затем использует это имя для входа на сайт.

Если у вас все в порядке с хаком, вот концепция, которая может сработать:

1) Предварительно заполните поле имени пользователя в вашей регистрационной форме уникальным номером, используя текущую временную метку, - это хорошая идея, чтобы избежать появления дубликатов. Затем вы бы скрыли это поле, чтобы пользователь не видел его на экране при заполнении формы.

Если вы используете jQuery, вы можете использовать что-то вроде:

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

В этом примере «form input.username» будет селектором jQuery для поиска поля имени пользователя, вам нужно будет проверить структуру html на своей странице, чтобы убедиться, что селектор соответствует структуре.

2) Используйте плагин, подобный тому, который упоминался ранее ( http://wordpress.org/extend/plugins/wp-email-login/ ), чтобы позволить пользователям войти в систему со своим адресом электронной почты.

Мэтт Кис
источник