我有一个自定义的帖子类型,我想允许特定的用户角色向其中添加帖子,但是他们不能阅读其他人的帖子。
这是我的自定义帖子类型代码:
register_post_type(\'product\', array(
\'labels\' => create_post_type_labels(\'Product\'),
\'public\' => TRUE,
\'query_var\' => TRUE,
\'rewrite\' => array(\'slug\' => \'products\', \'with_front\' => FALSE),
\'capability_type\' => \'directory\',
\'capabilities\' => array(
\'edit_post\' => "edit_directory",
\'read_post\' => "read_directory",
\'delete_post\' => "delete_directory",
\'edit_posts\' => "edit_directorys",
\'edit_others_posts\' => "edit_others_directorys",
\'publish_posts\' => "publish_directorys",
\'read_private_posts\' => "read_private_directorys",
\'delete_posts\' => "delete_directorys",
\'delete_private_posts\' => "delete_private_directorys",
\'delete_published_posts\' => "delete_published_directorys",
\'delete_others_posts\' => "delete_others_directorys",
\'edit_private_posts\' => "edit_private_directorys",
\'edit_published_posts\' => "edit_published_directorys"
),
\'supports\' => array(\'title\', \'author\'),
\'has_archive\' => TRUE
));
下面是角色权限的屏幕截图:
我的问题是directory contributor
用户仍然可以看到其他用户的帖子。
有人能发现我在这里做事的错误吗?
最合适的回答,由SO网友:kaiser 整理而成
问题是,您有一个自定义capability_type
. 这意味着,此职位类型的处理方式将与默认职位类型不同,默认职位类型的能力类型为post
: 需要授予用户访问此功能的权限。重要的是:这是一个好的决定。
您缺少的是将功能映射到相应的元功能。直接来自《法典》的简短解释:
edit_post
, read_post
, 和delete_post
- 这三个是元功能,然后通常会对其进行映射to corresponding primitive capabilities 根据上下文,例如正在编辑/读取/删除的帖子以及正在检查的用户或角色。因此,这些能力将generally not be granted directly to users or roles.
还有其他4种基本能力:edit_posts
, edit_others_posts
, publish_posts
和read_private_posts
. 所有这些(总共7个)上限都分配在能力阵列中,并在core中的各个位置进行检查。
但是还有another 7 capabilities 未对照检查,但仅在内部映射map_meta_cap()
. 当你看到source of map_meta_cap()
, 然后您将看到17个案例switch
总计不要对此感到困惑,因为不是所有的事情都与帖子有关,而是与插件激活、用户和其他东西有关。
现在核心功能map_meta_caps()
检查所检查的cap类型,然后开始填充一系列功能。最后返回以下内容:
return apply_filters( \'map_meta_cap\', $caps, $cap, $user_id, $args );
现在让我们看看
core registration process 职位类型:
map_meta_cap
是
NULL
根据默认值和
if not explicitly set, 它是
FALSE
.
当我们查看用户能力时,请检查the has_cap()
function, 我们可以看到map_meta_cap()
将调用以检索所有需要的功能,然后it will be looped through and checked against 映射CAP的结果功能。
如果指定capability_type
, 你最好准备好map_meta_cap
到TRUE
.