Использование email в качестве имени пользователя при регистрации
Многие пользователи хотели бы разрешить регистрацию на сайте WordPress без имени пользователя, используя только email.
Это системное ограничение, поэтому решение (обходной путь) заключается в замене имени пользователя на email.
Если WordPress требует имя пользователя и email при регистрации, мы можем взять значение email и поместить его в поле имени пользователя. В форме регистрации пользователи увидят два поля:
- Ваш email
- Повторите ваш 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;
}
Заранее спасибо!

Вы можете использовать символы @
и .
в именах пользователей, так что в этом нет проблемы. Теперь вы можете создать свою собственную форму регистрации и использовать 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
, но снова будет использоваться пустое имя, поэтому нам нужно это тоже обработать.
Но я считаю, что создание собственной формы было бы предпочтительнее и менее хакерским способом.

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

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

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

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

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

Этот код отлично работает для ядра 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'];
}
});

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

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

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

Добавьте это в 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.
