Email ca Nume de Utilizator în înregistrare
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:
- emailul tău
- 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!

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.

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.

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.

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

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.

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

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

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

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?

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.

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.
