DOOFOX BLOG

3月 05 2018 Category:

深入理解 WordPress 角色和权限

WordPress 的用户功能管理基于用户所属的角色和角色所具备的权限。
角色是由唯一名称和一组权限组成的,每个权限都可用于定义角色是否可以访问平台的特定功能。
接下来让我们仔细看看 WordPress 角色和权限 的相关内容。

角色和权限的介绍

角色的存储

在 WordPress Codex 上提供了默认的角色和功能列表。
数据库会将此列表存储在 wp_options 表中,key 为 wp_user_roles 内容是序列化的对象,类似下面那样。

array(
    'administrator' => array(
        'name'         => 'Administrator',
        'capabilities' => array(
            'switch_themes'          => true,
            'edit_themes'            => true,
            'activate_plugins'       => true,
            'edit_plugins'           => true,
            'edit_users'             => true,
            // [...]
        )
    ),
    'contributor' => array(
        'name'         => 'Contributor',
        'capabilities' => array(
            'delete_pages'           => true,
            'delete_others_pages'    => true,
            'delete_published_pages' => true,
            'delete_posts'           => true,
            // [...]
        )
    ),
    // [...]
);

这些数据在创建 WordPress 的时候会自动生成,在 WordPress 加载前会进行读取,大概发生在 plugins_loaded 到 init 之间。

用户绑定角色

角色是完全独立的数据,在创建用户时,会默认给用户设置一个合适的角色,默认情况下是 “订阅者” Subscriber 。
用户所属的角色会保存在 wp_usermeta 表中的 meta_key 为 wp_capabilities 的字段。
它看起来就像下面这样

array(
    'administrator' => true
)

请留意,虽然 WordPress 的用户只能有一个角色身份,但是它使用的是一个以数组形式的保存方式,我们稍后会看到这样做的原因。

请记住,wp_capabilities 这个字段中的 wp_ 部分是当前博客的前缀
(我们可以通过该函数来获取它)。$GLOBALS[‘wpdb’]->get_blog_prefix()

多站点的处理

在使用多站点的情况下,同一个用户可以在不同站点设置为不同的角色,字段前缀和上面介绍的规则相同。

wp_capabilities => a:1:{s:13:"administrator";b:1;}
wp_10_capabilities => a:1:{s:11:"contributor";b:1;}
wp_15_capabilities => a:1:{s:10:"subscriber";b:1;}
[...]

弃用的 level

wp_user_level 在 WordPress3.0 版本就已被废弃,它被用来处理旧版本中的 WordPress 的角色。

在代码中使用权限

在 WordPress 的任何地方都可以通过 current_user_can 进行权限的验证。
例如:

// 验证当前用户是否有权限激活插件
if (!current_user_can('activate_plugins'))
{
    wp_die('你不能在此站点管理插件,可能没有相关权限.')
}