防止角色阅读其他帖子

时间:2013-12-04 作者:Ben Everard

我有一个自定义的帖子类型,我想允许特定的用户角色向其中添加帖子,但是他们不能阅读其他人的帖子。

这是我的自定义帖子类型代码:

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
));
下面是角色权限的屏幕截图:

enter image description here

我的问题是directory contributor 用户仍然可以看到其他用户的帖子。

有人能发现我在这里做事的错误吗?

1 个回复
最合适的回答,由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_postsread_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_capNULL 根据默认值和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_capTRUE.

结束

相关推荐

Randomize Users

我正在尝试随机显示我的用户,我想知道是否可以编辑此页面上的答案以满足我的需要(多个用户而不是单个用户):Sidebar random author spotlight这是我的代码(我可以轻松切换到WP_user_query 如果需要)<?php $args = array( \'fields\' => \'all_with_meta\', \'exclude\' => array(1), );