Email ca Nume de Utilizator în înregistrare

7 oct. 2016, 11:37:56
Vizualizări: 14.2K
Voturi: 3

mulți utilizatori ar dori să permită înregistrarea pe un site WordPress fără un nume de utilizator, doar cu un email.

Aceasta este o problemă de bază, așa că soluția (un truc) este înlocuirea numelui de utilizator cu email.

Dacă WordPress necesită un nume de utilizator și un email pentru înregistrare, putem prelua valoarea emailului și o putem pune în valoarea numelui de utilizator. În formularul de înregistrare, utilizatorii vor vedea două câmpuri:

  1. emailul tău
  2. repetă emailul tău

Acesta este un truc, deoarece pentru WordPress câmpurile reale vor fi: 1. nume de utilizator (ca emailul tău) 2. emailul tău (ca repetă emailul tău)

Dar există o altă problemă: este caracterul @ (at) permis pentru numele de utilizator?

Cum putem face asta?

Ar trebui să inserăm un cod în fișierul functions.php?.. ceva de genul:

add_action( 'wp_core_validate_user_signup', 'custom_validate_user_signup' );

function custom_validate_user_signup($result)
{
  // Elimină erorile legate de numele de utilizator
  unset($result['errors']->errors['user_name']);

  // Dacă emailul este valid și nu are erori, folosește-l ca nume de utilizator (hash)
  if(!empty($result['user_email']) && empty($result['errors']->errors['user_email']))
  {
    $result['user_name'] = md5($result['user_email']);
    $_POST['signup_username'] = $result['user_name'];
  }

  return $result;
}

Mulțumesc anticipat!

3
Comentarii

începând cu WordPress 4.6 este posibil să te autentifici folosind e-mail și parolă. atunci nu mai este nevoie de nicio soluție alternativă

mmm mmm
7 oct. 2016 13:19:41

@mmm știu acest lucru, dar trebuie să sincronizez valoarea Nume utilizator cu valoarea E-mail (singura importantă pentru a fi solicitată) pentru a gestiona mai bine erorile, de exemplu dacă un utilizator introduce două e-mailuri care nu se potrivesc, etc... Am nevoie de o soluție mai curată. ;)

user3437268 user3437268
7 oct. 2016 17:47:24

Aceasta nu este o idee bună. Ce se întâmplă dacă utilizatorul își actualizează e-mailul? Atunci numele de utilizator va indica în continuare către vechiul e-mail. Și dacă implementezi un hook pentru a actualiza numele de utilizator când e-mailul se schimbă, utilizatorul va fi deconectat brusc.

Maciej Kravchyk Maciej Kravchyk
5 feb. 2022 19:09:47
Toate răspunsurile la întrebare 3
9

Puteți utiliza caracterele @ și . în numele de utilizator, deci nu există nicio problemă. Acum puteți crea propriul formular de înregistrare și utiliza funcția register_new_user(). Puteți chiar manipula adresa URL de înregistrare wp_registration_url() cu ajutorul filtrului register_url, astfel încât linkul de înregistrare să trimită către noua pagină de înregistrare.

Dacă doriți să utilizați interfața standard oferită de wp-login.php, veți avea nevoie de câteva soluții. Să presupunem că doriți să afișați doar câmpul de introducere a emailului pentru înregistrare, puteți ascunde câmpul pentru numele de utilizator cu ceva de genul acesta:

add_action( 'register_form', function() {
    ?><style>#registerform > p:first-child{display:none;}</style><?php
} );

Notă laterală: Există și posibilitatea de a încărca fișiere de stil în wp-login.php folosind acțiunea login_enqueue_scripts.

Dar dacă faceți acest lucru, veți trimite un nume de utilizator gol, așa că va trebui să utilizați două filtre: sanitize_user și 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 );

În sanitize_user, înlocuim șirul gol cu adresa de email. Ulterior, numele de utilizator va fi validat cu validate_username, dar din nou, va fi folosit numele de utilizator gol, așa că trebuie să gestionăm și această situație.

Cred totuși că crearea unui formular personalizat ar fi preferabilă și mai puțin hacky.

7 oct. 2016 14:00:38
Comentarii

Ești pe drumul cel bun, dar nu poți returna $_POST['user_email'] ca username, acesta nu este sanatizat și va rezulta în caractere invalide în username-ul WP; iar acest lucru va cauza probleme ulterior.

user42826 user42826
7 oct. 2016 16:57:27

Da, nu sunt 100% sigur nici eu, dar nu găsesc un exemplu în care ceva din $_POST['user_email'] ar trece ca email valid și totuși să cauzeze probleme ca username.

websupporter websupporter
7 oct. 2016 17:42:50

Deci, nu există o funcție care să ia "valoarea email" și să o insereze în "valoarea username"??? :/

user3437268 user3437268
7 oct. 2016 17:59:57

Poți folosi acțiunea user_register pentru a modifica numele de utilizator după înregistrarea cu succes, ca să fii sigur. https://codex.wordpress.org/Plugin_API/Action_Reference/user_register Dar nu am văzut altă sterilizare pe user_email. Voi verifica din nou.

websupporter websupporter
7 oct. 2016 19:13:02

Mulțumesc @websupporter! Momentan folosesc pluginul WP User Manager, care permite schimbarea etichetei câmpurilor, așa că am înlocuit "Nume utilizator" cu "Introduceți emailul" și "Email" cu "Repetați emailul". Nu este cea mai bună soluție, nu am control dacă valorile introduse în câmpuri se potrivesc, dar funcționează...

user3437268 user3437268
7 oct. 2016 19:52:06

Acest cod funcționează bine pentru nucleul wp, doar puneți-l în fișierul 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

super. Adaugă-l ca răspuns și marchează-l astfel încât alți oameni să-l poată găsi rapid :)

websupporter websupporter
8 oct. 2016 11:51:01

Bună, mulțumesc pentru împărtășire. Am aproape aceeași întrebare. Vreau să forțez utilizarea Email-ului ca nume de utilizator prin adăugarea unui @ și . obligatoriu pe câmpul de username. Există ceva nou în legătură cu soluția ta?

Samuel Samuel
19 iul. 2017 17:44:17

Știi dacă acest lucru se poate face și în Panoul de control WP? Se pare că nu folosește aceeași validare.

Louis W Louis W
26 mai 2018 10:37:11
Arată celelalte 4 comentarii
0

Iată ce am folosit:

jQuery(document).ready(function($){
    // ascunde câmpul pentru nume de utilizator
    $('input#user_login').parent().parent().hide();
    // forțează numele de utilizator să reflecte conținutul câmpului de email
    $('input#email').on('change',function(){
        $('#user_login').val($(this).val());
    });
});

Simplu și eficient.

22 oct. 2017 06:46:02
1

Adaugă acest cod în fișierul functions.php (sau alt fișier 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
} );

Acțiunea va afișa scriptul în "footer"-ul paginii wp-login.php. JavaScript-ul ascunde eticheta și câmpul "user_login", și îi setează valoarea cu valoarea introdusă în câmpul de e-mail.

4 feb. 2019 13:12:03
Comentarii

Te rog să [editezi] răspunsul tău și să adaugi o explicație: de ce ar putea aceasta rezolva problema?

fuxia fuxia
4 feb. 2019 15:07:15