问题描述

我正在尝试实现一个相对直观的想法,基本上我正在构建一个访问控制插件来控制自定义帖子类型 (在这种情况下是’Projects’) 的查看和编辑。

我打算如何工作是有多个用户可以访问或访问特定’Projects’ 的 read-only 。

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

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

这一切都正常,但是,我也需要以同样的方式允许编辑功能。所以我可以让用户阅读特定页面,但也可以编辑该特定的页面。我所遇到的问题是,我之后似乎并不适合常规角色和功能,因为我只是希望所有用户拥有相同的角色 (基本上只是订阅者角色) 。但是,我想为特定页面的特定用户添加编辑功能,而角色通常是将功能添加到用户的’type’ 。

希望我已经设法解释了我在这里的尝试,我正在努力寻找正确的代码/功能,尽管我确信这是可能的,因为有插件可以使访问具体页面等,但显然在这种情况下,我不想依赖一个插件,因为我正在构建一个插件本身!

更新:我坚持进一步尝试解决这个问题,但到目前为止,我仍然看不到如何启用访问特定的帖子/页面等,而无需为每个特定页面创建 custom-role /功能,但这似乎有点过度我甚至不确定会奏效。

更新 2:我现在已经在这个问题上添加了一个赏金,希望可以启发一个人! ;) 我已经进一步看这个,但即使我发现其他似乎能够满足我所需要的插件 (以及其他不需要的其他功能的加载),我还没有设法弄清楚需要什么代码来将特定用户的发布类型的实例限制为特定用户。

更新 10 月 31 日:由于 @alexey 发布的代码,我已经能够得到一些运行。我现在有两个 ID 列表,其中一个控制 Read 访问,另一个用于编辑访问。我使用 current_user_can('read_projects')来限制页面内容的查看,但是我有一个问题需要两页的加载才能实际限制内容。我第一次点击内容显示的页面,但是如果我重新加载页面,那么内容被隐藏正确。这似乎是与 user_has_cap 被触发的时机有关,但我似乎无法跟踪任何事情,只要我能告诉这个应该在页面内容呈现之前被触发。我不会在这个更新中发布任何进一步的代码,好像没有简单的理由为什么这不工作,那么我会更好地发布一个新的问题,而不是继续这个。

最佳解决方案

我可以建议另一种方法。

首先:授予完全访问项目的帖子类型 (Example) 。

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

然后使用下面的过滤器来限制访问,如果不允许发布 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 );

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。