Окрема реєстрація та реєстрація для різних ролей


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 & Milo! Так, я маю на увазі, відвідувач зареєструється двічі - один раз як продавець, а інший як покупець, з різними електронними листами. Але мені потрібні дві окремі форми реєстрації, оскільки кожна з них буде містити різні поля. Наприклад: форма реєстрації продавця буде містити поля - "назва компанії" та "адреса компанії", тоді як форма реєстру покупця міститиме поля "найменування покупця". Отже, Bainternet, я не впевнений, що я можу використовувати ваш код таким, який він є (але дякую за зусилля), оскільки він вказує на ту саму сторінку лише з різними параметрами. Як я можу це зробити з двома окремими формами?
Еш

@Ash: вам все одно не потрібні дві окремі форми, просто додайте поля на основі ролі, я оновив свою відповідь прикладом.
Bainternet

@Ash: перевірити оновлення у відповіді.
Bainternet

@Bainternet, Дякую за додатковий код!
Еш

@Bainternet: Вибачте за запитання про новачків, але це я :-) - це код, який можна використовувати лише у плагіні, чи його можна використовувати у файлі php, який є шаблоном для сторінки?
Еш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.