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?
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.
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']);
}
}
}