Este posibil să eliminați câmpul pentru numele de utilizator din pagina de înregistrare?
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?

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.

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

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

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)

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.

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.
