Oddzielna rejestracja i logowanie dla różnych ról

17

Ustawiłem 2 nowe role dla mojej witryny za pomocą wtyczki „Członkowie” - „sprzedawcy” i „kupujących”.

Każda rola powinna mieć własną stronę rejestracji i login. Odwiedzający może zarejestrować się jako kupujący i sprzedający, ale może być zalogowany tylko jako jeden z nich. Jeśli więc użytkownik zaloguje się jako sprzedawca, a następnie przejdzie na stronę kupującego, będzie mógł zalogować się jako kupujący, a kiedy to zrobi, zostanie automatycznie wylogowany jako sprzedawca.

Godzinami szukałem wtyczki, która da mi taką możliwość, ale nie mogłem jej znaleźć. Brzmi jak dość powszechna konfiguracja w witrynach internetowych z różnymi rejestracjami ról.

Czy taka wtyczka w ogóle istnieje? A jeśli nie, jak można to zrobić?

Popiół
źródło
1
nie potrzebujesz osobnych formularzy, tylko pojedynczy formularz rejestracyjny z możliwością wyboru roli. po zarejestrowaniu się w roli każdy może korzystać z tej samej strony logowania. jeśli ktoś zarejestruje się jako kupujący, nie ma sposobu, aby zalogować się jako kupujący za pomocą swoich danych uwierzytelniających. może coś takiego wskaże ci właściwy kierunek.
Milo,
możesz użyć tego linku wordpress.stackexchange.com/questions/237248/…
Charles Xavier

Odpowiedzi:

17

Utworzenie dwóch osobnych rejestracji dla różnych ról jest łatwe:

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

a teraz możesz połączyć każdą rolę z „własnym” formularzem rejestracyjnym:

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

ale jak zauważył Milo:

„jeśli ktoś zarejestruje się jako kupujący, nie ma sposobu, aby zalogować się jako kupujący za pomocą swoich danych uwierzytelniających”

co oznacza, że ​​będą musieli użyć innego adresu e-mail, aby zarejestrować inną rolę.

Aktualizacja

jest to aktualizacja z przykładem pokazującym, w jaki sposób możesz używać tego samego przedniego, ale z różnymi polami dla każdej roli.

Musisz tylko trochę zmienić funkcje:

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

w ten sposób wyświetlane są tylko pola wymagane przez określoną rolę.

Następnie, jeśli chcesz mieć jakąś weryfikację tych dodatkowych pól, możesz użyć register_posthaka na przykład:

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

to jeśli wszystko jest w porządku, zapisz pola w meta użytkownika na podstawie roli

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
źródło
Dziękujemy Bainternet i Milo! Tak, mam na myśli, że gość zarejestruje się dwukrotnie - raz jako sprzedawca, a drugi jako kupujący, z różnymi e-mailami. Potrzebuję jednak dwóch osobnych formularzy rejestracyjnych, ponieważ każdy z nich będzie zawierał różne pola. Na przykład: formularz rejestracyjny sprzedawcy będzie zawierał pola - „nazwa firmy” i „adres firmy”, natomiast formularz rejestracyjny kupującego będzie zawierał pole „nazwa kupującego”. Tak więc, Bainternet, nie jestem pewien, czy mogę użyć twojego kodu takim, jaki jest (ale bardzo dziękuję za wysiłek), ponieważ wskazuje on tę samą stronę tylko z różnymi parametrami. Jak mogę to zrobić za pomocą dwóch oddzielnych formularzy?
Ash
@ Ash: nadal nie potrzebujesz dwóch osobnych formularzy, po prostu dodaj pola w zależności od roli, zaktualizuję swoją odpowiedź przykładem.
Bainternet
@ Ash: sprawdź aktualizację w odpowiedzi.
Bainternet
@Bainternet, wielkie dzięki za dodatkowy kod!
Ash
@Bainternet: Przepraszam za pytanie dla początkujących, ale tym właśnie jestem :-) - czy ten kod jest użyteczny tylko we wtyczce, czy może być również użyty w pliku php, który jest szablonem strony?
Ash