我认为这是可能的,我已经在函数中编写了一段代码。php中的主题及其工作良好。如果有人能做得更好:DWe为每个用户都有一个自定义元,这可以使用ACF来完成。管理员只能将该元设置为用户(美容师)。
我有两个自定义角色:沙龙老板和美容师。salonowner有权编辑、列出用户。我们有一个帖子类型“Listing”,salonowner可以在那里创建帖子。让我们称之为沙龙1。管理员只能使用ACF“meta”将美容师分配到Salon1,我已经创建了Relationshop字段。。在这里,它被称为list\\u for\\u user。
在这里,我们创建了两个新的自定义角色:
add_action( \'after_setup_theme\', \'create_custom_roles\' );
function create_custom_roles() {
add_role( \'salonowner\', \'salonowner\');
add_role( \'beauticians\', \'beauticians\');
}
在这里,我们为salonowner角色分配编辑和列出用户:
add_action(\'admin_init\',\'add_role_caps\',999);
function add_role_caps() {
$salonowner = get_role(\'salonowner\');
$salonowner->add_cap(\'edit_users\');
$salonowner->add_cap(\'list_users\');
}
使用此自定义代码,我们可以拒绝salonowner编辑任何其他用户,并允许他只编辑列表“Salon1”中具有相同meta的用户。
add_filter( \'map_meta_cap\', \'custom_map_meta_cap\', 10,4);
function map_meta_cap( $caps, $cap, $user_id, $args ){
if ( ! function_exists( \'get_current_screen\' ) )
return;
$screen = get_current_screen();
if($screen->base == \'users\' || $screen->base == \'user-edit\') {
$user_meta = get_userdata($user_id);
$user_roles = $user_meta->roles;
if($user_roles){
if (in_array("salonowner", $user_roles)) {
if( isset($args[0]) ){
$edit_user_id = $args[0];
}
$listing_ids = get_user_meta( $edit_user_id, \'list_for_user\', true);
if($listing_ids){
$arr = get_current_user_posts_can_edit();
foreach ($listing_ids as $key => $listing_id) {
if (in_array($listing_id, $arr )){
return $caps;
}else{
$caps = \'do_not_allow\';
}
}
}else{
// Don\'t allow for edit all other users
$user = get_userdata( $edit_user_id );
if ( $user ) {
$caps = \'do_not_allow\';
}
}
}
}
}
return $caps;
}
此函数用于获取当前用户的所有帖子,以检查当前用户是否可以编辑为其分配的用户:
function get_current_user_posts_can_edit(){
$current_user_id = get_current_user_id();
$posts = get_posts(array(
\'posts_per_page\' => -1,
\'post_type\' => \'listing\',
\'post_status\' => \'publish\',
\'author\' => $current_user_id,
));
$post_ids = array();
foreach ($posts as $key => $post) {
$post_ids[] = $post->ID;
}
return $post_ids;
}