分别注册和登录不同角色


17

我已使用“会员”插件为我的网站设置了2个新角色-“卖家”和“买家”。

每个角色应具有其自己的注册页面和登录名。访客可以同时注册为买方和卖方,但只能以其中之一身份登录。因此,如果访问者已经以卖方身份登录,然后转到买方页面,那么他将能够以买方身份登录,当他这样做时,他将自动以卖方身份注销。

我搜索了一个小时的插件,该插件可以让我选择执行此操作,但找不到一个。在具有不同角色注册的网站中,这听起来很常见。

这样的插件是否存在?如果没有,怎么办?


1
您不需要单独的表格,只需一个注册表格即可选择角色。一旦注册了角色,每个人都可以使用相同的登录页面。如果有人注册为买家,则除了拥有买家的凭证外,他们无法以其他任何身份登录。或许真的像这样将指向您在正确的方向。
Milo

Answers:


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

但正如Milo所说:

“如果有人注册为买家,除了拥有买家的凭证外,他们无法以其他任何身份登录”

这意味着他们将不得不使用其他电子邮件来注册其他角色。

更新资料

这是一个带有示例的更新,以显示您如何使用相同的前台,但每个角色具有不同的字段。

因此,您只需要稍微更改一下功能即可:

//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文件中使用?
灰烬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.