基于分类的用户角色权限

时间:2016-03-11 作者:Lighty_46

我想知道是否可以以某种方式设置用户角色,即某些组中的用户只能编辑分配了特定分类法的帖子,例如:

Properties (Post Type)
    Taxonomy One
    Taxonomy Two
    Taxonomy Three

User Roles
    Group One - Can only edit properties with \'Taxonomy One\' assigned.
    Group Two - Can only edit properties with \'Taxonomy Two\' assigned.
    Group Three - Can only edit properties with \'Taxonomy Three\' assigned.
我正在使用Members plugin 对于目前的角色管理,我正在使用自定义的帖子类型/分类法。

从我目前所看到的情况来看,您似乎无法根据分类法限制对帖子的访问。

UPDATE

现在,我已获得使用以下代码处理帖子类型的权限:

register_post_type( \'properties\',
    array(
        \'labels\' => array(
            \'name\' => __( \'Properties\' ),
            \'singular_name\' => __( \'Property\' )
        ),
        \'public\' => true,
        \'capability_type\' => \'property\',
        \'map_meta_cap\' => true,
        \'capabilities\' => array(
            \'publish_posts\' => \'publish_properties\', // This allows a user to publish a property.
            \'edit_posts\' => \'edit_properties\', // Allows editing of the user’s own properties but does not grant publishing permission.
            \'edit_others_posts\' => \'edit_others_properties\', // Allows the user to edit everyone else’s properties but not publish.
            \'delete_posts\' => \'delete_properties\', // Grants the ability to delete properties written by that user but not others’ properties.
            \'delete_others_posts\' => \'delete_others_properties\', // Capability to edit properties written by other users.
            \'read_private_posts\' => \'read_private_properties\', // Allows users to read private properties.
            \'edit_post\' => \'edit_property\', // Meta capability assigned by WordPress. Do not give to any role.
            \'delete_post\' => \'delete_property\', // Meta capability assigned by WordPress. Do not give to any role.
            \'read_post\' => \'read_property\', // Meta capability assigned by WordPress. Do not give to any role.
        )
    )
);
编辑“成员”插件中的角色时,会出现“属性”部分,允许我限制/允许访问。现在只需要弄清楚这是否适用于每个分类法:)

2 个回复
SO网友:majick

您可能可以使用过滤器user_has_cap 在检查特定功能时使用(可在中找到/wp-includes/class-wp-user.php 在里面has_cap):

    /**
     * Dynamically filter a user\'s capabilities.
     *
     * @since 2.0.0
     * @since 3.7.0 Added the user object.
     *
     * @param array   $allcaps An array of all the user\'s capabilities.
     * @param array   $caps    Actual capabilities for meta capability.
     * @param array   $args    Optional parameters passed to has_cap(), typically object ID.
     * @param WP_User $user    The user object.
     */
    $capabilities = apply_filters( \'user_has_cap\', $this->allcaps, $caps, $args, $this );
所以它会是这样的:

add_filter(\'user_has_cap\',\'check_post_taxonomy\',10,4);
function check_post_taxonomy($allcaps,$caps,$args,$user) {
    global $post; if (!isset($post)) {return $allcaps;}

    $group = get_user_meta($user->ID,\'special_edit_group\',true);
    $taxonomy = \'taxonomy_\'.$group; // maybe set to a, b or c?
    $terms = get_the_terms($post->ID,$taxonomy);

    // if there are no terms, remove the user capability(s) for this check
    // you may have to experiment to remove all the ones you want to
    if (!$terms) {
        unset($allcaps[\'edit_properties\']);
    }

    return $allcaps;
}
我这样做是因为我意识到这个问题的逻辑并不完全正确。如果一个帖子类型分配了分类法a、B和C,即使您为角色组设置了这些功能过滤器,这三个角色组仍然可以编辑该帖子类型中的任何内容。换句话说,在任何情况下,分类法A、B或C实际上都是“未”分配的。

相反,我认为你真正的意思是“检查这篇文章在分类法A中是否有任何术语分配给它”。。。如果是的话,沿着A组编辑它,依此类推。(注意:我不知道上述代码是否适用于这种情况,它可能需要更多的工作。例如,目前这是检查组的用户元密钥,而不是实际的角色/组。)

SO网友:Jarod Thornton

事实上,我找到了插件开发人员的博客,这就是他提供的见解。

元能力是用户在每个岗位上获得的能力。我们正在处理的三个问题是:

edit_post delete_post read_post

对于常规博客帖子,WordPress会将这些“映射”到授予用户角色的特定功能。例如,如果用户是文章作者或具有edit\\u others\\u posts功能,则可能会为其提供100篇文章的edit\\u post功能。

使用自定义帖子类型时,如果您正在设置自定义功能,则不会自动进行此映射。我们必须想出自己的解决方案。

在本教程中。。。

http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-post-types

*我还不能发表评论,所以我贴出了答案。

相关推荐

Custom Taxonomy in REST API

我有两个自定义分类法,用于我的帖子。我正试图从其中一个中检索名称。在REST API V2中,我执行以下操作:https://example.com/wp-json/wp/v2/posts/14340/?_embed=wp:term 这嵌入了所有分类法的实际名称(类别加上我的两个自定义分类法),但我只对与每个帖子相关联的名称感兴趣,只对其中一个自定义分类法感兴趣。响应示例:"_embedded": { "wp:term": [