在添加自定义用户角色之前还是之后添加自定义用户权能?

时间:2012-10-11 作者:Michael Ecklund

是否应该在添加自定义用户角色之前添加自定义用户功能,或者相反?

  • add_role() 请求和数组$capabilities 在函数的第三个参数中
  • add_cap() 要求提供$role 将该功能应用于函数的第一个参数
两者add_role()add_cap() 需要在插件激活或主题激活时启动。

我在想,使用add_cap() 并将功能列表存储在类属性数组中。然后,使用创建每个自定义用户角色add_role(), 并将新创建的功能从类属性数组添加到$capabilities 每个的参数add_role() 作用

我将使用添加每个自定义用户角色add_role() 并为要添加的角色设置每个功能的类属性数组。然后,对于每个自定义用户角色的每个功能,我将使用add_cap().

两者的执行顺序add_role()add_cap() 和谐让我困惑。我们非常感谢您对这一特殊情况的任何见解。

或者我应该不使用add_cap()? 我是否可以为每个用户角色设置一组功能,然后将它们传递到$capabilities 的参数add_role() 作用

2 个回复
最合适的回答,由SO网友:kaiser 整理而成

这是有原因的add_role()$capabilities 作为第三个参数。

首先,了解使用函数时发生的情况WP_Roles->add_role() - 类方法然后检查角色是否已经存在。如果是,则中止WP_Roles->roles[] 具有的数组display_name (2)至$wpdb->prefix . \'user_roles\' 选项表条目(数组)

结论

因此,如果在创建角色时没有正确添加功能,则会使用空功能保存角色。

关于法典的注释永远不要相信法典。根本没有调用任何函数add_cap(). 里面只有类方法WP_Roles, WP_RoleWP_User 就是这样命名的。(如果我有时间,将更新Codex条目。)

SO网友:Michael Ecklund

对于任何可能问过相同问题或至少思考过相同问题的人。。。下面是我如何处理这种情况的。

请记住,此方案涉及更新现有用户群。已经有成百上千的用户积极参与这个社区网站。

我们正在改变网站的排名系统。(列组是自定义用户角色。)通过更多地参与社区,你可以获得更高的等级。因此,一旦用户实现了他们的目标,他们将被提升为一个新的自定义用户角色,可以更多地访问社区网站。

已经有自定义用户角色,并分配给社区的每个用户。我们只是想更改自定义用户角色的名称,再添加一些,并为这些列组分配新权限(用WordPress的术语来说,为每个自定义用户角色添加新功能)。

步骤1-更新用户元获取所有用户,确定其当前自定义用户角色,添加新角色,并删除任何其他现有角色。(我们安全列出了一些已经存在的用户角色,因为我们想确保这些角色保持原样,而不是修改或删除。)

Note: 此步骤实际上并没有添加任何自定义用户角色。它本质上只是更新每个用户的用户元,以便WordPress知道他们有什么角色,以及以后应该检查哪些注册角色的权限或功能。

private function update_user_roles(){
    global $wp_roles;   

    /* Don\'t update users with these roles. */
    $safelisted_roles = array(
        \'administrator\',
        \'editor\',
        \'author\',
        \'contributor\',
        \'subscriber\', 
        \'bbp_moderator\',
        \'bbp_participant\'
    );

    /* Convert existing user\'s role to the newly added roles. */
    $users = get_users();
    for($i = 0; $i < count($users); $i++){
        $user = new WP_User($users[$i]->ID);
        /* Skip user, if user has no roles. */
        if(is_array($user->roles) && empty($user->roles) || !is_array($user->roles)){
            continue;
        }
        foreach($user->roles as $role){
            if($role == \'rank_name\'){// Existing user role
                $user->add_role(\'new_rank_name\');// New user role
            } else{
                /* Set remaining users as Subscribers, ignoring safe-listed user roles. */
                if(!in_array($role, $safelisted_roles)){
                    $user->add_role(\'subscriber\');// Reset everyone to default role.
                }
            }
            /* Remove the old junky roles from the user, ignoring safe-listed user roles. */
            if(!in_array($role, $safelisted_roles)){
                $user->remove_role($role);
            }
        }
    }
}
所以为了进行回顾,我们基本上检查了每个用户,检查了他们当前的用户角色,并决定是否给他们一个新角色。如果用户的角色在安全列表中,则其角色保持不变。

第2步-定义新的用户角色和功能要使代码更整洁、更有条理,请创建一种单独的方法来准备新的用户角色和功能。这使您能够更好地管理每个自定义用户角色的功能,并使添加所有内容变得更简单、更整洁。

我们将此方法中的数据存储在类属性中($this->user_capabilities), 在数组格式中,将在下一步中使用。

/* Prepare specific permissions for each new user role. */
public function set_user_capabilities(){
    $this->user_capabilities[] = array(
        \'role_key\' => \'new_rank_one\',// Registered role name
        \'role_value\' => \'Rank One\',// Role display name
        \'capabilities\' => array(// Permissions
            \'new_capability_one\' => true,
            \'new_capability_two\' => false,
            \'new_capability_three\' => false
        )
    );
    $this->user_capabilities[] = array(
        \'role_key\' => \'new_rank_two\',
        \'role_value\' => \'Rank Two\',
        \'capabilities\' => array(
            \'new_capability_one\' => true,
            \'new_capability_two\' => true,
            \'new_capability_three\' => false
        )
    );
    $this->user_capabilities[] = array(
        \'role_key\' => \'new_rank_three\',
        \'role_value\' => \'Rank Three\',
        \'capabilities\' => array(
            \'new_capability_one\' => true,
            \'new_capability_two\' => true,
            \'new_capability_three\' => true
        )
    );
}
作为概述,类属性的键$this->user_capabilities 是放置要添加的自定义用户角色的位置。在阵列中,包含角色将具有的每个功能。这些功能允许对站点进行更多访问。

Notice: 三个新用户角色如何共享相同的功能?第一个用户角色仅继承第一个功能的权限,第二个用户角色继承前两个功能的权限,因为它们的级别更高,而第三个用户角色继承所有三个功能的权限,因为这是最重要的级别,拥有最多的权限。

步骤3-定义共享权限并创建用户角色我们需要设置一些所有注册用户都需要共享的通用功能。因此,在添加每个新的自定义用户角色之前,我们只是创建了一个单独的共享功能数组,并将其与步骤2中创建的每个特定用户角色的功能合并,这些功能存储在class属性中($this->user_capabilities). 再一次,我们需要尊重我们安全列出的用户角色。

/* Add custom user roles for registered members. */
public function set_user_roles(){
    global $wp_roles;

    /* Global capabilities for all registered users. */
    $user_capabilities = array(
        \'bp_groups\' => true,
        \'bp_groups_create\' => true,
        \'bp_groups_join\' => true,
        \'bp_groups_directory\' => true,
        \'bp_groups_search\' => true
    );

    /* Don\'t update users with these roles. */
    $safelisted_roles = array(
        \'administrator\',
        \'editor\',
        \'author\',
        \'contributor\',
        \'subscriber\', 
        \'bbp_moderator\',
        \'bbp_participant\'
    );

    /* Remove old junky user roles. */
    foreach($wp_roles->get_names() as $role_name => $display_name){
        if(!in_array($role_name, $safelisted_roles)){
            $wp_roles->remove_role($role_name);
        }
    }

    /* Add new custom user roles. */
    for($i = 0; $i < count($this->user_capabilities); $i++){
        $role = $this->user_capabilities[$i];
        $capabilities = array_merge($user_capabilities, $role[\'capabilities\']);
        $wp_roles->add_role($role[\'role_key\'], $role[\'role_value\'], $capabilities);
    }

}
最后总结。。。我们设置了所有注册用户都需要共享的功能权限列表,无论他们的级别如何。然后,我们删除了每个使用WordPress注册的注册自定义用户角色(除非列出了不修改的安全选项)。然后,我们继续创建每个新的自定义用户角色,并为每个新用户角色分配所有功能。我们在步骤1的用户元中设置的角色现在将在WordPress中生效。

结论这对我很有效。使用您计划添加的角色更新所有用户的元数据。然后,继续使用WordPress实际注册新创建的自定义用户角色。

结束

相关推荐

Ajax for non-logged-in users

我正在开发一个插件,它可以从未登录用户(如Like按钮)捕获一些数据,并根据post\\u id将其输入数据库。我的插件对登录用户很好,但非登录用户在AJAX中会产生“-1”响应。我猜这与写入数据库的身份验证障碍有关,但我正在寻找一种解决方法。有什么想法吗?编辑:以下是代码:http://pastebin.com/ghtvJNiW我是根据Love-It AJAX plugin 皮平。他在教程中说,这只适用于登录用户,但我需要让它也适用于未登录用户。