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

16

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 son propre identifiant. 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 s’affiche sur la page de l’acheteur, il pourra se connecter en tant qu’acheteur et, ce faisant, 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 plugin tel que celui-ci existe-t-il? Et si non, comment cela peut-il être fait?

    
posée Ash 29.04.2011 - 17:26

1 réponse

17

Il est facile de créer deux inscriptions distinctes pour différents rôles:

//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 vous pouvez maintenant 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'inscrit en tant qu'acheteur,   il est impossible qu'ils se connectent en tant que   tout sauf acheteur avec leur   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 montrant comment vous pouvez utiliser le même élément mais avec des champs différents pour chaque rôle.

Il vous suffit donc de modifier 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
    }
}

Ainsi, seuls les champs nécessaires au rôle spécifique sont affichés.

Ensuite, si vous souhaitez appliquer une sorte de validation à 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, sauvegardez simplement 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']);
        }
   }
}
    
réponse donnée Bainternet 29.04.2011 - 23:49

Lire d'autres questions sur les étiquettes