如何不让具有新角色的用户编辑具有管理员角色的用户?

时间:2021-02-09 作者:churros

我刚刚发现如何在Wordpress上创建一个新角色。所以,我做了这样的事情:

function suporte_role_creation() {
    remove_role(\'suporte\');
    add_role( \'suporte\', \'Suporte\', array(
        \'read\' => true,
        \'create_users\' => true,
        \'delete_users\' => false,
        \'edit_users\' => true,
        \'list_users\' => true,
        \'promote_users\' => true,
        \'remove_users\' => false
    ));
}

register_activation_hook( __FILE__, \'suporte_role_creation\' );
现在,我的目的是让属于此新角色的用户能够编辑除具有管理员角色的用户之外的所有用户。我该怎么做?有过滤器吗?

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

有过滤器吗?

是的,有,钩子的名字是user_has_cap.

所以,试试这个,它在WordPress 5.6.1中对我起到了作用

add_filter( \'user_has_cap\', \'wpse_383109\', 10, 4 );
function wpse_383109( $allcaps, $caps, $args, $user ) {
    if ( empty( $args[2] ) || \'edit_user\' !== $args[0] ||
        ! in_array( \'suporte\', $user->roles )
    ) {
        return $allcaps;
    }

    $user2 = get_userdata( $args[2] );
    if ( $user2 && in_array( \'administrator\', $user2->roles ) ) {
        $allcaps[\'edit_users\'] = false;
    }

    return $allcaps;
}
例如,在用户身上→ 所有用户管理页(wp-admin/users.php), 具有支持角色的用户可以查看站点上的管理员列表,但支持用户无法编辑管理员。

如果您想知道,下面是上述代码或函数的作用:

  1. empty( $args[2] ) || \'edit_user\' !== $args[0] — 这可确保请求的功能edit_user 以及特定的用户ID($args[2]) 提供。例如,调用时条件为truecurrent_user_can( \'edit_user\', 123 ).

  2. in_array( \'suporte\', $user->roles ) — 这将检查编辑上述特定用户的用户是否具有支持角色。

  3. $user2 && in_array( \'administrator\', $user2->roles ) — 这将检查正在编辑的用户是否具有管理员角色。

  4. $allcaps[\'edit_users\'] = false; — 如果上述三个条件均满足,则此代码(暂时)禁用edit_users 上述条件#2中所述用户的能力。如果需要,还可以禁用其他功能:)

相关推荐