¿Es posible eliminar el campo de nombre de usuario de la página de registro?

16 may 2012, 15:22:50
Vistas: 34.6K
Votos: 17

¿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?

1
Comentarios

¿Esto lo hace? http://wordpress.org/extend/plugins/wp-email-login/

saltcod saltcod
16 may 2012 15:30:28
Todas las respuestas a la pregunta 5
0
12

Absolutamente , 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.

Plugin: https://wordpress.org/plugins/smart-wp-login/

3 ago 2014 07:59:14
1

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');
28 ene 2015 18:58:16
Comentarios

Estaba recibiendo un mensaje de error de "caracteres no permitidos", así que reemplacé los caracteres @ y . en la dirección de correo electrónico como nombre de usuario: $_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);

GreatBlakes GreatBlakes
27 abr 2018 18:57:54
0

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

17 abr 2015 20:41:02
2

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)

19 dic 2018 09:09:15
Comentarios

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.

Betty Betty
7 mar 2019 04:34:14

Tienes toda la razón @betty, corregí mi respuesta para poner la variable user_email en el mismo ámbito. Gracias.

Gfra54 Gfra54
8 mar 2019 08:13:24
0

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.

12 jun 2013 06:57:48