Отдельная регистрация и логин для разных ролей

17

Я установил 2 новые роли для своего сайта с помощью плагина «Участники» - «продавцы» и «покупатели».

Каждая роль должна иметь свою страницу регистрации и логин. Посетитель может зарегистрироваться как покупатель и продавец, но он может быть зарегистрирован только как один из них. Таким образом, если посетитель вошел в систему в качестве продавца и затем перешел на страницу покупателя, он сможет войти в систему в качестве покупателя, а когда он это сделает, он автоматически выйдет из системы в качестве продавца.

Я часами искал плагин, который даст мне возможность сделать это, но не смог его найти. Похоже, довольно распространенная конфигурация на сайтах с разной регистрацией ролей.

Есть ли такой плагин, как этот? А если нет, то как это можно сделать?

ясень
источник
1
вам не нужны отдельные формы, просто одна форма регистрации со средствами выбора роли. Как только они зарегистрированы на роль, каждый может использовать одну и ту же страницу входа. если кто-то регистрируется в качестве покупателя, он не может войти в систему как покупатель со своими учетными данными. может быть, что-то подобное укажет вам правильное направление.
Майло
Вы можете использовать эту ссылку wordpress.stackexchange.com/questions/237248/…
Чарльз Ксавьер

Ответы:

17

Создать две отдельные регистрации для разных ролей легко:

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

и теперь вы можете связать каждую роль с «своей» формой регистрации:

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

но, как заметил Майло:

«если кто-то регистрируется как покупатель, он не может войти в систему как покупатель со своими учетными данными»

Это означает, что им придется использовать другой адрес электронной почты, чтобы зарегистрировать другую роль.

Обновить

Это обновление с примером, показывающим, как можно использовать один и тот же передний план, но с разными полями для каждой роли.

Так что вам просто нужно немного изменить функции:

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

таким образом отображаются только поля, необходимые для конкретной роли.

Далее, если вы хотите провести какую-то проверку этих дополнительных полей, вы можете использовать register_postловушку, например:

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

тогда, если все хорошо, просто сохраните поля в пользовательской мета в зависимости от роли

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']);
        }
   }
}
Bainternet
источник
Спасибо Bainternet & Milo! Да, я имею в виду, что посетитель будет регистрироваться дважды - один раз как продавец, а другой как покупатель, с разными электронными письмами. Но мне нужны две отдельные регистрационные формы, так как каждая из них будет содержать разные поля. Например: форма регистрации продавца будет содержать поля - «название компании» и «бизнес-адрес», а форма регистрации покупателя будет содержать поле «имя покупателя». Итак, Bainternet, я не уверен, что смогу использовать ваш код как есть (но большое спасибо за усилия), поскольку он указывает на одну и ту же страницу только с разными параметрами. Как я могу сделать это с двумя отдельными формами?
Пепел
@Ash: вам все еще не нужны две отдельные формы, просто добавьте поля, основанные на роли, я обновлю свой ответ на примере.
Bainternet
@Ash: проверьте обновление в ответе.
Bainternet
@Bainternet, Большое спасибо за дополнительный код!
Эш
@Bainternet: Извините за вопрос новичка, но это то, чем я являюсь :-) - этот код можно использовать только в плагине или его также можно использовать в php-файле, который является шаблоном для страницы?
Эш