这是一个很长的问题,但我相信这种情况会在其他情况下发生在其他人身上。
我们公司需要创建一个员工援助计划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
帐户(而不是其他标准用户帐户)扩展3,如何确保client
只能编辑和删除employee
帐户,其中employee
帐户具有clientID
client
\'s自己的用户ID或用户名谢谢。
最合适的回答,由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的员工。