我正在开发一个插件,添加新的用户角色:经理和员工。
经理应该是“伪管理员”。他们可以管理所有帖子内容(私有或其他),并且应该允许添加/编辑/删除员工或经理。
我大部分时间都在工作。已正确分配每个角色的功能,但当具有经理角色的用户添加新用户时,将保存该用户,但不分配任何角色。
I\'ve defined the capabilities for the Manager role as follows:
function wf_getManagerCaps() {
return array(
// [...] Stripped out the unrelated caps to keep this question on topic
"add_users" => true,
"create_users" => true,
"edit_users" => true,
"list_users" => true,
"promote" => true,
"remove" => true,
"delete" => true
// [...]
);
}
add_role("wf_manager", "WF Manager", wf_getManagerCaps());
<小时>
And I hooked into the "editable_roles"
filter to limit the Managers\' editable roles:
function wf_limitAvailableRoles( $roles ){
$user = wp_get_current_user();
if (in_array( WF_MANAGER_ROLE_SLUG, $user->roles)) {
$roles = array(
array(
"name" => "wf_manager",
"capabilities" => wf_getManagerCaps(),
),
array(
"name" => "wf_employee",
"capabilities" => wf_getEmployeeCaps(),
),
);
}
return $roles;
}
add_filter( \'editable_roles\', \'wf_limitAvailableRoles\' );
当添加一个新用户作为经理时,我只会看到“WF Employee”和“WF Manager”作为新用户角色的选项,但当我点击save时,新员工的角色设置为“None”。
我怀疑我缺少了一个需要连接的过滤器,但我不确定。非常感谢您的帮助。
更新只是为了好玩,我尝试在将新用户的角色添加到DB后更新它。我再次看到WF manager和WF Employee是可用的选项,但我的选择没有保存。因此,这很可能是由于经理角色缺少/不正确的功能,而不是“添加用户”过程缺少筛选器调用。
更新2我继续挖掘,但仍然没有找到答案。然而,我有更多的信息。
我将为我的经理角色定义的同一组用户功能添加到现有的WordPress角色(编辑器角色)。与管理员用户非常相似,编辑器可以在添加/编辑用户时成功选择角色,并按预期保存选择。
可能排除了自定义角色功能的“权限”问题,而是强调了自定义角色本身的潜在不足。当我发现更多时,我会不断更新。希望我(或其他人)最终能够提供答案。
最合适的回答,由SO网友:Mike 整理而成
这最终成为我所连接的函数的一个非常重要的问题editable_roles
.
目标:允许插件操作员添加新经理和新员工允许插件经理添加新员工问题:操作员和/或经理添加的新用户正在保存no role操作员/经理无法修改的角色existing users测试结果:
当相同的用户管理功能被赋予WP默认编辑器角色时,编辑器能够成功地添加/编辑用户角色。
由于该问题仅限于我的自定义角色,因此我暂时禁用了过滤器以查看会发生什么情况,并且一旦我不再限制可编辑角色,操作员和经理就可以添加新用户而不会出现问题。此时,我知道问题与我的过滤器功能有关。
我做了一个var_dump()
管理员的可编辑角色(不会被筛选),以及var_dump()
操作员的可编辑角色(将被筛选)。
长话短说,两个转储阵列的结构不匹配,这就是问题的最终原因。
以下是原始函数:
function wf_limitAvailableRoles( $roles ){
$user = wp_get_current_user();
if (in_array( \'wf_operator\', $user->roles)) {
$roles = array(
array(
"name" => "wf_manager",
"capabilities" => wf_getManagerCaps(),
),
array(
"name" => "wf_employee",
"capabilities" => wf_getEmployeeCaps(),
),
);
}
return $roles;
}
add_filter( \'editable_roles\', \'wf_limitAvailableRoles\' );
问题是我的
$roles
论点根据
Codex, 这个数组有一个非常具体的格式要求,我没有遵守这个要求。
我已将数组格式化为:
array(
array(
"name\' => [role name]
"capabilities" => [capabilities]
),
array(
"name\' => [role name]
"capabilities" => [capabilities]
)
);
我真正想使用的是:
array(
[role_slug] => array(
"name\' => [role name]
"capabilities" => [capabilities]
),
[role_slug] => array(
"name\' => [role name]
"capabilities" => [capabilities]
),
);