Чи можливо видалити поле імені користувача зі сторінки реєстрації? Якщо так, то як?


16

Чи можливо видалити поле імені користувача зі сторінки реєстрації?

Я хочу, щоб користувачі вводили лише свою електронну пошту та пароль.
Новий користувач повинен бути створений лише на основі цих двох параметрів.

Це можливо і якщо так, то як?


Відповіді:


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

Помістіть вище код у файлі function.php теми .

Ви також можете завантажити повний плагін, щоб досягти цього.

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


4

Крок 3 на посаді Нішанта Кумара перевіряє, чи isset($_POST['user_login'])це не спрацювало для мене, оскільки логін - це те, що ми насправді хочемо видалити.

Моє рішення полягає в наступному (у темі function.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');

Я отримував повідомлення про помилку "незаконних символів", тому я замінив адресу електронної пошти @та .електронну адресу як ім'я користувача:$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
GreatBlakes

4

@Nishant Kumar дав ідеальну і слід прийняти відповідь на це питання. Однак, після випуску версії 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, якщо ми повністю позбулися поля імені користувача (у моєму випадку я використовував плагін "Тема" для входу, щоб замінити звичайну реєстраційну форму, і там я просто видалив поле ім'я користувача), тоді $_POST['user_login']буде nullі стан не збігатиметься зовсім. Ми краще видалимо це із стану, як це запропоновано @mcnesium.


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

Вам просто потрібно додати цей код у файл function.php (або у власний плагін , якщо у вас є)


1
Я спробував це і отримав помилку user_email is not defined at HTMLInputElement.syncUserName. Переміщення частини "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/ ), щоб дозволити користувачам увійти з електронною адресою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.