Đăng ký riêng và đăng nhập cho các vai trò khác nhau


17

Tôi đã đặt 2 vai trò mới cho trang web của mình bằng cách sử dụng plugin "Thành viên" - "người bán" và "người mua".

Mỗi vai trò nên có trang đăng ký và đăng nhập riêng. Một khách truy cập có thể đăng ký với tư cách là người mua và người bán nhưng anh ta chỉ có thể đăng nhập với tư cách là một trong số họ. Vì vậy, nếu khách truy cập đã đăng nhập với tư cách là người bán và sau đó truy cập trang người mua, anh ta sẽ có thể đăng nhập với tư cách người mua và khi đó, anh ta sẽ tự động đăng xuất với tư cách người bán.

Tôi đã tìm kiếm hàng giờ cho một plugin sẽ cho tôi tùy chọn để làm điều này nhưng không thể tìm thấy một plugin. Âm thanh như một cấu hình khá phổ biến trong các trang web với đăng ký vai trò khác nhau.

Liệu một plugin như thế này thậm chí còn tồn tại? Và nếu không làm thế nào điều này có thể được thực hiện?


1
bạn không cần các biểu mẫu riêng biệt, chỉ cần một biểu mẫu đăng ký duy nhất với phương tiện chọn vai trò. một khi họ đã đăng ký một vai trò, mọi người đều có thể sử dụng cùng một trang đăng nhập. nếu ai đó đăng ký làm người mua, không có cách nào họ có thể đăng nhập như bất kỳ thứ gì ngoại trừ người mua bằng thông tin đăng nhập của họ. có thể một cái gì đó như thế này sẽ chỉ cho bạn đi đúng hướng.
Milo

bạn có thể sử dụng liên kết này wordpress.stackexchange.com/questions/237248/ cấp
Charles Xavier

Câu trả lời:


17

Tạo hai đăng ký riêng biệt cho các vai trò khác nhau thật dễ dàng:

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

và bây giờ bạn có thể liên kết từng vai trò với mẫu đăng ký "của chính nó":

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

nhưng như Milo đã nhận xét:

"nếu ai đó đăng ký làm người mua, không có cách nào họ có thể đăng nhập như bất kỳ thứ gì ngoại trừ người mua bằng thông tin đăng nhập của họ"

điều đó có nghĩa là họ sẽ phải sử dụng một email khác để đăng ký vai trò khác.

Cập nhật

đây là một bản cập nhật với một ví dụ để cho thấy cách bạn có thể sử dụng cùng một fore nhưng với các trường khác nhau cho mỗi vai trò.

Vì vậy, bạn chỉ cần thay đổi các chức năng một chút:

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

cách này chỉ các trường cần thiết cho vai trò cụ thể được hiển thị.

Tiếp theo là nếu bạn muốn có một số loại xác thực cho các trường bổ sung này, bạn có thể sử dụng register_posthook chẳng hạn:

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

sau đó nếu mọi thứ đều ổn, chỉ cần lưu các trường trong meta người dùng dựa trên vai trò

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

Cảm ơn bạn Bai Internet & Milo! Vâng, ý tôi là khách truy cập sẽ đăng ký hai lần - một lần với tư cách là người bán và một người khác là người mua, với các email khác nhau. Nhưng tôi cần hai mẫu đăng ký riêng biệt vì mỗi mẫu sẽ chứa các trường khác nhau. Ví dụ: biểu mẫu reg của người bán sẽ bao gồm các trường - "tên doanh nghiệp" và "địa chỉ doanh nghiệp" trong khi biểu mẫu reg của người mua sẽ bao gồm trường "tên người mua". Vì vậy, Bai Internet, tôi không chắc mình có thể sử dụng mã của mình như vậy (nhưng cảm ơn rất nhiều vì nỗ lực) vì nó chỉ vào cùng một trang với các tham số khác nhau. Làm thế nào tôi có thể làm điều đó với hai hình thức riêng biệt?
Tro

@Ash: bạn vẫn không cần hai biểu mẫu riêng biệt, chỉ cần thêm các trường dựa trên vai trò, tôi sẽ cập nhật câu trả lời của tôi bằng một ví dụ.
Bai Internet

@Ash: kiểm tra cập nhật trong câu trả lời.
Bai Internet

@Bai Internet, Cảm ơn rất nhiều về mã bổ sung!
Tro

@BaiNET: Xin lỗi vì câu hỏi của người mới nhưng đó là tôi :-) - mã này chỉ có thể sử dụng được trong một plugin hay nó cũng có thể được sử dụng trong tệp php là mẫu cho một trang?
Tro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.