我想知道可以传递给user_can()的参数,以便按用户功能进行访问控制

时间:2019-08-26 作者:Fizzler

我注意到其他人发布了user\\u can()在控制访问权限方面的使用,这对EC站点非常有用:

How to use current_user_can()?

由于我想精细地控制访问权限,我研究了哪些参数可以作为用户功能传递,但这样的页面没有明确说明参数:

https://developer.wordpress.org/reference/classes/wp_user/has_cap/#uses

如果有人碰巧知道user\\u can()的明确参数列表,请分享。

提前谢谢你。

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

使用时user_can() 将用户ID(或对象)和要检查的“功能”传递给它:

$user_can = user_can( $user_id, \'edit_posts\' );
内置角色的列表及其所具有的功能可用here. 您可以将其中任何一个传递给函数,以根据用户的角色确定用户是否具有该功能。

然而,这只是内置功能的列表。插件可以添加自己的功能,这意味着您可以添加自己的功能。所以任何东西都可以传递给user_can(), 它只需要是用户可以拥有的功能。这就是为什么功能文档中不包含特定列表的原因。

起初,我误解了你的问题,并假设你在问可以传递给哪些其他参数user_can(), 除了功能(您只需要一个列表)。下面是我对此的回应。

任何附加参数都传递给WP_User::has_cap() 作为$options... 参数,即:

(int)(可选)要检查的特定对象的ID,如果$cap 是一种“元”能力。元功能,如edit_postedit_user 是否由map_meta_cap() 映射到用户或角色具有的基本功能的函数,例如edit_postsedit_others_posts.

这些“元”功能传递给map_meta_cap() 函数确定所需的实际功能(“实际”功能是指分配给用户或角色的功能)。

例如edit_post 是一种元功能map_meta_cap() 函数确定用户需要的功能edit_post 是真的。如果他们是这篇文章的作者,那么所需的能力是edit_posts. 如果不是,那就是edit_others_posts.

为了让它起作用map_meta_cap 需要知道帖子ID,可以传递给user_can():

$user_can = user_can( $user_id, \'edit_post\', $post_id );
这也可用于用户:

$user_can = user_can( $user_id, \'promote_user\', $user_id );
内置“元”功能的部分列表位于的文档中map_meta_cap().

这意味着user_can() 可以接受正在检查功能的对象的ID。

因此,对于内置功能,您可以传递给user_can() 是与正在检查的元功能相关的帖子、评论、用户或术语的对象ID。

然而,这并不是全部情况。事实是,您可以将任何其他参数传递给user_can() 你想要的。它们不会为任何内置功能做任何事情,但如果您使用map_meta_cap() 筛选以添加您自己的元功能。

例如,假设我有一个自定义的数据库表,其中包含我自己类型的内容,但我想使用WordPress的功能系统。在本例中,假设我有一个名为“参与者”的东西,我想控制谁有权编辑它们。我可以创造我自己的两种能力,edit_participantsedit_others_participants, 并根据需要将其分配给用户角色。现在我需要使用user_can() 要确定用户是否可以编辑特定参与者,请执行以下操作:

$user_can = user_can( $user_id, \'edit_participant\' );
edit_participant 不是我分配给角色的能力。相反,我需要使用map_meta_cap 筛选以添加我的逻辑以确定哪个是哪个:

add_filter(
    \'map_meta_cap\',
    function( $caps, $cap, $user_id, $args ) {
        if ( $cap === \'edit_participant\' ) {
            // Your logic here.
        }

        return $caps;
    }
);
map_meta_cap 我拥有所需的一系列实际能力,$caps, 当前正在检查的元功能,$cap, 这个$user_id 已传递给user_can(), 然后$args. 最后一个论点,$args 是一个数组,包含传递给的所有附加参数user_can().

例如,如果我将ID传递给user_can():

$user_can = user_can( $user_id, \'edit_participant\', $participant_id );
然后我可以这样访问它:

function( $caps, $cap, $user_id, $args ) {
    if ( $cap === \'edit_participant\' ) {
        $participant_id = $args[0];

        // Your logic here.
    }

    return $caps;
}
这意味着我可以将任意数量的参数传递给user_can() 我需要:

$user_can = user_can( $user_id, \'edit_participant\', $a, $b, $c );
以便我可以使用它们进行能力映射:

function( $caps, $cap, $user_id, $args ) {
    if ( $cap === \'edit_participant\' ) {
        $a = $args[0];
        $b = $args[1];
        $c = $args[2];

        // Your logic here.
    }

    return $caps;
}

相关推荐

正在尝试获取wp-includes/capabilities.php中非对象的属性

在调试中,我每分钟都会收到以下通知序列。日志:[23-Oct-2012 13:27:33 UTC] PHP Notice: Trying to get property of non-object in mysite/wp-includes/capabilities.php on line 1022 [23-Oct-2012 13:27:33 UTC] PHP Notice: Trying to get property of non-object in mysite/wp-includes/