¿Es posible eliminar el campo de nombre de usuario de la página de registro? ¿Si es así, cómo?

16

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

Quiero que los usuarios ingresen solo su correo electrónico y contraseña.
Se debe crear un nuevo usuario basado únicamente en estos dos parámetros.

¿Es eso posible y, de ser así, cómo?

phpnwordpress
fuente

Respuestas:

11

Absolutamente , puedes lograr esto.

Regla 1: WordPress requiere un nombre de usuario. Debemos proporcionar un nombre de usuario.

Regla 2: no edite el código central de WordPress.

Podemos lograr esto ocultando el campo de nombre de usuario, obtener correo electrónico y almacenarlo como nombre de usuario.

Paso 1: eliminar el campo de texto 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

//Remove error for username, only show error for email only.
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 de fondo.

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

Pon el código de arriba en el tema de tu archivo functions.php de .

También puede descargar un complemento completo para lograr esto.

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

Nishant Kumar
fuente
4

El paso 3 en la publicación de Nishant Kumars verifica si isset($_POST['user_login'])eso 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 tema functions.php), también como una función separada, para mantener el estilo del 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');
Mcnesio
fuente
Recibía un mensaje de error de "caracteres ilegales", así que reemplacé el @y .en la dirección de correo electrónico como nombre de usuario:$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
GreatBlakes
4

@Nishant Kumar dio la respuesta perfecta y debería ser aceptada a esta pregunta. Sin embargo, hay un problema técnico después del lanzamiento de la versión 4.0 de Wordpress. Del códice -

Nota: desde 4.0, estas propiedades son privadas, consulte [28511] .

registration_errors filtrar aquí requiere una pequeña modificación.

//Remove error for username, only show error for email only.

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 por completo el campo de nombre de usuario (en mi caso utilicé Theme, mi complemento de inicio de sesión para anular el formulario de registro normal y allí eliminé el campo de nombre de usuario), entonces $_POST['user_login']será nully la condición no coincidirá en absoluto. Mejor eliminamos eso de la condición como sugirió @mcnesium.

maksbd19
fuente
2

Iterando en la respuesta de @ nishant-kumar, aquí hay un JS de vainilla, sin script js adicional, 1 paso, no se necesita edición de backend, solución para hacer un formulario de registro con solo la entrada de correo electrónico:

/** Hook your code to the login / Sign up page **/
add_action('login_head', function(){

    /* Style to hide the user_name field group */
    ?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript">
        /* Execute this action when the DOM is ready AND after everything in the page is loaded */
        let user_email;
        window.addEventListener('load',function() {
            user_email = document.querySelector('[name="user_email"]');
            if(user_email) { // Execute only if there is a user_email field on page
                user_email.addEventListener('keyup',syncUserName);
                user_email.addEventListener('change',syncUserName);
            }
        });

        /* sync user_email's value with the hidden user_login field */
        function syncUserName() {
                document.querySelector('[name="user_login"]').value = user_email.value;
        }

    </script>
<?php
});

Solo necesita agregar este código en su archivo functions.php (o en su complemento personalizado , si tiene uno)

Gfra54
fuente
1
Intenté esto y obtuve un error user_email is not defined at HTMLInputElement.syncUserName. Mover la parte "function syncUserName" dentro de la función superior elimina el error y el fragmento de código funciona en gran medida. Solo comente para que otros puedan encontrar el mismo problema. Gracias Gfra54.
Betty
Tienes toda la razón @betty, corrigí mi respuesta para poner la user_emailvar en el mismo ámbito. Gracias.
Gfra54
1

Creo que cualquier solución a esta solicitud será un 'hack' ya que WordPress requiere que haya un nombre de usuario para todos los usuarios registrados. Incluso el complemento mencionado anteriormente probablemente encuentre el nombre de usuario a través de la dirección de correo electrónico y luego use ese nombre de usuario para iniciar sesión en el sitio.

Si está de acuerdo con un hack, aquí hay un concepto que podría funcionar:

1) Rellene previamente el campo de nombre de usuario en su formulario de registro con un número único, usar la marca de tiempo actual es una buena idea para evitar obtener duplicados. Luego, debe ocultar este campo para que el usuario no lo vea en la pantalla al completar su formulario.

Si está utilizando jQuery, podría 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, deberá verificar la estructura html en su página para asegurarse de que el selector coincida con la estructura.

2) Use un complemento 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.

Matt Keys
fuente