创建自定义用户角色(客户端),可以创建该客户端的另一个自定义用户角色(员工

时间:2016-06-03 作者:Steve

这是一个很长的问题,但我相信这种情况会在其他情况下发生在其他人身上。

我们公司需要创建一个员工援助计划MU子目录网站,我们公司可以在其中创建自定义用户角色为的用户帐户client.

这个client 将是另一家需要为该公司员工使用本公司EAP服务的公司。

这个client 必须能够登录到MU网络站点管理员,并使用employee 员工的用户角色。

那些employee 帐户将能够登录到前端并查看受限制的EAP内容。

对于employee 用户角色,我已使用code here 在我的主题中创建functions.php:

$result1 = add_role( \'employee\', __(\'Employee\'),  
    array(
        \'edit_users\' => false,
        \'create_users\' => false,
        \'delete_users\' => false,
        \'read\' => true,
        \'edit_posts\' => false,
        \'edit_pages\' => false,
        \'edit_others_posts\' => false,
        \'create_posts\' => false,
        \'manage_categories\' => false,
        \'publish_posts\' => false,
        \'edit_themes\' => false,
        \'install_plugins\' => false,
        \'update_plugin\' => false,
        \'update_core\' => false
    )
);
我可以只指定什么是真的而不需要指定什么是假的吗?

对于client, 我有:

$result2 = add_role( \'client\', __(\'Client Company Admin\'),  
    array(
        \'edit_users\' => true,
        \'create_users\' => true,
        \'delete_users\' => true,
        \'read\' => true,
        \'edit_posts\' => false,
        \'edit_pages\' => false,
        \'edit_others_posts\' => false,
        \'create_posts\' => false,
        \'manage_categories\' => false,
        \'publish_posts\' => false,
        \'edit_themes\' => false,
        \'install_plugins\' => false,
        \'update_plugin\' => false,
        \'update_core\' => false
    )
);
我需要每个client 帐户只能编辑和删除employee 该个人创建的帐户client 账户,无其他公司employee 账户

我想我可以在employee 将作为client ID(当client 创建employee), 并且此自定义字段不能由employee 角色

我搜索了如何将隐藏的自定义字段添加到自定义用户角色,但没有找到解决方案。

所以,我的问题是:

如何添加名为clientID 到自定义用户角色(employee)?client 创建employee, 客户端的用户ID或用户名(不确定哪个是最好的)添加到新employee\'sclientID 元字段client 只能编辑或删除employee 帐户(而不是其他标准用户帐户)client 只能编辑和删除employee 帐户,其中employee 帐户具有clientID client\'s自己的用户ID或用户名

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

客户端由管理员添加,客户端与员工之间有父子关系,这使得筛选变得容易。因此,我们所需要做的就是删除与员工无关的任何内容,并筛选出具有特定元价值的员工。

首先,每当新用户在admin 在CMS方面,如果当前用户是客户,我们将为其分配一个父用户(假设客户无法将员工分配给其他客户):

/**
 * Admin New Employee Function
 * @var int $user_id
 * @return void
 */
function client_register( $user_id ) {
    if( ! is_admin() ) {
        return;
    }

    // Grab the current user
    $current_user = wp_get_current_user();

    // IF the current user ID isn\'t 0 and our current user is a \'client\' role
    if( $current_user->ID && in_array( \'client\', $current_user->roles ) ) {

        // Update the new user with a \'parent\' usermeta value of the current \'client\'
        update_user_meta( $user_id, \'_user_parent\', $current_user->ID );
    }
}
add_action( \'user_register\', \'client_register\' );
很好,所以现在每当客户端创建新用户(任何类型)时,都会为其分配一个创建它的客户端的父级。现在,我们需要筛选用户表,以仅显示具有客户端父级usermeta的用户:

/**
 * Pre Get Users filter
 * @var WP_Query Object $query
 * @return void
 */
function theme_pgu( $query ) {
    if( ! is_admin() ) {
        return;
    }

    // Grab our current user
    $current_user = wp_get_current_user();

    // IF our user ID is not 0 and our current user has a role of \'client\'
    if( $current_user->ID && in_array( \'client\', $current_user->roles ) ) {

        // Set the query to only return employee roles
        $query->set( \'role\', \'employee\' );

        // Which has a usermeta key \'_user_parent\' set
        $query->set( \'meta_key\', \'_user_parent\' );

        // and has a usermeta value of the current client user
        $query->set( \'meta_value\', $current_user->ID );
    }
}
add_action( \'pre_get_users\', \'theme_pgu\' );
整洁的现在我们可以解决客户机能够创建任何类型的角色的问题,所以我们继续清理过程。创建新用户或编辑当前用户时,以下内容将删除任何可选择的角色employee:

/**
 * Selectable roles on the new user and user edit screen
 * @var Multi-dimensional Array $roles
 * @return Array $roles
 */
function client_sel_roles( $roles ) {
    // Grab our current user
    $current_user = wp_get_current_user();

    if( in_array( \'client\', $current_user->roles ) ) {
        $roles = array( \'employee\' => $roles[\'employee\'] );
    }

    return $roles;
}
add_filter( \'editable_roles\', \'client_sel_roles\' );
All Users 屏幕上,我们可以看到过滤器视图仍显示其他用户角色,因此我们也需要解决这一问题:

/**
 * All Users screen filterable views
 * @var Array $views
 * @return Array $views
 */
function client_user_views( $views ) {
    // Grab our current user
    $current_user = wp_get_current_user();

    if( in_array( \'client\', $current_user->roles ) ) {
        if( isset( $views[\'employee\'] ) ) {
            $views = array( \'employee\' => $views[\'employee\'] );
        } else {
            $views = array();
        }
    }

    return $views;
}
add_filter( \'views_users\', \'client_user_views\' );
最后,一个疏忽是,用户可能会更改URL以查看其他用户配置文件,而这些用户配置文件可能不是他们自己的员工,因此我们需要通过添加以下小重定向来解决这一问题:

/**
 * Stop clients from changing the URL to get to other profiles
 * @var WP_Screen Object $screen
 * @return void
 */
function edit_employees_only( $screen ) {

    // Check if we\'re on the correct screen
    if( \'user-edit\' === $screen->base ) {

        // Ensure our desired user ID is set
        if( isset( $_GET[\'user_id\'] ) && is_numeric( $_GET[\'user_id\'] ) ) {
            $user_id        = absint( $_GET[\'user_id\'] );
            $current_user   = wp_get_current_user();
            $parent         = get_user_meta( $user_id, \'_user_parent\', true );

            // Ensure that we\'re viewing a profile that is not our own
            if( $current_user->ID && in_array( \'client\', $current_user->roles ) && $user_id !== $current_user->ID && $parent !== $current_user->ID ) {

                // We\'re viewing an incorrect profile - redirect to clients own profile
                wp_redirect( admin_url( "user-edit.php?user_id={$current_user->ID}" ) );
            }
        }
    }
}
add_action( \'current_screen\', \'edit_employees_only\' );
这应该可以做到。客户端角色只能查看和编辑将父级指定为其ID的员工。

相关推荐

添加用户角色:预先保存在User-Meta中[已解决]

我在用户注册后添加一个操作,以根据users meta\\u值添加另一个用户角色。使用时:add_action(\'um_after_save_registration_details\', \'custom_after_new_user_register\', 10, 2); function custom_after_new_user_register($user_id) { $user = get_user_by(\'id\', $user_id); if