Separare la registrazione e il login per ruoli diversi


17

Ho impostato 2 nuovi ruoli per il mio sito utilizzando il plug-in "Membri" - "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ò accedere solo come uno di essi. Pertanto, se un visitatore ha effettuato l'accesso come venditore e quindi accede alla pagina dell'acquirente, sarà in grado di accedere come acquirente e quando lo farà verrà automaticamente disconnesso come venditore.

Ho cercato per ore un plugin che mi avrebbe dato la possibilità di farlo ma non sono riuscito a trovarne uno. Sembra una configurazione abbastanza comune nei siti Web con diverse registrazioni di ruoli.

Esiste un plugin come questo? E se no come si può fare?


1
non hai bisogno di moduli separati, solo un singolo modulo di registro con un mezzo per selezionare il ruolo. una volta registrati per un ruolo, tutti possono utilizzare la stessa pagina di accesso. se qualcuno si registra come un acquirente, non è possibile accedere come nient'altro che acquirente con le proprie credenziali. forse qualcosa del genere ti indicherà la giusta direzione.
Milo,

Risposte:


17

Creare due registrazioni separate per ruoli diversi è facile:

//create a hidden field for role
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');

//save the the role
function update_role($user_id, $password="", $meta=array()) {
   if (isset($_POST['role'])){
       $userdata = array();
       $userdata['ID'] = $user_id;
       $userdata['role'] = $_POST['role'];

       //only allow if user role is my_role to avoid a few new admins to the site
       if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
          wp_update_user($userdata);
       }
   }
}

e ora puoi collegare ogni ruolo con il "suo" modulo di registrazione:

seller: http://example.com/wp-login.php?action=register&role=seller
buyer: http://example.com/wp-login.php?action=register&role=buyer

ma come ha commentato Milo:

"se qualcuno si registra come acquirente, non è possibile accedere come nient'altro che acquirente con le proprie credenziali"

il che significa che dovrebbero utilizzare una diversa e-mail per registrare l'altro ruolo.

Aggiornare

questo è un aggiornamento con un esempio per mostrare come è possibile utilizzare la stessa priorità ma con campi diversi per ciascun ruolo.

Quindi devi solo cambiare un po 'le funzioni:

//create a hidden field for role and extra fields needed
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"){
        //add extra seller fields here eg:
        ?>
        business name:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="business_name"/>

        business address:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="business_address"/>
        <?php
    }
    if (isset($user_type) && $user_type == "buyer"){
        //add extra buyer fields here eg:
        ?>
        buyer name:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="buyer_name"/>
        <?php
    }
}

in questo modo vengono visualizzati solo i campi richiesti dal ruolo specifico.

Il prossimo è se vuoi avere un qualche tipo di validazione per questi campi extra puoi usare register_posthook per esempio:

add_action('register_post','my_user_fields_validation',10,3);

function my_user_fields_validation($login, $email, $errors) {
    global $firstname, $lastname;
    //get the role to check
    if (isset($_POST['role'])){
        $user_type = $_POST['role'];
    }
    //check the fields according to the role
    if (isset($user_type) && $user_type == "seller"){
    //check sellers fields
        if ($_POST['business_name'] == '') {
            $errors->add('empty_business_name', "<strong>ERROR</strong>: Please Enter in a Business name");
        }
        if ($_POST['business_address'] == '') {
            $errors->add('empty_business_address', "<strong>ERROR</strong>: Please Enter in Business address");
        } 
    }
    if (isset($user_type) && $user_type == "buyer"){
        //check buyers fields
        if ($_POST['buyer_name'] == '') {
            $errors->add('empty_buyer_name', "<strong>ERROR</strong>: Please Enter in a Buyer name");
        }
    }
}

quindi se tutto va bene basta salvare i campi nella meta utente in base al ruolo

add_action('user_register', 'update_role');

//save the role
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'];
       //only allow if user role is my_role to avoid a few new admins to the site
        if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
            wp_update_user($userdata);
        }
        if (isset($user_type) && $user_type == "seller"){
            //save sellers fields
            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"){
            //save sellers fields
            update_user_meta($user_id, 'buyer_name', $_POST['buyer_name']);
        }
   }
}

Grazie Bainternet e Milo! Sì, intendo dire che il visitatore si registrerà due volte, una volta come venditore e un altro 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 del registro del venditore includerà i campi - "ragione sociale" e "indirizzo commerciale" mentre il modulo del registro dell'acquirente includerà il campo "nome dell'acquirente". Quindi, Bainternet, non sono sicuro di poter usare il tuo codice così com'è (ma grazie mille per lo sforzo) dal momento che punta alla stessa pagina solo con parametri diversi. Come posso farlo con due moduli separati?
Ash,

@Ash: non hai ancora bisogno di due moduli separati, basta aggiungere i campi in base al ruolo, aggiornerò la mia risposta con un esempio.
Bainternet,

@Ash: controlla l'aggiornamento nella risposta.
Bainternet,

@Bainternet, grazie mille per il codice aggiuntivo!
Ash,

@Bainternet: mi dispiace per la domanda da principiante, ma questo è quello che sono :-) - questo codice è utilizzabile solo in un plugin o può anche essere usato in un file php che è un modello per una pagina?
Ash,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.