Este posibil să eliminați câmpul pentru numele de utilizator din pagina de înregistrare?

16 mai 2012, 15:22:50
Vizualizări: 34.6K
Voturi: 17

Este posibil să eliminați câmpul pentru numele de utilizator din pagina de înregistrare?

Vreau ca utilizatorii să introducă doar email-ul și parola.
Un nou utilizator ar trebui să fie creat doar pe baza acestor doi parametri.

Este posibil acest lucru și dacă da, cum?

1
Comentarii

Funcționează asta? http://wordpress.org/extend/plugins/wp-email-login/

saltcod saltcod
16 mai 2012 15:30:28
Toate răspunsurile la întrebare 5
0
12

Absolut DA, poți realiza acest lucru.

Regula 1: WordPress necesită un nume de utilizator. Trebuie să oferim un nume de utilizator.

Regula 2: Nu edita codul de bază al WordPress.

Putem realiza acest lucru prin ascunderea câmpului pentru numele de utilizator, preluarea email-ului și stocarea acestuia ca nume de utilizator.

Pasul 1: Elimină câmpul pentru numele de utilizator

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

Pasul 2: Elimină eroarea pentru numele de utilizator

//Elimină eroarea pentru numele de utilizator, afișează doar eroarea pentru 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);

Pasul 3: Manipulează funcționalitatea de înregistrare în fundal.

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

Pune codul de mai sus în fișierul functions.php al temei tale.

Poți descărca și un plugin complet pentru a realiza acest lucru.

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

3 aug. 2014 07:59:14
1

Pasul 3 din postarea lui Nishant Kumar verifică dacă isset($_POST['user_login']) care nu a funcționat pentru mine, deoarece autentificarea este ceea ce dorim de fapt să eliminăm.

Soluția mea este următoarea (în functions.php al temei), de asemenea ca o funcție separată, pentru a rămâne în stilul de cod 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 ian. 2015 18:58:16
Comentarii

Am primit o eroare "caractere ilegale", așa că am înlocuit caracterele @ și . din adresa de email folosită ca nume de utilizator: $_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);

GreatBlakes GreatBlakes
27 apr. 2018 18:57:54
0

@Nishant Kumar a oferit răspunsul perfect și care ar trebui acceptat la această întrebare. Totuși, există o mică problemă după lansarea versiunii Wordpress 4.0. Conform codex-

Notă: Începând cu versiunea 4.0, aceste proprietăți sunt private, vezi [28511].

Filtrul registration_errors aici necesită o mică modificare.

// Elimină eroarea pentru numele de utilizator, afișează doar eroarea pentru email.

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;
}

Notă: După cum a menționat @mcnesium, dacă eliminăm complet câmpul pentru numele de utilizator (în cazul meu, am folosit pluginul Theme my login pentru a suprascrie formularul obișnuit de înregistrare și acolo am eliminat câmpul pentru numele de utilizator), atunci $_POST['user_login'] va fi null și condiția nu se va potrivi deloc. Este mai bine să eliminăm asta din condiție, așa cum a sugerat @mcnesium.

17 apr. 2015 20:41:02
2

Iterând asupra răspunsului lui @nishant-kumar, iată o soluție vanilla JS, fără scripturi JS suplimentare, într-un singur pas, fără necesitatea de a edita backend-ul, pentru a crea un formular de înregistrare cu doar câmpul de email:

/** Conectează codul tău la pagina de login / Înregistrare **/
add_action('login_head', function(){

    /* Stil pentru a ascunde grupul de câmp user_name */
    ?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript">
        /* Execută această acțiune când DOM-ul este gata ȘI după ce totul din pagină este încărcat */
        let user_email;
        window.addEventListener('load',function() {
            user_email = document.querySelector('[name="user_email"]');
            if(user_email) { // Execută doar dacă există un câmp user_email pe pagină
                user_email.addEventListener('keyup',syncUserName);
                user_email.addEventListener('change',syncUserName);
            }
        });

        /* sincronizează valoarea user_email cu câmpul ascuns user_login */
        function syncUserName() {
                document.querySelector('[name="user_login"]').value = user_email.value;
        }

    </script>
<?php
});

Trebuie doar să adaugi acest cod în fișierul tău functions.php (sau în plugin-ul tău personalizat, dacă ai unul)

19 dec. 2018 09:09:15
Comentarii

Am încercat acest lucru și am primit o eroare user_email is not defined at HTMLInputElement.syncUserName. Mutarea părții "function syncUserName" în interiorul funcției superioare elimină eroarea și fragmentul de cod funcționează perfect. Doar comentez astfel încât și alții să știe dacă întâlnesc aceeași problemă. Mulțumesc Gfra54.

Betty Betty
7 mar. 2019 04:34:14

Aveți perfectă dreptate @betty, am corectat răspunsul meu pentru a pune variabila user_email în același scope. Mulțumesc.

Gfra54 Gfra54
8 mar. 2019 08:13:24
0

Cred că orice soluție pentru această cerere va fi un 'hack', deoarece WordPress necesită ca toți utilizatorii înregistrați să aibă un nume de utilizator. Chiar și plugin-ul menționat mai sus cel mai probabil doar găsește numele de utilizator prin adresa de email și apoi folosește acel nume pentru autentificare pe site.

Dacă ești de acord cu un hack, iată un concept care ar putea funcționa:

1) Completează automat câmpul de nume de utilizator în formularul de înregistrare cu un număr unic, folosind timestamp-ul curent este o idee bună pentru a evita duplicate. Apoi ascunde acest câmp astfel încât utilizatorul să nu îl vadă pe ecran când completează formularul.

Dacă folosești jQuery ai putea folosi ceva de genul:

$(document).ready(function() {
    var timestamp = (new Date).getTime();
    $('form input.username').val(timestamp);
    $('form input.username').css('display', 'none');
});

În acest exemplu, 'form input.username' ar fi selectorul jQuery pentru a găsi câmpul de nume de utilizator, va trebui să verifici structura HTML pe pagina ta pentru a te asigura că selectorul se potrivește cu structura.

2) Folosește un plugin precum cel menționat mai devreme (http://wordpress.org/extend/plugins/wp-email-login/) pentru a permite utilizatorilor să se autentifice cu adresa lor de email.

12 iun. 2013 06:57:48