保存新用户时不选择任何角色

时间:2016-01-11 作者:Mike

我正在开发一个插件,添加新的用户角色:经理和员工。

经理应该是“伪管理员”。他们可以管理所有帖子内容(私有或其他),并且应该允许添加/编辑/删除员工或经理。

我大部分时间都在工作。已正确分配每个角色的功能,但当具有经理角色的用户添加新用户时,将保存该用户,但不分配任何角色。

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角色(编辑器角色)。与管理员用户非常相似,编辑器可以在添加/编辑用户时成功选择角色,并按预期保存选择。

可能排除了自定义角色功能的“权限”问题,而是强调了自定义角色本身的潜在不足。当我发现更多时,我会不断更新。希望我(或其他人)最终能够提供答案。

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

这最终成为我所连接的函数的一个非常重要的问题editable_roles.

目标:允许插件操作员添加新经理和新员工允许插件经理添加新员工问题:操作员和/或经理添加的新用户正在保存no roleexisting 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]
    ),
);

相关推荐