如何允许用户角色在仅低于其级别的角色下创建新用户?

时间:2015-05-20 作者:Riffaz Starr

我在我的网站上有三个额外的角色。

医生、接待员、客人这些角色由以下代码添加:

* adding Doctor role */
$doctor_role = add_role(\'Doctor\', __(\'Doctor\'), array(\'read\'=>\'true\'));

/* adding Receptionist role */
$receptionist_role = add_role(\'Receptionist\', __(\'Receptionist\'), array(\'read\'=>\'true\'));

/* adding Guest role */
$guest_role = add_role(\'Guest\', __(\'Guest\'), array(\'read\'=>\'true\'));
默认情况下Administrator 角色创建所有其他角色。但我想按用户级别限制此分配角色。我的意思是:

管理员-应该能够创建所有角色用户-默认情况下可能Receptionist 和Guest 角色用户ONLYGuest 角色用户ONLYNot allowed 创建任何用户如何做到这一点?如果我不使用任何插件就可以实现这一点,那就更好了。

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

首先,您需要将以下功能添加到DoctorReceptionist 角色:

  • list_users
  • edit_users
  • create_users
  • delete_users

    /**
     * Helper function get getting roles that the user is allowed to create/edit/delete.
     *
     * @param   WP_User $user
     * @return  array
     */
    function wpse_188863_get_allowed_roles( $user ) {
        $allowed = array();
    
        if ( in_array( \'administrator\', $user->roles ) ) { // Admin can edit all roles
            $allowed = array_keys( $GLOBALS[\'wp_roles\']->roles );
        } elseif ( in_array( \'Doctor\', $user->roles ) ) {
            $allowed[] = \'Receptionist\';
            $allowed[] = \'Guest\';
        } elseif ( in_array( \'Receptionist\', $user->roles ) ) {
            $allowed[] = \'Guest\';
        }
    
        return $allowed;
    }
    
    以及设置可以分配给用户的角色:

    /**
     * Remove roles that are not allowed for the current user role.
     */
    function wpse_188863_editable_roles( $roles ) {
        if ( $user = wp_get_current_user() ) {
            $allowed = wpse_188863_get_allowed_roles( $user );
    
            foreach ( $roles as $role => $caps ) {
                if ( ! in_array( $role, $allowed ) )
                    unset( $roles[ $role ] );
            }
        }
    
        return $roles;
    }
    
    add_filter( \'editable_roles\', \'wpse_188863_editable_roles\' );
    
    最后,根据角色限制可以编辑/删除的用户:

    /**
     * Prevent users deleting/editing users with a role outside their allowance.
     */
    function wpse_188863_map_meta_cap( $caps, $cap, $user_ID, $args ) {
        if ( ( $cap === \'edit_user\' || $cap === \'delete_user\' ) && $args ) {
            $the_user = get_userdata( $user_ID ); // The user performing the task
            $user     = get_userdata( $args[0] ); // The user being edited/deleted
    
            if ( $the_user && $user && $the_user->ID != $user->ID /* User can always edit self */ ) {
                $allowed = wpse_188863_get_allowed_roles( $the_user );
    
                if ( array_diff( $user->roles, $allowed ) ) {
                    // Target user has roles outside of our limits
                    $caps[] = \'not_allowed\';
                }
            }
        }
    
        return $caps;
    }
    
    add_filter( \'map_meta_cap\', \'wpse_188863_map_meta_cap\', 10, 4 );
    

SO网友:Anything Graphic

上述答案非常有效。但是,角色需要小写

function wpse_188863_get_allowed_roles( $user ) { }
例如:

if ( in_array( \'administrator\', $user->roles ) ) { // Admin can edit all roles
    $allowed = array_keys( $GLOBALS[\'wp_roles\']->roles );
} elseif ( in_array( \'doctor\', $user->roles ) ) {
    $allowed[] = \'receptionist\';
    $allowed[] = \'guest\';
} elseif ( in_array( \'receptionist\', $user->roles ) ) {
    $allowed[] = \'guest\';
}

结束

相关推荐

Register users by e-mail

我想使用电子邮件地址而不是用户名来注册和登录我的成员。我已经让登录部分使用中的一些代码工作this answer. 工作正常,但正如预期的那样,wordpress仍然希望在注册页面上有一个用户名(自定义,而不是默认)。这行代码注册用户:$user_signup = wp_insert_user( $user_data );, 注册时出现以下错误:无法创建登录名为空的用户。我猜这可以通过删除适当的过滤器来解决,但我对wordpress还不熟悉。删除用户名要求的代码是什么?