>我创建了一个具有他功能的wordpress自定义用户:该用户只能读取,编辑和删除自定义帖子类型(称为食谱)的帖子。
我给这个用户上传文件的角色,因为当用户写食谱帖子时,可以将媒体添加到他的文章。
上传文件在媒体管理器中工作正常(不在媒体iframe中,因为编辑附件的条件是具有edit_post角色)。实际上,具有自定义角色的用户无法编辑和删除附件(我无法给他edit_posts和delete_posts角色,因为在此站点中,站点管理员管理许多其他自定义帖子类型
我知道附件是后post_type,但是如何分配编辑和删除其媒体的功能?
搜索我发现这个技巧可以更改附件的默认功能,但我认为这不是正确的方法
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';
提前致谢
基于@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
搜索后,我找到了问题的答案:要允许用户没有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;
}
我希望对其他正在寻找我问题的答案的人有用。