带有upload_files true但edit_post false的Wordpress自定义用户角色,我如何删除和编辑媒体?

Posted

技术标签:

【中文标题】带有upload_files true但edit_post false的Wordpress自定义用户角色,我如何删除和编辑媒体?【英文标题】:Wordpress custom user roles with upload_files true but edit_post false, how can i delete and edit media? 【发布时间】:2015-06-16 11:18:17 【问题描述】:

我用他的能力创建了一个wordpress自定义用户:这个用户只能阅读、编辑和删除自定义帖子类型(称为recipe)的帖子。

我给这个用户上传文件的角色,因为当用户写一个食谱帖子时,可以将媒体添加到他的文章中。

上传文件在媒体管理器中工作正常(不是在媒体 iframe 中,因为编辑附件的条件是具有 edit_post 角色)。 事实上,这个具有自定义角色的用户无法编辑和删除附件(我不能给他 edit_posts 和 delete_posts 角色,因为在这个站点中有很多其他由站点管理员管理的自定义帖子类型

我知道附件是 post_type,但我如何分配编辑和删除他的媒体的功能?

搜索我发现这个 hack 可以更改附件的默认功能,但我认为这不是正确的方法

 global $wp_post_types;
 $wp_post_types['attachment']->cap->edit_post = 'upload_files';
 $wp_post_types['attachment']->cap->read_post = 'upload_files';
 $wp_post_types['attachment']->cap->delete_post = 'upload_files';

提前致谢

【问题讨论】:

"我知道附件是 post_type" - 不,事实并非如此。 attachments 是 posts,因此被视为这样,但他们也拥有 post_type attachment 【参考方案1】:

根据@Marco 的回答,我想我设法写得更简单:

function allow_attachment_actions( $user_caps, $req_cap, $args ) 
  // if no post is connected with capabilities check just return original array
  if ( empty($args[2]) )
    return $user_caps;

  $post = get_post( $args[2] );

  if ( 'attachment' == $post->post_type ) 
    $user_caps[$req_cap[0]] = true;
    return $user_caps;
  

  // for any other post type return original capabilities
  return $user_caps;

add_filter( 'user_has_cap', 'allow_attachment_actions', 10, 3 );

这样,无论其他权限如何,用户都可以对附件进行任何操作。

可以为附件操作定义自定义权限,并检查它是否存在以及帖子类型检查。

有关此代码中使用的钩子的更多信息https://codex.wordpress.org/Plugin_API/Filter_Reference/user_has_cap

【讨论】:

【参考方案2】:

搜索后,我找到了我的问题的答案:要允许没有 edit_post=true 的用户,我们只能在 post_type 是带有过滤器 user_has_cap 的附件时将其设置为 true。 为了我的目的,我写了这个钩子

add_filter( 'user_has_cap', 'myUserHasCap', 10, 3 );

function myUserHasCap( $user_caps, $req_cap, $args ) 

$post = get_post( $args[2] );

if ( 'attachment' != $post->post_type )
    return $user_caps;

if ( 'delete_post' == $args[0] ) 

    if ( $user_caps['delete_others_posts'] )
        return $user_caps;

    if ( !isset( $user_caps['publish_recipes'] ) or !$user_caps['publish_recipes'] )
        return $user_caps;

    $user_caps[$req_cap[0]] = true;



if ( 'edit_post' == $args[0] ) 

    if ( $user_caps['edit_others_posts'] )
        return $user_caps;

    if ( !isset( $user_caps['publish_recipes'] ) or !$user_caps['publish_recipes'] )
        return $user_caps;

    $user_caps[$req_cap[0]] = true;



return $user_caps;


我希望对正在寻找我的问题答案的其他人有用。

【讨论】:

拯救了我的一天!谢谢! $post = get_post( $args[2] ); 可以引发警告,因为 $args[2] 不一定设置。

以上是关于带有upload_files true但edit_post false的Wordpress自定义用户角色,我如何删除和编辑媒体?的主要内容,如果未能解决你的问题,请参考以下文章

delphi edit边框成为下划线

PHP最原始的上传文件函数

MFC EDIT类控件 自动换行

使用 editable=true 和 dataDetectorTypes 反应原生 TextInput

Folders.hasNext()从Google表格中返回false,但直接从Google Script调用时为true

Bootstrap Modal 未关闭数据关闭(Rails)