¿Es posible eliminar el campo de nombre de usuario de la página de registro?
¿Es posible eliminar el campo de nombre de usuario de la página de registro?
Quiero que los usuarios ingresen solamente su correo electrónico y contraseña.
Un nuevo usuario debería crearse basándose únicamente en estos dos parámetros.
¿Es esto posible y si es así, cómo se hace?

Absolutamente SÍ, puedes lograr esto.
Regla 1: WordPress requiere un nombre de usuario. Debemos proporcionar uno.
Regla 2: No edites el código núcleo de WordPress.
Podemos lograrlo ocultando el campo de nombre de usuario, obtener el email y almacenarlo como nombre de usuario.
Paso 1: Eliminar el campo de texto de nombre de usuario
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
});
Paso 2: Eliminar el error de nombre de usuario
//Eliminar error para nombre de usuario, solo mostrar error para 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);
Paso 3: Manipular la funcionalidad de registro en segundo plano
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'];
}
});
Coloca el código anterior en el archivo functions.php de tu tema.
También puedes descargar un plugin completo para lograr esto.

Paso 3 en la publicación de Nishant Kumar verifica si isset($_POST['user_login'])
lo cual no funcionó para mí, ya que el inicio de sesión es lo que realmente queremos eliminar.
Mi solución es la siguiente (en el functions.php del tema), también como una función separada, para mantener el estilo de código de 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 proporcionó la respuesta perfecta y que debería ser aceptada para esta pregunta. Sin embargo, hay un problema después del lanzamiento de la versión 4.0 de WordPress. Según el codex:
Nota: Desde la versión 4.0, estas propiedades son privadas, ver [28511].
El filtro registration_errors
aquí requiere una pequeña modificación.
// Eliminar el error para el nombre de usuario, solo mostrar el error para el correo electrónico.
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;
}
Nota: Como mencionó @mcnesium, si eliminamos completamente el campo de nombre de usuario (en mi caso utilicé el plugin Theme My Login para sobrescribir el formulario de registro regular y allí simplemente eliminé el campo de nombre de usuario), entonces $_POST['user_login']
será null
y la condición no coincidirá en absoluto. Es mejor eliminarlo de la condición como sugirió @mcnesium.

Iterando sobre la respuesta de @nishant-kumar, aquí hay una solución en vanilla JS, sin scripts JS adicionales, en 1 paso y sin necesidad de editar el backend, para crear un formulario de registro con solo el campo de correo electrónico:
/** Conecta tu código a la página de inicio de sesión / Registro **/
add_action('login_head', function(){
/* Estilo para ocultar el grupo de campos de nombre de usuario */
?>
<style>
#registerform > p:first-child{
display:none;
}
</style>
<script type="text/javascript">
/* Ejecuta esta acción cuando el DOM está listo Y después de que todo en la página se haya cargado */
let user_email;
window.addEventListener('load',function() {
user_email = document.querySelector('[name="user_email"]');
if(user_email) { // Ejecuta solo si hay un campo user_email en la página
user_email.addEventListener('keyup',syncUserName);
user_email.addEventListener('change',syncUserName);
}
});
/* Sincroniza el valor de user_email con el campo oculto user_login */
function syncUserName() {
document.querySelector('[name="user_login"]').value = user_email.value;
}
</script>
<?php
});
Solo necesitas agregar este código en tu archivo functions.php (o en tu plugin personalizado, si tienes uno)

Intenté esto y obtuve un error user_email is not defined at HTMLInputElement.syncUserName
. Al mover la parte de "function syncUserName" dentro de la función superior se elimina el error y el fragmento de código funciona perfectamente. Solo comento para que otros puedan encontrarse con el mismo problema. Gracias Gfra54.

Creo que cualquier solución para esta solicitud va a ser un "hack", ya que WordPress requiere que haya un nombre de usuario para todos los usuarios registrados. Incluso el plugin mencionado anteriormente probablemente solo está encontrando el nombre de usuario a través de la dirección de correo electrónico, y luego usando ese nombre de usuario para iniciar sesión en el sitio.
Si estás de acuerdo con un "hack", aquí hay un concepto que podría funcionar:
1) Prellena el campo de nombre de usuario en tu formulario de registro con un número único, usar la marca de tiempo actual es una buena idea para evitar duplicados. Luego ocultarías este campo para que el usuario no lo vea en pantalla al completar el formulario.
Si estás usando jQuery, podrías usar algo como:
$(document).ready(function() {
var timestamp = (new Date).getTime();
$('form input.username').val(timestamp);
$('form input.username').css('display', 'none');
});
En este ejemplo, 'form input.username' sería el selector jQuery para encontrar el campo de nombre de usuario. Necesitarás verificar la estructura HTML en tu página para asegurarte de que el selector coincida con la estructura.
2) Usa un plugin como el mencionado anteriormente (http://wordpress.org/extend/plugins/wp-email-login/) para permitir que los usuarios inicien sesión con su dirección de correo electrónico.
