如果用户是超级管理员,则CURRENT_USER_CAN()始终返回TRUE

时间:2020-04-22 作者:kwellmann

current_user_can(\'custom_capability\') 对于超级管理员,始终返回true,即使该功能如所述被明确拒绝here. 它可以与普通的管理员帐户一起使用。

我为具有特定电子邮件地址的用户添加了一个自定义功能,这是在新用户注册和插件激活时设置的。

if (!empty(get_super_admins())) {
    foreach (get_users([\'login__in\' => get_super_admins()]) as $user) {
        $user->add_cap(\'custom_capability\', false);
    }
}

foreach (get_users([\'search\' => \'*@specific-domain.com\']) as $user) {
    $user->add_cap(\'custom_capability\');
}
检查没有特定电子邮件地址的超级管理员配置文件时Denied: custom_capability 在概要文件的附加功能部分下。

的输出wp_get_current_user() 如果使用与上述相同的超级管理员帐户登录:

...

  ["caps"]=>
  array(2) {
    ["custom_capability"]=>
    bool(false)
    ["administrator"]=>
    bool(true)
  }

...
尽管如此current_user_can(\'custom_capability\') 退货true.

其他人有过这个问题吗?我是否忽视了一些事情,而这是故意的行为?

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

遗憾的是,文件中没有非常清楚“明确否认”实际上意味着什么。将功能设置为false 通常会明确拒绝该功能,该检查是在超级管理员通过后执行的。因此,尽管文档中说“除非明确拒绝”,但以这种方式拒绝对超级管理员不起作用。只有其他角色。

明确拒绝超级管理员功能的唯一方法是使用map_meta_cap 要返回的筛选器do_not_allow 检查自定义功能时。

这个map_meta_cap() 过滤器所应用的函数非常复杂,但其基本目的是执行诸如翻译之类的操作current_user_can( \'edit_post\', 2 ) 进入edit_postsedit_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
);

相关推荐

Move WP Admin Bar

我正在尝试将前端的WP管理栏移动到我的主题主标题导航下方,并使其宽度相同。我正在使用GeneratePress主题,并得到了他们的支持,以实现这一目标,但我们陷入了困境。他们是这么说的,“我刚刚翻阅了管理栏的核心WordPress代码,希望找到一种方法来解开当前位置并将其移动到其他地方,但结果是空的。基本上,我们需要将杆从当前位置脱钩,并将其钩入不同的动作。”关于如何实现这一点,有什么想法吗?