Использование email в качестве имени пользователя при регистрации

7 окт. 2016 г., 11:37:56
Просмотры: 14.2K
Голосов: 3

Многие пользователи хотели бы разрешить регистрацию на сайте WordPress без имени пользователя, используя только email.

Это системное ограничение, поэтому решение (обходной путь) заключается в замене имени пользователя на email.

Если WordPress требует имя пользователя и email при регистрации, мы можем взять значение email и поместить его в поле имени пользователя. В форме регистрации пользователи увидят два поля:

  1. Ваш email
  2. Повторите ваш email

Это обходной путь, так как для WordPress реальными полями будут: 1. Имя пользователя (как ваш email) 2. Ваш email (как повтор email)

Но есть другая проблема: разрешен ли символ @ (at) в имени пользователя?

Как мы можем это реализовать?

Нужно ли вставлять код в файл functions.php?.. что-то вроде этого:

add_action( 'wp_core_validate_user_signup', 'custom_validate_user_signup' );

function custom_validate_user_signup($result)
{
  // Удаляем ошибки валидации имени пользователя
  unset($result['errors']->errors['user_name']);

  // Если email не пустой и нет ошибок валидации email
  if(!empty($result['user_email']) && empty($result['errors']->errors['user_email']))
  {
    // Используем хеш email в качестве имени пользователя
    $result['user_name'] = md5($result['user_email']);
    $_POST['signup_username'] = $result['user_name'];
  }

  return $result;
}

Заранее спасибо!

3
Комментарии

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

mmm mmm
7 окт. 2016 г. 13:19:41

@mmm я знаю это, но мне нужно синхронизировать значение имени пользователя со значением Email (единственное важное для требования), чтобы лучше обрабатывать ошибки, например, если пользователь вводит два email, которые не совпадают, и т.д... Мне нужна более чистая работа. ;)

user3437268 user3437268
7 окт. 2016 г. 17:47:24

Это не очень хорошая идея. Что если пользователь обновит свой email? Тогда имя пользователя всё равно будет указывать на старый email. А если вы реализуете хук для обновления имени пользователя при изменении email, пользователь внезапно выйдет из системы.

Maciej Kravchyk Maciej Kravchyk
5 февр. 2022 г. 19:09:47
Все ответы на вопрос 3
9

Вы можете использовать символы @ и . в именах пользователей, так что в этом нет проблемы. Теперь вы можете создать свою собственную форму регистрации и использовать register_new_user(). Вы даже можете изменить wp_registration_url() с помощью фильтра register_url, чтобы ссылка на регистрацию вела на вашу новую страницу регистрации.

Если вы хотите использовать стандартный интерфейс, предоставляемый wp-login.php, вам понадобятся некоторые обходные решения. Допустим, вы хотите отображать только поле ввода email при регистрации — вы можете просто (хотя это немного хакерский подход) скрыть поле имени пользователя с помощью чего-то вроде этого:

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

Примечание: Также есть возможность подключить таблицы стилей к wp-login.php, используя действие login_enqueue_scripts.

Но если вы это сделаете, будет отправлено пустое имя пользователя, поэтому вам нужно подключиться к двум фильтрам: sanitize_user и validate_username.

add_filter( 'sanitize_user', function( $sanitized_user, $raw_user, $strict ) {
    if ( $raw_user != '' ) {
        return $sanitized_user;
    }

    if ( ! empty ( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' && is_email( $_POST['user_email'] ) ) {
        return $_POST['user_email'];
    }

    return $sanitized_user;
}, 10, 3 );

add_filter( 'validate_username', function( $valid, $username ) {
    if ( $valid ) {
        return $valid;
    }

    if ( ! empty ( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' && is_email( $_POST['user_email'] ) ) {
        return true;
    }

    return is_email( $username );
}, 10, 2 );

В sanitize_user мы заменяем пустую строку на email-адрес. Позже имя пользователя будет проверено с помощью validate_username, но снова будет использоваться пустое имя, поэтому нам нужно это тоже обработать.

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

7 окт. 2016 г. 14:00:38
Комментарии

Вы на правильном пути, но нельзя возвращать $_POST['user_email'] в качестве имени пользователя, так как оно не санировано и может содержать недопустимые символы для имени пользователя в WordPress, что вызовет проблемы в дальнейшем.

user42826 user42826
7 окт. 2016 г. 16:57:27

Да, сам не уверен на 100%, но не могу найти пример, когда что-то в $_POST['user_email'] прошло бы как валидный email, но вызвало бы проблемы в качестве имени пользователя.

websupporter websupporter
7 окт. 2016 г. 17:42:50

Так разве нет функции, которая берет "значение email" и вставляет его в "значение username"??? :/

user3437268 user3437268
7 окт. 2016 г. 17:59:57

Вы можете использовать хук user_register, чтобы дополнительно изменить имя пользователя после успешной регистрации, для уверенности. https://codex.wordpress.org/Plugin_API/Action_Reference/user_register Но я не видел дополнительной санитаризации для user_email. Проверю ещё раз.

websupporter websupporter
7 окт. 2016 г. 19:13:02

Спасибо, @websupporter! В данный момент я использую плагин WP User Manager, который позволяет изменять названия полей, поэтому я заменил "Имя пользователя" на "Введите ваш email" и "Email" на "Повторите ваш email". Это не самое лучшее решение, у меня нет контроля над тем, совпадают ли введённые значения в полях, но оно работает...

user3437268 user3437268
7 окт. 2016 г. 19:52:06

Этот код отлично работает для ядра WordPress, просто добавьте его в файл functions.php: 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']; } });

user3437268 user3437268
8 окт. 2016 г. 11:20:10

Круто. Добавьте это как ответ и отметьте его, чтобы другие люди могли быстро найти :)

websupporter websupporter
8 окт. 2016 г. 11:51:01

Привет, спасибо за информацию. У меня почти такой же вопрос. Хочу принудительно использовать Email в качестве имени пользователя, добавив требование символа @ и точки в поле имени пользователя. Есть что-то новое в вашем решении?

Samuel Samuel
19 июл. 2017 г. 17:44:17

Вы знаете, можно ли это также сделать в админ-панели WordPress? Похоже, там не используется такая же валидация.

Louis W Louis W
26 мая 2018 г. 10:37:11
Показать остальные 4 комментариев
0

Вот что я использовал:

jQuery(document).ready(function($){
    // скрываем поле с именем пользователя.
    $('input#user_login').parent().parent().hide();
    // привязываем имя пользователя к полю email
    $('input#email').on('change',function(){
        $('#user_login').val($(this).val());
    });
});

Просто и понятно.

22 окт. 2017 г. 06:46:02
1

Добавьте это в functions.php (или другой php файл):

add_action('login_footer', function() {
?><script type="text/javascript">
    document.querySelector('input#user_login').parentElement.hidden = true ;
    document.querySelector('input#user_email').onchange = function(){
        document.querySelector('input#user_login').value = this.value ;
    } ;
</script><?php
} );

Данное действие выведет скрипт в "подвале" wp-login.php. JavaScript скрывает метку и поле "user_login", а затем устанавливает его значение равным значению поля для ввода email.

4 февр. 2019 г. 13:12:03
Комментарии

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему?

fuxia fuxia
4 февр. 2019 г. 15:07:15