Înregistrare și autentificare separată pentru roluri diferite
Am setat 2 roluri noi pentru site-ul meu folosind plugin-ul "Members" - "vânzători" și "cumpărători".
Fiecare rol ar trebui să aibă propria pagină de înregistrare și autentificare. Un vizitator se poate înregistra atât ca și cumpărător cât și ca vânzător, dar poate fi autentificat doar cu unul dintre roluri. Astfel, dacă un vizitator s-a autentificat ca vânzător și apoi merge la pagina de cumpărător, va putea să se autentifice ca și cumpărător, iar când face acest lucru va fi deconectat automat din rolul de vânzător.
Am căutat ore întregi un plugin care să-mi ofere opțiunea de a face acest lucru dar nu am găsit niciunul. Pare a fi o configurație destul de comună în site-urile web cu înregistrări pentru roluri diferite.
Există vreun plugin care să facă acest lucru? Și dacă nu, cum poate fi implementat?
Crearea a două înregistrări separate pentru roluri diferite este simplă:
//creează un câmp ascuns pentru rol
add_action('register_form','add_hidden_role_field');
function add_hidden_role_field(){
if (isset($_GET['role'])){
echo '<input id="user_email" type="hidden" tabindex="20" size="25" value="'.$_GET['role'].'" name="role"/>';
}
}
add_action('user_register', 'update_role');
//salvează rolul
function update_role($user_id, $password="", $meta=array()) {
if (isset($_POST['role'])){
$userdata = array();
$userdata['ID'] = $user_id;
$userdata['role'] = $_POST['role'];
//permite doar dacă rolul utilizatorului este my_role pentru a evita adăugarea de noi administratori pe site
if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
wp_update_user($userdata);
}
}
}
și acum poți lega fiecare rol cu formularul său de înregistrare:
vânzător: http://example.com/wp-login.php?action=register&role=seller
cumpărător: http://example.com/wp-login.php?action=register&role=buyer
dar, așa cum a comentat Milo:
"dacă cineva se înregistrează ca cumpărător, nu există nicio modalitate prin care să se poată autentifica ca altceva decât cumpărător cu aceleași date"
ceea ce înseamnă că ar trebui să folosească o altă adresă de email pentru a se înregistra în celălalt rol.
Actualizare
aceasta este o actualizare cu un exemplu pentru a arăta cum poți folosi același formular, dar cu câmpuri diferite pentru fiecare rol.
Deci, trebuie doar să modifici puțin funcțiile:
//creează un câmp ascuns pentru rol și câmpuri suplimentare necesare
add_action('register_form','add_hidden_role_field');
function add_hidden_role_field(){
if (isset($_GET['role'])){
$user_type = $_GET['role'];
echo '<input id="user_email" type="hidden" tabindex="20" size="25" value="'.$_GET['role'].'" name="role"/>';
}
if (isset($user_type) && $user_type == "seller"){
//adaugă câmpuri suplimentare pentru vânzător aici, de exemplu:
?>
nume afacere:
<input id="user_email" type="text" tabindex="20" size="25" value="" name="business_name"/>
adresă afacere:
<input id="user_email" type="text" tabindex="20" size="25" value="" name="business_address"/>
<?php
}
if (isset($user_type) && $user_type == "buyer"){
//adaugă câmpuri suplimentare pentru cumpărător aici, de exemplu:
?>
nume cumpărător:
<input id="user_email" type="text" tabindex="20" size="25" value="" name="buyer_name"/>
<?php
}
}
în acest fel, sunt afișate doar câmpurile necesare pentru rolul specific.
Următorul pas este dacă dorești să ai o anumită validare pentru aceste câmpuri suplimentare, poți folosi hook-ul register_post
, de exemplu:
add_action('register_post','my_user_fields_validation',10,3);
function my_user_fields_validation($login, $email, $errors) {
global $firstname, $lastname;
//obține rolul pentru verificare
if (isset($_POST['role'])){
$user_type = $_POST['role'];
}
//verifică câmpurile în funcție de rol
if (isset($user_type) && $user_type == "seller"){
//verifică câmpurile vânzătorului
if ($_POST['business_name'] == '') {
$errors->add('empty_business_name', "<strong>EROARE</strong>: Te rugăm să introduci un nume de afacere");
}
if ($_POST['business_address'] == '') {
$errors->add('empty_business_address', "<strong>EROARE</strong>: Te rugăm să introduci adresa afacerii");
}
}
if (isset($user_type) && $user_type == "buyer"){
//verifică câmpurile cumpărătorului
if ($_POST['buyer_name'] == '') {
$errors->add('empty_buyer_name', "<strong>EROARE</strong>: Te rugăm să introduci un nume de cumpărător");
}
}
}
apoi, dacă totul este în regulă, salvează câmpurile în metadatele utilizatorului pe baza rolului
add_action('user_register', 'update_role');
//salvează rolul
function update_role($user_id, $password="", $meta=array()) {
if (isset($_POST['role'])){
$userdata = array();
$userdata['ID'] = $user_id;
$userdata['role'] = $_POST['role'];
$user_type = $_POST['role'];
//permite doar dacă rolul utilizatorului este my_role pentru a evita adăugarea de noi administratori pe site
if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
wp_update_user($userdata);
}
if (isset($user_type) && $user_type == "seller"){
//salvează câmpurile vânzătorului
update_user_meta($user_id, 'business_name', $_POST['business_name']);
update_user_meta($user_id, 'business_address', $_POST['business_address']);
}
if (isset($user_type) && $user_type == "buyer"){
//salvează câmpurile cumpărătorului
update_user_meta($user_id, 'buyer_name', $_POST['buyer_name']);
}
}
}

Mulțumesc Bainternet și Milo!
Da, mă refer că vizitatorul se va înregistra de două ori - o dată ca vânzător și încă o dată ca cumpărător, cu email-uri diferite.
Dar am nevoie de două formulare de înregistrare separate, deoarece fiecare va conține câmpuri diferite. De exemplu: formularul vânzătorului va include câmpurile - "nume afacere" și "adresă afacere" în timp ce formularul cumpărătorului va include câmpul "nume cumpărător".
Deci, Bainternet, nu sunt sigur că pot folosi codul tău așa cum este (dar îți mulțumesc mult pentru efort) deoarece acesta trimite către aceeași pagină doar cu parametri diferiți.
Cum pot face asta cu două formulare separate?

@Ash: încă nu ai nevoie de două formulare separate, doar adaugă câmpurile în funcție de rol, voi actualiza răspunsul meu cu un exemplu.

@Bainternet: Scuze pentru întrebarea de începător, dar asta sunt :-) - acest cod poate fi folosit doar într-un plugin sau poate fi folosit și într-un fișier php care este un șablon pentru o pagină?

Fie în plugin, fie în functions.PHP al temei, orice altceva ar necesita includerea de fișiere suplimentare.

@Bainternet: OK. Am înțeles problema cu înregistrarea. Foarte apreciat!
Poți te rog să te referi și la problema de autentificare? Știu că nu este comportamentul obișnuit al WordPress, dar așa am nevoie să funcționeze site-ul meu.
Doar pentru a fi mai clar, acesta este comportamentul de care am nevoie - dacă un vizitator s-a autentificat ca cumpărător și apoi accesează pagina de autentificare pentru vânzători, ar trebui să apară ca neautentificat în calitate de vânzător. Apoi, dacă se autentifică ca vânzător, va fi automat deconectat ca cumpărător. În schimb, dacă revine pe pagina pentru cumpărători, va vedea că este încă autentificat ca cumpărător.
Mulțumesc din nou.

@bainternet, la erori, funcția my_user_fields_validation
va reîncărca/reutiliza link-ul http://example.com/wp-login.php?action=register
și nu link-ul specific rolului, de ex. http://example.com/wp-login.php?action=register&role=seller
. Poți îmbunătăți această funcție?

@lurie poți seta și citi un cookie pentru un rol. pune o întrebare nouă și te voi ajuta.

@Bainternet, am pus o întrebare nouă. Mulțumesc!

În loc să folosești hook-ul register_post pentru validare, ar trebui să utilizezi filtrul registration_errors. Vezi http://codex.wordpress.org/Plugin_API/Action_Reference/register_post
