Возможно ли удалить поле имени пользователя со страницы регистрации? Если да, то как?
Возможно ли удалить поле имени пользователя со страницы регистрации?
Я хочу, чтобы пользователи вводили только email и пароль.
Новый пользователь должен создаваться только на основе этих двух параметров.
Это возможно и если да, то как?

Абсолютно ДА, вы можете это реализовать.
Правило 1: WordPress требует имя пользователя. Мы должны его предоставить.
Правило 2: Не редактируйте основной код WordPress.
Мы можем добиться этого, скрыв поле имени пользователя, получив email и сохранив его как имя пользователя.
Шаг-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: Удаление ошибки имени пользователя
//Удаляем ошибку для имени пользователя, показываем только ошибку для email.
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 вашей темы.
Вы также можете скачать готовый плагин для реализации этой функции.

Шаг 3 в посте Нишанта Кумара проверяет 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');

@Nishant Kumar дал идеальный ответ, который должен быть принят. Однако после выхода WordPress версии 4.0 возникла небольшая проблема. Согласно кодексу:
Примечание: Начиная с версии 4.0, эти свойства стали приватными, см. [28511].
Фильтр registration_errors
требует небольшой модификации.
// Удаляем ошибку для имени пользователя, показываем только ошибки для email.
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 my login для переопределения стандартной формы регистрации и там просто удалил поле имени пользователя), то $_POST['user_login']
будет null
, и условие вообще не сработает. Лучше убрать его из условия, как предложил @mcnesium.

Дорабатывая ответ @nishant-kumar, вот решение на чистом JavaScript без дополнительных скриптов, в один шаг, без необходимости редактирования бэкенда, для создания формы регистрации только с полем email:
/** Подключите ваш код к странице входа / регистрации **/
add_action('login_head', function(){
/* Стиль для скрытия группы полей имени пользователя */
?>
<style>
#registerform > p:first-child{
display:none;
}
</style>
<script type="text/javascript">
/* Выполнить это действие, когда DOM готов И после загрузки всего на странице */
let user_email;
window.addEventListener('load',function() {
user_email = document.querySelector('[name="user_email"]');
if(user_email) { // Выполнять только если на странице есть поле user_email
user_email.addEventListener('keyup',syncUserName);
user_email.addEventListener('change',syncUserName);
}
});
/* Синхронизировать значение user_email со скрытым полем user_login */
function syncUserName() {
document.querySelector('[name="user_login"]').value = user_email.value;
}
</script>
<?php
});
Вам просто нужно добавить этот код в файл functions.php (или в ваш пользовательский плагин, если он у вас есть)

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

Я считаю, что любое решение для этого запроса будет "костылем", так как WordPress требует наличие имени пользователя для всех зарегистрированных пользователей. Даже упомянутый выше плагин, скорее всего, просто находит имя пользователя по email-адресу, а затем использует это имя для входа на сайт.
Если вас устраивает решение с костылем, вот концепция, которая может сработать:
1) Предварительно заполните поле имени пользователя в форме регистрации уникальным числом — хорошей идеей будет использовать текущую временную метку (timestamp), чтобы избежать повторений. Затем скройте это поле, чтобы пользователь не видел его при заполнении формы.
Если вы используете 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/), чтобы позволить пользователям входить с помощью их email-адреса.
