使用时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_post
和edit_user
是否由map_meta_cap()
映射到用户或角色具有的基本功能的函数,例如edit_posts
和edit_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_participants
和edit_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;
}