允许用户使用map_meta_capp编辑具有元密钥的特定用户

时间:2018-01-03 作者:Mohammed

是否有一种方法“钩子”或自定义代码允许具有自定义角色“abc”的用户使用map\\u meta\\u cap编辑和删除具有自定义角色“xyz”的其他用户?

谢谢

1 个回复
SO网友:Mohammed

我认为这是可能的,我已经在函数中编写了一段代码。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;
  }

结束

相关推荐

About Wordpress capabilities

我知道WordPress是博客引擎的最佳选择,通过一些插件,如Advance Custom Field,WP可以成为一个很棒的CMS。但它仍然有利于出版商将内容推送给用户。现在我的处境相当严峻。我的朋友想使用WP作为一个引擎,用户可以贡献他们的帖子,其他人可以查看它。是否可以使用WP我可以创建自定义主题(&a);插件可以做到这一点,但当用户在插件上放置很多东西(页面和帖子)时,它对性能有好处吗?