Registrazione e login separati per ruoli diversi

29 apr 2011, 18:26:42
Visualizzazioni: 31.6K
Voti: 17

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?

2
Commenti

non hai bisogno di form separati, basta un singolo modulo di registrazione con un mezzo per selezionare il ruolo. una volta registrati con un ruolo, tutti possono utilizzare la stessa pagina di login. se qualcuno si registra come acquirente, non c'è modo che possa accedere come altro che acquirente con le proprie credenziali. forse qualcosa come questo ti indirizzerà nella giusta direzione.

Milo Milo
29 apr 2011 19:13:29
Tutte le risposte alla domanda 1
11
17

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']);
        }
   }
}
30 apr 2011 00:49:30
Commenti

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 Ash
1 mag 2011 13:51:24

@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 Bainternet
1 mag 2011 17:01:41

@Ash: controlla l'aggiornamento nella risposta.

Bainternet Bainternet
1 mag 2011 17:24:40

@Bainternet, grazie mille per il codice aggiuntivo!

Ash Ash
2 mag 2011 12:10:48

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

Ash Ash
2 mag 2011 12:13:19

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

Bainternet Bainternet
2 mag 2011 12:47:18

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

Ash Ash
2 mag 2011 15:40:40

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

Iurie Iurie
28 ago 2013 14:09:19

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

Bainternet Bainternet
28 ago 2013 14:39:01

@Bainternet, ho posto una nuova domanda. Grazie!

Iurie Iurie
28 ago 2013 15:56:14

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

Tim Tim
28 ago 2015 11:30:57
Mostra i restanti 6 commenti