Inscription et connexion séparées pour différents rôles


17

J'ai défini 2 nouveaux rôles pour mon site en utilisant le plugin "Membres" - "vendeurs" et "acheteurs".

Chaque rôle doit avoir sa propre page d'inscription et sa propre connexion. Un visiteur peut s'inscrire à la fois comme acheteur et comme vendeur, mais il ne peut être connecté que comme l'un d'eux. Ainsi, si un visiteur s'est connecté en tant que vendeur et se rend ensuite 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'ai pas pu en trouver un. Cela ressemble à une configuration assez courante dans les sites Web avec des enregistrements de rôles différents.

Existe-t-il un plugin comme celui-ci? Et sinon, comment faire?


1
vous n'avez pas besoin de formulaires séparés, juste un seul formulaire d'enregistrement avec un moyen de sélectionner le rôle. une fois qu'ils sont inscrits à un rôle, tout le monde peut utiliser la même page de connexion. si quelqu'un s'inscrit en tant qu'acheteur, il est impossible de se connecter en tant qu'acheteur avec ses informations d'identification. peut-être que quelque chose comme ça vous indiquera la bonne direction.
Milo

Réponses:


17

Il est facile de créer deux enregistrements distincts pour des rôles différents:

//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 lier chaque rôle avec "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 l'a commenté:

"Si quelqu'un s'inscrit en tant qu'acheteur, il est impossible de se connecter en tant qu'acheteur avec ses informations d'identification"

ce qui signifie qu'ils devraient utiliser un autre e-mail pour enregistrer l'autre rôle.

Mise à jour

il s'agit d'une mise à jour avec un exemple pour montrer comment vous pouvez utiliser le même avant 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
    }
}

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

Ensuite, si vous souhaitez avoir une sorte de validation de ces champs supplémentaires, vous pouvez utiliser le register_posthook 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, enregistrez simplement les champs dans la méta 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']);
        }
   }
}

Merci Bainternet & Milo! Oui, je veux dire que le visiteur s'inscrira deux fois - une fois en tant que vendeur et une autre en tant qu'acheteur, avec différents e-mails. Mais j'ai besoin de deux formulaires d'inscription distincts car chacun d'eux contiendra des champs différents. Par exemple: le formulaire d'enregistrement du vendeur comprendra les champs «nom commercial» et «adresse commerciale» tandis que le formulaire d'enregistrement de l'acheteur comprendra le champ «nom de l'acheteur». Donc, Bainternet, je ne suis pas sûr de pouvoir utiliser votre code tel quel (mais merci beaucoup pour l'effort) car il pointe vers la même page uniquement avec des paramètres différents. Comment puis-je le faire avec deux formulaires distincts?
Ash

@Ash: vous n'avez toujours pas besoin de deux formulaires distincts, ajoutez simplement les champs en fonction du rôle, je mettrai à jour ma réponse avec un exemple.
Bainternet

@Ash: vérifiez la mise à jour dans la réponse.
Bainternet

@Bainternet, merci beaucoup pour le code supplémentaire!
Ash

@Bainternet: Désolé pour la question des débutants mais c'est ce que je suis :-) - ce code est-il utilisable uniquement dans un plugin ou peut-il également être utilisé dans un fichier php qui est un modèle pour une page?
Ash
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.