如何为特定用户分配编辑特定页面/帖子/自定义帖子类型的权限

时间:2011-09-20 作者:Rick Curran

我正在尝试实现一个相对简单的想法,基本上我正在构建一个访问控制插件来控制自定义帖子类型(在本例中为“项目”)的查看和编辑。

我打算让它工作的方式是,有多个用户对特定的“项目”具有只读访问权或读/写访问权。

系统中有多个项目,通过在站点上的用户配置文件设置中启用特定项目的复选框来控制读取权限(如下所示):

Additional edit options added to User Options

因此,您可以通过此界面分配对这些项目的访问权限,然后如果项目ID与选中项目的任何ID都不匹配,则“实际项目”页面上的代码会限制查看内容。

这一切都很好,但是,我还需要以同样的方式允许编辑功能。因此,我可以让用户阅读特定页面,也可以编辑特定页面。我面临的问题是,我所追求的似乎不适合常规角色和功能,因为基本上我只希望所有用户都有相同的角色(基本上只是订阅者角色)。但我想为特定页面的特定用户添加编辑功能,而角色通常是为“类型”的用户添加功能。

希望我已经设法解释了我在这里尝试的内容,我正在努力找到正确的代码/函数来实现这一点,虽然我确信这一定是可能的,因为有插件可以访问特定的页面等,但显然在这种情况下,我不想依赖插件,因为我正在构建的是插件本身!

更新:我一直在努力解决这个问题,但到目前为止,我仍然不知道如何在不为每个特定页面创建自定义角色/功能的情况下启用对特定帖子/页面等的访问,但这似乎有点过头了,我甚至不确定这是否可行。

更新2:我现在给这个问题加了一个悬赏,希望能激励一些人!;)我对此做了进一步的研究,但即使我发现其他插件似乎能够满足我的需要(还有大量其他我不需要的功能!)我只是没有弄清楚需要什么代码才能将post类型的特定实例限制为特定用户。

10月31日更新:由于@alexey发布的代码,我能够运行一些东西。我现在有两个ID列表,其中一个控制读取访问,另一个用于编辑访问。我正在使用current_user_can(\'read_projects\') 然而,为了限制页面内容的查看,我遇到了一个问题,在实际限制内容之前,需要加载两个页面。第一次单击页面时,内容会显示出来,但如果重新加载页面,则内容会正确隐藏。这似乎与时间有关user_has_cap 正在触发,但我似乎无法跟踪任何内容,据我所知,这应该在呈现页面内容之前触发。我不打算在此更新中发布任何进一步的代码,因为如果没有简单的原因说明这不起作用,那么我最好发布一个新问题,而不是继续这个问题。

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

我可以建议另一种方法。

首先:授予对项目的完全访问权限post type(Example).

在用户配置文件中添加允许的帖子id。

然后,如果不允许post id,请使用下面的筛选器限制访问。

function allow_user_to_edit_cpt_filter( $capauser, $capask, $param){

    global $wpdb;

    $allowed_posts_id_for_current_user = array( \'29\', \'30\' ); // you need to get these ids yourself
    $post = get_post( $param[2] );

    // If current post isn\'t allowed then delete edit and delete capabilities
    if( !in_array( $post->ID, $allowed_post_type_ids ) ){
        if( ( $param[0] == "edit_projects") || ( $param[0] == "delete_projects" ) ) { // Change to yours capabilities
            foreach( (array) $capask as $capasuppr) {
               if ( array_key_exists($capasuppr, $capauser) ) {
                  $capauser[$capasuppr] = 0;
               }
            }
        }
    }

    return $capauser;
}
add_filter(\'user_has_cap\', \'allow_user_to_edit_cpt_filter\', 100, 3 );

结束

相关推荐