web-dev-qa-db-fra.com

Enregistrement séparé et connexion pour différents rôles

J'ai défini 2 nouveaux rôles pour mon site à l'aide du plug-in "Membres" - "vendeurs" et "acheteurs".

Chaque rôle doit avoir sa propre page d’enregistrement et sa propre connexion. Un visiteur peut s'inscrire à la fois comme acheteur et vendeur, mais il ne peut être connecté que comme l'un d'entre eux. Ainsi, si un visiteur s'est connecté en tant que vendeur puis se rend sur la page de l'acheteur, il pourra se connecter en tant qu'acheteur et, lorsqu'il le fera, il sera automatiquement déconnecté en tant que vendeur.

J'ai cherché pendant des heures un plugin qui me donnerait la possibilité de le faire, mais je n'en ai pas trouvé. Cela ressemble à une configuration assez commune sur des sites Web avec différents enregistrements de rôles.

Un tel plugin existe-t-il? Et si non, comment cela peut-il être fait?

17
Ash

La création de deux inscriptions distinctes pour différents rôles est simple:

//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);
       }
   }
}

et maintenant vous pouvez associer chaque rôle à "son propre" formulaire d'inscription:

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

mais comme Milo a commenté:

"si quelqu'un s'enregistre en tant qu'acheteur, il est impossible pour lui de se connecter autrement qu'en achetant avec ses informations d'identification"

ce qui signifie qu'ils devront utiliser un courrier électronique différent pour enregistrer l'autre rôle.

Mettre à jour

ceci est une mise à jour avec un exemple pour montrer comment utiliser le même élément mais avec des champs différents pour chaque rôle.

Il suffit donc de changer un peu les fonctions:

//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
    }
}

de cette façon, seuls les champs nécessaires au rôle spécifique sont affichés.

Ensuite, si vous voulez avoir une sorte de validation pour ces champs supplémentaires, vous pouvez utiliser register_post hook par exemple:

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");
        }
    }
}

alors si tout va bien il suffit de sauvegarder les champs dans la méta de l'utilisateur en fonction du rôle

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']);
        }
   }
}
17
Bainternet