我只是补充一下“稀有答案”。
从技术上讲,您可以为这些函数提供角色名称,因此current_user_can( \'administrator\' )
或user_can( $user_id, \'administrator\' )
也可以,但它是discouraged.
虽然部分支持针对特定角色而不是功能进行检查,但不鼓励这种做法,因为它可能会产生不可靠的结果。
注意:如果当前用户是超级管理员,则将始终返回true,除非明确拒绝。
您可以在不依赖这些功能的情况下检查角色(因为它们不可靠),但正如@Rarst所说,检查功能而不是角色更合适。
使用功能而不是角色的一个主要优势如下。
例如,您的站点上有多个管理员。假设你希望你的客户是管理员,你也是网站的管理员。
现在,您的客户端对其站点具有管理权限是有道理的,但您可能不希望他/她能够在站点上安装插件。那将是你作为网站管理员的工作。
因此,如果您检查角色,您将无法禁用/启用everyone 在该角色范围内。
现在,如果您使用功能,您将在授予/限制用户执行特定操作方面拥有更大的粒度。
回到我的场景,如果你想给你的客户机管理员权限,但不能安装插件,那就简单到
add_filter( \'user_has_cap\', \'client_admin_cap_filter\', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){
// the requested capability and our client user id
if ( \'install_plugins\' == $args[0] && $args[1] == 2 )
$allcaps[ $cap[0] ] = false;
return $allcaps;
}
例如,我们可以提供一系列想要限制的不同功能
update_core
,
manage_options
,
install_plugins
,
install_themes
等
我们的功能仍然很简单
add_filter( \'user_has_cap\', \'client_admin_cap_filter\', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){
$restricted_cap = array(
\'update_core\',
\'manage_options\',
\'install_plugins\',
\'install_themes\',
// etc.
);
foreach( $restricted_cap as $r_cap ){
// the requested capability and our client user id
if ( $r_cap == $args[0] && $args[1] == 2 )
$allcaps[ $cap[0] ] = false;
}
return $allcaps;
}
如您所见,这非常有效,不需要特殊角色,不添加额外的DB查询,在运行时执行,并且易于扩展和维护。
如果你的逻辑依赖于一个角色,那么祝你好运,目标是特定的用户、场景或诸如此类的东西,而不必为了跟上所有可能的用例而大惊小怪或创建无数个角色。
有关user_has_cap
滤器