Registrazione e login separati per ruoli diversi
Ho impostato 2 nuovi ruoli per il mio sito utilizzando il plugin "Members" - "venditori" e "acquirenti".
Ogni ruolo dovrebbe avere la propria pagina di registrazione e login. Un visitatore può registrarsi sia come acquirente che come venditore ma può essere loggato solo con uno dei due ruoli. Quindi, se un visitatore ha effettuato l'accesso come venditore e poi va alla pagina dell'acquirente, potrà accedere come acquirente e quando lo farà verrà automaticamente disconnesso come venditore.
Ho cercato per ore un plugin che mi desse la possibilità di fare questo ma non sono riuscito a trovarne uno. Sembra essere una configurazione abbastanza comune nei siti web con registrazioni per ruoli diversi.
Esiste un plugin del genere? E se non esiste come si può realizzare?

Creare due registrazioni separate per ruoli diversi è semplice:
//crea un campo nascosto per il ruolo
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');
//salva il ruolo
function update_role($user_id, $password="", $meta=array()) {
if (isset($_POST['role'])){
$userdata = array();
$userdata['ID'] = $user_id;
$userdata['role'] = $_POST['role'];
//consenti solo se il ruolo è my_role per evitare nuovi admin nel sito
if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
wp_update_user($userdata);
}
}
}
e ora puoi collegare ogni ruolo con il proprio modulo di registrazione:
venditore: http://example.com/wp-login.php?action=register&role=seller
acquirente: http://example.com/wp-login.php?action=register&role=buyer
ma come ha commentato Milo:
"se qualcuno si registra come acquirente, non potrà accedere come nient'altro che acquirente con le sue credenziali"
il che significa che dovrebbero usare un'email diversa per registrarsi nell'altro ruolo.
Aggiornamento
questo è un aggiornamento con un esempio per mostrare come puoi usare lo stesso modulo ma con campi diversi per ogni ruolo.
Quindi devi solo modificare un po' le funzioni:
//crea un campo nascosto per il ruolo e campi extra necessari
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"){
//aggiungi qui i campi extra per il venditore es:
?>
nome azienda:
<input id="user_email" type="text" tabindex="20" size="25" value="" name="business_name"/>
indirizzo azienda:
<input id="user_email" type="text" tabindex="20" size="25" value="" name="business_address"/>
<?php
}
if (isset($user_type) && $user_type == "buyer"){
//aggiungi qui i campi extra per l'acquirente es:
?>
nome acquirente:
<input id="user_email" type="text" tabindex="20" size="25" value="" name="buyer_name"/>
<?php
}
}
in questo modo vengono mostrati solo i campi necessari per il ruolo specifico.
Poi se vuoi avere una sorta di validazione per questi campi extra puoi usare l'hook register_post
per esempio:
add_action('register_post','my_user_fields_validation',10,3);
function my_user_fields_validation($login, $email, $errors) {
global $firstname, $lastname;
//ottieni il ruolo da verificare
if (isset($_POST['role'])){
$user_type = $_POST['role'];
}
//controlla i campi in base al ruolo
if (isset($user_type) && $user_type == "seller"){
//controlla i campi del venditore
if ($_POST['business_name'] == '') {
$errors->add('empty_business_name', "<strong>ERRORE</strong>: Inserisci il nome dell'azienda");
}
if ($_POST['business_address'] == '') {
$errors->add('empty_business_address', "<strong>ERRORE</strong>: Inserisci l'indirizzo dell'azienda");
}
}
if (isset($user_type) && $user_type == "buyer"){
//controlla i campi dell'acquirente
if ($_POST['buyer_name'] == '') {
$errors->add('empty_buyer_name', "<strong>ERRORE</strong>: Inserisci il nome dell'acquirente");
}
}
}
poi se tutto è a posto salva semplicemente i campi nei metadati dell'utente in base al ruolo
add_action('user_register', 'update_role');
//salva il ruolo
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'];
//consenti solo se il ruolo è my_role per evitare nuovi admin nel sito
if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
wp_update_user($userdata);
}
if (isset($user_type) && $user_type == "seller"){
//salva i campi del venditore
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"){
//salva i campi dell'acquirente
update_user_meta($user_id, 'buyer_name', $_POST['buyer_name']);
}
}
}

Grazie Bainternet e Milo!
Sì, intendo che il visitatore si registrerà due volte - una come venditore e un'altra come acquirente, con email diverse.
Ma ho bisogno di due moduli di registrazione separati poiché ognuno di essi conterrà campi diversi. Ad esempio: il modulo di registrazione del venditore includerà i campi - "nome attività" e "indirizzo attività" mentre il modulo di registrazione dell'acquirente includerà il campo "nome acquirente".
Quindi, Bainternet, non sono sicuro di poter usare il tuo codice così com'è (ma grazie mille per lo sforzo) poiché punta alla stessa pagina solo con parametri diversi.
Come posso farlo con due moduli separati?

@Ash: non hai ancora bisogno di due moduli separati, aggiungi semplicemente i campi in base al ruolo, ho aggiornato la mia risposta con un esempio.

@Bainternet: Scusa la domanda da principiante ma è quello che sono :-) - questo codice è utilizzabile solo in un plugin o può essere usato anche in un file php che è un template per una pagina?

Sia plugin che nel functions.php del tema, qualsiasi altra cosa richiederebbe di includere file aggiuntivi.

@Bainternet: OK. Il problema di registrazione è chiaro. Molto apprezzato!
Puoi per favore riferirti al problema di login? So che non è il comportamento usuale di WordPress ma è così che deve funzionare il mio sito.
Per essere più chiaro questo è il comportamento che mi serve - se un visitatore ha effettuato il login come acquirente e poi va alla pagina di login dei venditori dovrebbe vedersi come non loggato come venditore. Poi, se effettua il login come venditore verrà automaticamente disconnesso come acquirente. Altrimenti, se torna alla pagina degli acquirenti, dovrebbe vedersi ancora loggato come acquirente.
Grazie ancora.

@bainternet, sugli errori, la funzione my_user_fields_validation
ricarica/riutilizza il link http://example.com/wp-login.php?action=register
e non il link specifico per il ruolo, ad esempio http://example.com/wp-login.php?action=register&role=seller
. Puoi migliorare questa funzione?

@lurie puoi impostare e leggere un cookie del ruolo. fai una nuova domanda e ti aiuterò.

@Bainternet, ho posto una nuova domanda. Grazie!

Invece di usare l'hook register_post per la validazione, dovresti usare il filtro registration_errors. Vedi http://codex.wordpress.org/Plugin_API/Action_Reference/register_post
