Usar email como nombre de usuario en el registro de WordPress
Muchos usuarios quisieran permitir el registro en un sitio WordPress sin un nombre de usuario, solo con un email.
Este es un problema del núcleo, por lo que la solución (un truco) es reemplazar el nombre de usuario con el email.
Si WordPress requiere un nombre de usuario y un email para el registro, podemos tomar el valor del email y colocarlo en el valor del nombre de usuario. En el formulario de registro los usuarios verán dos campos:
- Tu email
- Repite tu email
Esto es un truco, porque para WordPress los campos reales serán: 1. nombre de usuario (como tu email) 2. tu email (como repite tu email)
Pero existe otro problema: ¿el símbolo @ (arroba) es un carácter permitido para el nombre de usuario?
¿Cómo podemos hacer esto?
¿Deberíamos insertar un código en el archivo functions.php?.. algo como esto:
add_action( 'wp_core_validate_user_signup', 'custom_validate_user_signup' );
function custom_validate_user_signup($result)
{
// Eliminar errores de validación del nombre de usuario
unset($result['errors']->errors['user_name']);
// Si el email tiene valor y no hay errores en el email
if(!empty($result['user_email']) && empty($result['errors']->errors['user_email']))
{
// Usar hash MD5 del email como nombre de usuario
$result['user_name'] = md5($result['user_email']);
$_POST['signup_username'] = $result['user_name'];
}
return $result;
}
¡Gracias de antemano!

Puedes usar @
y .
en los nombres de usuario, así que no hay problema. Ahora podrías crear tu propio formulario de registro y usar register_new_user()
. Incluso podrías manipular wp_registration_url()
con el filtro register_url
, para que el enlace de registro apunte a tu nueva página de registro.
Si quieres usarlo con la interfaz estándar proporcionada por wp-login.php, necesitarías algunas soluciones alternativas. Digamos que solo quieres mostrar el campo de entrada de correo electrónico para el registro, podrías simplemente (bueno, es un poco improvisado) ocultar el campo de nombre de usuario con algo como esto:
add_action( 'register_form', function() {
?><style>#registerform > p:first-child{display:none;}</style><?php
} );
Nota al margen: También existe la posibilidad de cargar hojas de estilo en wp-login.php usando la acción login_enqueue_scripts
.
Pero si lo haces, enviarás un nombre de usuario vacío, por lo que debes engancharte a dos filtros: sanitize_user
y 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 );
En sanitize_user
reemplazamos la cadena vacía con la dirección de correo electrónico. Más tarde, el nombre de usuario se validará con validate_username
, pero nuevamente se usará el nombre de usuario vacío, por lo que también debemos capturar esto.
Pero creo que crear tu propio formulario sería preferible y menos improvisado.

Vas por buen camino, pero no puedes devolver $_POST['user_email'] como nombre de usuario, ya que no está saneado y resultará en caracteres inválidos en el nombre de usuario de WP; lo que causará problemas más adelante.

Sí, no estoy 100% seguro, pero no encuentro un ejemplo donde algo en $_POST['user_email'] sea válido como email y aún así cause problemas como nombre de usuario.

Entonces, ¿no hay una función que tome el "valor del email" y lo inserte en el "valor del nombre de usuario"??? :/

Podrías usar la acción user_register
para modificar el nombre de usuario después del registro exitoso, solo para asegurarte. https://codex.wordpress.org/Plugin_API/Action_Reference/user_register Pero no he visto otra sanitización en user_email
. Lo revisaré de nuevo.

¡Gracias @websupporter! Por ahora estoy usando el plugin WP User Manager, que permite cambiar la etiqueta de los campos, así que reemplacé "Nombre de usuario" con "Ingresa tu Email" y "Email" con "Repite tu Email". No es la mejor solución, no tengo control sobre si los valores ingresados en los campos coinciden, pero funciona...

Este código funciona bien para el núcleo de WordPress, solo colócalo en el archivo 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'];
}
});

Genial. Agrégalo como respuesta y márcalo para que otras personas puedan encontrarlo rápidamente :)

Hola, gracias por compartir. Tengo casi la misma pregunta. Quiero forzar el uso de Email como nombre de usuario agregando un @ y que sea requerido un . en el campo de nombre de usuario. ¿Hay algo nuevo sobre tu solución?

Esto es lo que utilicé:
jQuery(document).ready(function($){
// ocultar el campo de nombre de usuario.
$('input#user_login').parent().parent().hide();
// forzar que el nombre de usuario refleje el valor del campo de email
$('input#email').on('change',function(){
$('#user_login').val($(this).val());
});
});
Sencillo y efectivo.

Añade esto en functions.php (u otro archivo 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
} );
La acción imprimirá el script en el "footer" de wp-login.php. El javascript oculta la etiqueta y el campo "user_login", y establece su valor con el valor del campo de correo electrónico.
