Usar email como nombre de usuario en el registro de WordPress

7 oct 2016, 11:37:56
Vistas: 14.2K
Votos: 3

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:

  1. Tu email
  2. 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!

3
Comentarios

Desde WordPress 4.6 es posible iniciar sesión con correo electrónico y contraseña. Entonces ya no se necesitan más trucos

mmm mmm
7 oct 2016 13:19:41

@mmm Lo sé, pero necesito sincronizar el valor del nombre de usuario con el valor del Email (el único importante para requerir) para manejar mejor los errores, por ejemplo si un usuario ingresa dos correos que no coinciden, etc... Necesito un trabajo más limpio. ;)

user3437268 user3437268
7 oct 2016 17:47:24

Esta no es una buena idea. ¿Qué pasa si el usuario actualiza su correo electrónico? Entonces el nombre de usuario seguirá apuntando al correo antiguo. Y si implementas un hook para actualizar el nombre de usuario cuando cambia el correo, el usuario será repentinamente desconectado.

Maciej Kravchyk Maciej Kravchyk
5 feb 2022 19:09:47
Todas las respuestas a la pregunta 3
9

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.

7 oct 2016 14:00:38
Comentarios

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.

user42826 user42826
7 oct 2016 16:57:27

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.

websupporter websupporter
7 oct 2016 17:42:50

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

user3437268 user3437268
7 oct 2016 17:59:57

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.

websupporter websupporter
7 oct 2016 19:13:02

¡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...

user3437268 user3437268
7 oct 2016 19:52:06

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']; } });

user3437268 user3437268
8 oct 2016 11:20:10

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

websupporter websupporter
8 oct 2016 11:51:01

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?

Samuel Samuel
19 jul 2017 17:44:17

¿Sabes si esto también se puede hacer en el Panel de Control de WP? Parece que no usa la misma validación.

Louis W Louis W
26 may 2018 10:37:11
Mostrar los 4 comentarios restantes
0

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.

22 oct 2017 06:46:02
1

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.

4 feb 2019 13:12:03
Comentarios

Por favor, [edita] tu respuesta y añade una explicación: ¿por qué eso podría resolver el problema?

fuxia fuxia
4 feb 2019 15:07:15