USER_HAS_CAP筛选器允许编辑,但不允许保存

时间:2014-02-17 作者:txa

问题

我在一个网站上工作,我们需要能够在自定义帖子类型的自定义字段中输入用户名,并允许指定的用户更改该帖子,并且只更改该帖子。我想user_has_cap 可能是要使用的过滤器挂钩,但奇怪的是,它似乎不允许用户更新帖子。

用户可以看到帖子的编辑屏幕,并且只有暗示我的过滤器工作正常的帖子,但单击更新会出现错误You are not allowed to edit posts as this user. 这与此相矛盾。

职位类型有capability_type => post 所以我觉得这不应该是问题所在。

代码

function event_cap_filter($all, $cap, $args) {
    // if not requesting edit post then return caps
    if(\'edit_post\' != $args[0]) return $all;
    // if user can already edit others posts then return caps
    if($all[\'edit_others_posts\']) return $all;

    // if user is the post author then return caps
    $post = get_post($args[2]);
    if($args[1] == $post->post_author) return $all;

    // query to find user in custom field
    // and therefore if they are allowed to edit this post

    if($can_edit) {
        foreach($cap as $c) {
            $all[$c] = true;
        }
    }

    return $all;
}
add_filter(\'user_has_cap\', \'event_cap_filter\', 10, 3);
问题如果我的用户可以编辑在我检查的自定义字段中指定他的帖子,为什么他不能保存他的更改?我是否忽视了什么?

3 个回复
SO网友:Nancy

我一直在努力解决同样的问题。。。当args[0]处于发布状态时,不会填充args[2]。您必须从url获取它。

if(substr($args[0],0,7)=="publish"){
    $postid=$_GET["post"];
    if(!isset($postid))return $allcaps;
}
else $postid=$args[2];

SO网友:jerclarke

我想你在_wp_translate_postdata() 这就证明了edit_others_posts 不提供任何上下文map_meta_cap 以及在您这样的情况下使用的其他过滤器(您希望用户能够编辑不是他们的特定帖子):

https://core.trac.wordpress.org/ticket/30452#comment:5

它的具体效果是,受影响的用户将能够登录到帖子编辑器(这意味着它工作了),但保存更改的尝试将完全失败(这听起来像是您的问题)。

门票中包含了丹尼尔·巴丘伯(DanielBachuber)的解决方案,其他人可能会出于自己的目的将其转换。

希望该错误很快得到修复。

SO网友:Edemir Santos de Paula

我有一个类似的问题,需要有一个自定义字段来授予特定的人编辑其他用户创建的一些帖子、页面和自定义帖子类型的权限。我有一个包含用户的acf数组字段。解决了使用$\\u post[\'post\\u id\']和以下代码获取帖子id的问题:

function author_cap_filter( $allcaps, $cap, $args ) 
    {    

        if(isset($_POST[\'post_ID\']))
        {
            $post_id = $_POST[\'post_ID\'];
            $users = get_post_meta($post_id, \'add_people\', TRUE);

            if(is_array($users) && in_array(wp_get_current_user()->ID,$users))
                $allcaps[\'edit_others_posts\']=TRUE;

        }

        return $allcaps;
    }   

add_filter( \'user_has_cap\', \'author_cap_filter\', 10, 3 ); 

结束

相关推荐

Redirect loop in /wp-admin/

今天,我管理的一个网站管理员无法访问。我刚刚在服务器上更新了apache,以启用mod\\u deflate,并将PHP从5.3升级到5.4。因为每次我尝试访问/wp admin/I时都会收到重定向循环错误。我尝试了所有常见的嫌疑犯,即:清除了Cookie和缓存,尝试了不同的浏览器,禁用了主题,删除了禁用的Cookie。htaccess检查了wp\\U选项中的site\\u url等,但运气不佳。我可以访问wp登录。php很好,但不是/wp管理员/任何帮助都将不胜感激,因为我完全被难住了。