遗憾的是,文件中没有非常清楚“明确否认”实际上意味着什么。将功能设置为false
通常会明确拒绝该功能,该检查是在超级管理员通过后执行的。因此,尽管文档中说“除非明确拒绝”,但以这种方式拒绝对超级管理员不起作用。只有其他角色。
明确拒绝超级管理员功能的唯一方法是使用map_meta_cap
要返回的筛选器do_not_allow
检查自定义功能时。
这个map_meta_cap()
过滤器所应用的函数非常复杂,但其基本目的是执行诸如翻译之类的操作current_user_can( \'edit_post\', 2 )
进入edit_posts
或edit_others_posts
基于用户的能力。因为map_meta_cap()
在超级管理员检查之前运行,我们可以使用此筛选器显式返回do_not_allow
检查时current_user_can( \'custom_capability\' )
是为一个没有这种能力的超级管理员设计的。下面是一些代码:
add_filter(
\'map_meta_cap\',
function( $caps, $cap, $user_id ) {
/**
* Only filter checks for custom_capability.
*/
if ( \'custom_capability\' === $cap ) {
$user = get_userdata( $user_id );
$user_caps = $user->get_role_caps();
/**
* If the user does not have the capability, or it\'s denied, then
* add do_not_allow.
*/
if ( empty( $user_caps[$cap] ) ) {
$caps[] = \'do_not_allow\';
}
}
return $caps;
},
10,
3
);