添加非发布的自定义角色所需的媒体上载功能

时间:2015-01-19 作者:floatingpointmatt

我终于成功了update an old WP 3.3.1 site to WP 4.1 虽然问题很少,但在文件上传方面似乎出现了一个意想不到的变化。

在插件的WP 3.3.1版本中,我通过“read”和“upload\\u files”为自定义角色启用了上载。

注意:这适用于以下内容:NOT 后驱动。这只是编辑我想为一些custom db tables. 这个wp_editor 调用的内容显式设置为“”。我正在使用缓冲破解来重新定位编辑器,详细内容如下:https://wordpress.stackexchange.com/a/66345

// capture the editor for later use...
// HACK: https://wordpress.stackexchange.com/a/66345
ob_start();

wp_editor(
    \'\',
    \'xyz-note-editor\',
    array(
        \'textarea_rows\' => \'10\',
    )
);

$editor = ob_get_clean();

// ...

$edit_form_template = str_replace(\'{{NotesEditor}}\', $editor, $edit_form_template);
更新到WP 4.1后,所有works for Editors and Administrators.

It fails for Authors, Contributors and my custom role 错误为:“您没有将文件附加到此帖子的权限。”

(当以编辑器或管理员身份成功上载时,“post”似乎是一个不相关的自定义post类型实例,上载的媒体将分配给该实例。)

除了重建东西,或者寻找一些插件(比如JustinTadlock的成员,StackExchange上其他地方推荐的),我陷入了困境。

Why can Editors circumvent upload restrictions in this case?

我尝试将编辑器(及以下)的编辑/发布/读取权限分配给自定义角色,但没有成功-基于http://codex.wordpress.org/Roles_and_Capabilities.

add_role(
    XxYyConfig::USER_ROLE(), 
    \'Custom Data Manager\', 
    array(
        \'read\' => true,

        // ADDED: to address changes in how WordPress "Add Media" works - re: "You don\'t have permission to attach files to this post." error
        // NOTE: Custom Data Managers, Contributors and Authors CANNOT add media -- BUT Editors/Administrators can. Trying to add to {custom_post_type} post (for reasons unknown). Content for editor set to \'\'...
        \'edit_files\' => true,
        \'edit_others_pages\' => true,
        \'edit_others_posts\' => true,
        \'edit_pages\' => true,
        \'edit_posts\' => true,
        \'edit_private_pages\' => true,
        \'edit_private_posts\' => true,
        \'edit_published_pages\' => true,
        \'edit_published_posts\' => true,
        \'publish_pages\' => true,
        \'publish_posts\' => true,
        \'read_private_pages\' => true,
        \'read_private_posts\' => true,
        // ADDED: END

        \'upload_files\' => true,
    )
);
我知道我有点左撇子,但这感觉不太一致(即使很久以前的事情已经“修复”)。

map_meta_cap 看起来它可能适用于这里,但没有自定义的帖子类型让我认为这是错误的解决方案。

理想情况下,我想知道为什么在整个过程中会对自定义帖子类型进行标记,但我坚持认为需要设置哪些权限/功能处理才能通过所见即所得编辑器上传?

编辑:因为我的角色是在插件激活期间设置的,所以我一定要停用并重新激活插件,以确保那里没有发生异常情况。

2 个回复
SO网友:user97667

找到基本问题!虽然与您描述的上下文不同,但根本原因可能是相同的。我试图允许用户设置一个个人页面,并上传一个图像显示在那里。我一直在担心“你没有权限将文件附加到此帖子”。

消息本身来自/wp admin/includes/ajax actions中的wp\\u ajax\\u upload\\u attachment()。php,即使用户在首页而不是仪表板上工作,因为我使用的插件(推荐使用高级自定义字段!)利用wordpress库例程(谢天谢地,它限制了对库的访问)。如果发生以下情况,则会发生错误current_user_can() 未能授予权限。(您可以通过将消息语句更改为其他语句来证明消息在此例程中。)

反过来,current\\u user\\u can()调用$current_user->has_cap() 获取当前功能。

has\\u cap()提供了一个很好的过滤器,我们可以利用它,但它始终失败。原因是它首先调用map_meta_cap() 它为该实例构建了大量可能的功能。如果这些可能的功能中的任何一个保留为“空”,则has\\u cap返回false。

这意味着决定授予权限的任何自定义筛选器都必须在数组中循环并将所有内容设置为true。在我看来,更好的永久解决方案是Wordpress忽略任何未明确设置为允许或不允许的上限。

现在,这里有一个适用于我的示例过滤器函数:

// allow users to add images to their home page
function allow_own_attachments( $user_caps, $req_caps, $args, $UserObj ) {
   if ( empty($args[2]) ) {
      return $user_caps;  // nothing to check
   }
   $post = get_post( $args[2] );  // post_id was passed here
   if ( $post->post_author == $UserObj->ID ) {  // this is my post
      foreach ( (array) $req_caps as $cap ) {
         if ( empty( $user_caps[ $cap ] ) )
            $user_caps[ $cap ] = true;
      }
   }
   $user_caps[\'edit_post\'] = true; // tested by wp_ajax_upload_attachment()
   return $user_caps;
}
add_filter( \'user_has_cap\', \'allow_own_attachments\', 10, 4 );

SO网友:manu

上一个答案中的代码对我很有用,但我在调试模式下收到了这样的通知:“试图获取非对象的属性‘post\\u author’”。我添加了一个检查,以查看$post是否返回一个对象(if(is\\u object($post))。这样就可以删除通知。

function allow_own_attachments( $user_caps, $req_caps, $args, $UserObj ) {
if ( empty($args[2]) ) {
   return $user_caps;  // nothing to check
}
$post = get_post( $args[2] );  // post_id was passed here

if (is_object($post)){  //check if $post is an object. If it is\'t checked the code throws this Notice: Trying to get property \'post_author\' of non-object 
    if ( $post->post_author == $UserObj->ID ) {  // this is my post
        foreach ( (array) $req_caps as $cap ) {
            if ( empty( $user_caps[ $cap ] ) )
                $user_caps[ $cap ] = true;
        }
    }
}
$user_caps[\'edit_post\'] = true; // tested by wp_ajax_upload_attachment()
return $user_caps;
}

add_filter( \'user_has_cap\', \'allow_own_attachments\', 10, 4 );

结束

相关推荐

PHP致命错误:无法为wp-includes/capabilities.php中的非对象调用重载函数

我在apache日志中遇到了太多以下错误。PHP Fatal error: Cannot call overloaded function for non-object in wp-includes/capabilities.php on line 1187这是函数current\\u user\\u can($capability)的内部,第1187行如下所示:$current_user = wp_get_current_user(); 我不知道问题出在哪里?