Как скрыть имя пользователя при регистрации на WordPress?

Вопрос или проблема

Я знаю, что это спрашивали несколько раз, но я ищу лучший способ это сделать. В настоящее время у меня это работает, но это неудобно для пользователя, так как форма снова просит зарегистрированных пользователей “пожалуйста, введите ваш адрес электронной почты” (хотя они уже сделали это). Это можно увидеть на safetyworks.com/login.

Вот верхняя часть моего кода:

<?php
$current_email = isset($_POST['user_email']) ? $_POST['user_email'] : '';
$current_username = $current_email;

?>

<?php if ($this->should_print_form()) : ?>

    <?php $this->print_form_header(); ?>

    <div class="row clearfix">
        <div class="col-sm-10 col-md-8 col-sm-offset-1 col-md-offset-2">
            <div class="panel panel-primary panel-border top">
                <div class="panel-heading">
                    <span class="panel-title fs-lg"><i class="fa fa-edit"></i> <?php _e('Создать учетную запись', 'cuarlf'); ?></span>
                </div>

                <div class="panel-body">
                    <div class="form-group mb-lg">
                        <label for="user_email" class="control-label top-label"><?php _e('Адрес электронной почты', 'cuarlf'); ?></label>
                        <div class="row clearfix">
                            <div class="col-xs-12">
                                <span class="append-icon right"><i class="field-icon fa fa-asterisk text-muted"></i></span>
                                <input class="form-control" type="email" name="user_email" id="user_email" value="<?php echo esc_attr($current_email); ?>">
                               <input class="form-control" type="hidden" name="user_login" id="user_login" value="<?php echo $current_username; ?>"> 
                                        </div>
                        </div>
                    </div> 

Так есть ли лучший способ скрыть имя пользователя? Я пробовал использовать Smart WP Login, но этот WordPress по-прежнему требует указать имя пользователя. Я также пробовал функцию, похожую на эту, но это не сработало.

После некоторых исследований я обнаружил, что плагин WP-Customer Area имеет функцию, которая вызывает эту проблему.

public static function register_new_user($user_login, $user_email)
        {
            global $wpdb;

            $errors = new WP_Error();

            $sanitized_user_login = sanitize_user($user_login);
            $user_email = apply_filters('user_registration_email', $user_email);

            // Проверка имени пользователя
            if ($sanitized_user_login == '')
            {
                $errors->add('empty_username', __('Пожалуйста, введите имя пользователя.', 'cuarlf'));
            }
            elseif ( !validate_username($user_login))
            {
                $errors->add('invalid_username', __('Извините. Пожалуйста, введите имя пользователя, используя только строчные буквы и цифры.', 'cuarlf'));
                $sanitized_user_login = '';
            }
            elseif (username_exists($sanitized_user_login))
            {
                $errors->add('username_exists', __('Это имя пользователя уже зарегистрировано. Пожалуйста, выберите другое.', 'cuarlf'));
            }

            // Проверка адреса электронной почты
            if ($user_email == '')
            {
                $errors->add('empty_email', __('Пожалуйста, введите ваш адрес электронной почты.', 'cuarlf'));
            }
            elseif ( !is_email($user_email))
            {
                $errors->add('invalid_email', __('Адрес электронной почты не корректен.', 'cuarlf'));
                $user_email="";
            }
            elseif (email_exists($user_email))
            {
                $errors->add('email_exists', __('Этот адрес электронной почты уже зарегистрирован, пожалуйста, выберите другой.', 'cuarlf'));
            }

            do_action('register_post', $sanitized_user_login, $user_email, $errors);

            $errors = apply_filters('registration_errors', $errors, $sanitized_user_login, $user_email);

            if ($errors->get_error_code())
            {
                return $errors;
            }

            $user_pass = wp_generate_password(12, false);
            $user_id = wp_create_user($sanitized_user_login, $user_pass, $user_email);
            if ( !$user_id)
            {
                $errors->add('registerfail',
                    sprintf(__('Не удалось зарегистрировать вас... пожалуйста, свяжитесь с <a href="https://wordpress.stackexchange.com/questions/270751/mailto:%s">администратором</a>!', 'cuarlf'), get_option('admin_email')));

                return $errors;
            }

            update_user_option($user_id, 'default_password_nag', true, true); // Установите напоминание о смене пароля.


            // Сгенерируйте что-то случайное для ключа...
            $activation_key = wp_generate_password(20, false);
            do_action('retrieve_password_key', $user_login, $activation_key);

            // Теперь вставляем новый md5 ключ в базу данных
            $wpdb->update($wpdb->users, array('user_activation_key' => $activation_key), array('user_login' => $user_login));

            // Отправка уведомлений
            $user = get_userdata($user_id);
            self::new_user_notification_admin($user);
            self::new_user_notification($user, $activation_key);

            return $user_id;
        }

Проблема в том, почему форма считает, что адрес электронной почты пустой? Я пытался следовать Можно ли удалить поле имени пользователя со страницы регистрации? Если да, то как?, но это вызывает конфликты с WP-Customer Area и не работает в файле функций темы, потому что он читается после плагинов.

Ну, я слишком долго это обдумывал!!

Все, что вам нужно сделать для формы, это ввести фиктивное значение для user_login, чтобы это выглядело так:

<input class="form-control" type="hidden" name="user_login" id="user_login" value="ABC">

В верхней части страницы я убираю $current_username = $current_email;.

В коде отправки формы я делаю так, чтобы форма использовала $_POST['user_email'] в качестве значения user_login.

if (isset($_POST['user_email']))
            {

                $user_email = $_POST['user_email'];
        $user_login = $_POST['user_email'];

                // Проверка капчи, если она включена
                if (class_exists("ReallySimpleCaptcha"))
                {
                    $captcha_instance = new ReallySimpleCaptcha();

                    if ( !isset($_POST['cuar_captcha_prefix']) || !isset($_POST['captcha']))
                    {
                        $this->form_errors[] = new WP_Error('captcha',
                            __("Вы должны ввести код, отображаемый на изображении выше.", 'cuarlf'));

                        return;
                    }
                    else
                    {
                        $prefix = $_POST['cuar_captcha_prefix'];
                        $code = $_POST['captcha'];

                        $captcha_checked = $captcha_instance->check($prefix, $code);
                        $captcha_instance->remove($prefix);
                        $captcha_instance->cleanup();

                        if ( !$captcha_checked)
                        {
                            $this->form_errors[] = new WP_Error('captcha', __("Код, который вы ввели, неверен.", 'cuarlf'));

                            return;
                        }
                    }
                }

                $errors = CUAR_WPLoginHelper::register_new_user($user_login, $user_email);
                if (is_wp_error($errors))
                {
                    $this->form_errors[] = $errors;

                    return;
                }
            }
            else
            {
                $this->form_errors[] = new WP_Error('user_login', __("Вы должны ввести действительное имя пользователя и действительный адрес электронной почты.", 'cuarlf'));

                return;
            }

            $lf_addon = $this->plugin->get_addon('login-forms');
            $this->form_messages[] = sprintf(__('На ваш адрес электронной почты были отправлены инструкции для активации вашей учетной записи. '
                . 'Вы можете перейти на <a href="https://wordpress.stackexchange.com/questions/270751/%1$s" class="alert-link">страницу входа</a>', 'cuarlf'), $lf_addon->get_login_url());
            $this->should_print_form = false;
        }

Ответ или решение

Как скрыть имя пользователя при регистрации в WordPress

Скрытие имени пользователя при регистрации в WordPress может значительно упростить процесс для пользователей и улучшить безопасность вашего веб-сайта. Для решения этой задачи важно учесть несколько аспектов, чтобы избежать путаницы и ошибок. Вот пошаговое руководство по реализации решения, включая изменения в коде и рекомендации по оптимизации.

1. Причины необходимости скрытия имени пользователя

Скрытие имени пользователя может быть необходимо для повышения безопасности, так как знание имени пользователя может упростить задачу злоумышленникам. Отказ от ввода имени пользователя при регистрации также делает процесс более удобным для пользователей, которые могут быть не готовы запомнить или придумать имя пользователя.

2. Проблема с текущим кодом

Ваша текущая реализация имеет недостаток, так как форма требует повторного ввода адреса электронной почты, что не является удобным для пользователя. Чтобы это исправить, необходимо внести несколько изменения в код.

3. Решение задачи

Шаг 1: Удаление имени пользователя из формы

Измените форму, чтобы она больше не запрашивала имя пользователя. Вместо создания переменной $current_username, используйте адрес электронной почты как имя пользователя.

$current_email = isset($_POST['user_email']) ? $_POST['user_email'] : '';
Шаг 2: Скрытие поля имени пользователя

Измените ввод для имени пользователя на скрытое поле с фиксированным значением. Это можно сделать следующим образом:

<input type="hidden" name="user_login" id="user_login" value="dummy_username"/>
Шаг 3: Обработка входа

При обработке отправки формы используйте адрес электронной почты как имя пользователя:

if (isset($_POST['user_email'])) {
    $user_email = $_POST['user_email'];
    $user_login = $_POST['user_email']; // Используем email как имя пользователя

    // Ваши проверки и обработка
    $errors = CUAR_WPLoginHelper::register_new_user($user_login, $user_email);
    if (is_wp_error($errors)) {
        // Обработка ошибок
    }
}
Шаг 4: Устранение ошибок

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

4. Тестирование и отладка

После внесения изменений обязательно протестируйте процесс регистрации с разных почтовых адресов, чтобы убедиться в корректности работы. Проверьте, что пользователь получает все необходимые уведомления и что ошибки не выводятся в случае правильного ввода адреса электронной почты.

5. Итог

Следуя вышеописанным шагам, вы сможете успешно скрыть имя пользователя при регистрации на сайте WordPress, обеспечив при этом удобство и безопасность для пользователей. Убедитесь, что ваши изменения протестированы на различных сценариях использования, чтобы избежать последующих проблем.

Это решение не только делает процесс регистрации более гладким, но и помогает укрепить безопасность вашего сайта, так как злоумышленникам будет сложнее предполагать имена пользователей.

Этот подход также даёт возможность избежать конфликта с плагинами, такими как WP-Customer Area, так как вы не удаляете поля — просто скрываете их от пользователя.

Оцените материал
Добавить комментарий

Капча загружается...