对于任何可能问过相同问题或至少思考过相同问题的人。。。下面是我如何处理这种情况的。
请记住,此方案涉及更新现有用户群。已经有成百上千的用户积极参与这个社区网站。
我们正在改变网站的排名系统。(列组是自定义用户角色。)通过更多地参与社区,你可以获得更高的等级。因此,一旦用户实现了他们的目标,他们将被提升为一个新的自定义用户角色,可以更多地访问社区网站。
已经有自定义用户角色,并分配给社区的每个用户。我们只是想更改自定义用户角色的名称,再添加一些,并为这些列组分配新权限(用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实际注册新创建的自定义用户角色。