WordPress 有哪些角色?又是怎么判断用户的权限?一文详解 WordPress 角色和权限系统
WordPress 在 2.0 版本中引入了角色和权限(Roles and Capabilities)系统之后,就弃用了之前的用户等级(User Levels)的方法。
简单来说角色和权限系统是用来来验证用户是否有足够的权限来进行某项操作,WordPress 一般是这样操作的,首先给用户分分配角色(Role),然后给每个角色都分配一定的权限(Capabilities),最后用户进行操作的时候,通过判断这个用户是否有某项权限来确认。
下面我们就通过本文来详解这个系统,让大家能够有个深入的了解。
什么是角色和权限?
和绝大部分 CMS 或其他程序一样,WordPress 也有一个内置的系统来验证一个特定的用户是否有足够的权限来进行某项动作。WordPress 这个内置的系统就是角色和权限系统,它首先将用户分为角色(Role),然后给每个角色都分配一定的权限。
下面是 WordPress 默认的用户角色:
- 管理员 -拥有所有的管理权限
- 编辑 -发表文章,编辑文章,以及编辑其他人的文章,等等。
- 作者-发布和编辑自己的文章
- 投稿者 -撰写和编辑自己的文章,但不能发布
- 订阅者 -查看评论/添加评论/查看文章,等等。
WPJAM Basic 的「用户角色」扩展支持在 WordPress 后台可视化管理,首先就罗列了所有的用户角色:
WordPress 的角色和权限系统比之前的用户等级的方法灵活得多,它支持对现有用户角色添加,删除和重新分配权限,甚至还可以在不破坏系统原有内置角色的基础上添加更多的用户角色。
用户权限和后台菜单
很多插件都都会在 WordPress 后台添加一个管理页面,让用户自定义插件选项,一般我们可以通过下面这些函数实现:
// 添加主菜单
add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $icon_url = '', $position = null )
// 添加子菜单
add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
// 添加选项菜单子菜单
add_options_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
// 添加工具子菜单
add_management_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
// 添加页面子菜单
add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
// 添加文章子菜单
add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
// 添加媒体子菜单
add_media_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
// 添加主题子菜单
add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
// 添加插件子菜单
add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
// 添加用户子菜单
add_users_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
// 添加仪表盘子菜单
add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null )
如果使用 WPJAM Basic 进行二次开发,可以使用 wpjam_add_menu_page
来添加:
wpjam_add_menu_page('wpjam-seo', [
'parent' => 'wpjam-basic', // 页面在 WPJAM Basic 菜单下
'menu_title' => 'SEO设置', // 菜单和页面的标题
'function' => 'option', // 这是一个设置页面
'option_name' => 'wpjam-seo', // 设置的名称
'fields' => [ // 设置选项的字段
'home_title' => ['title'=>'首页SEO标题', 'type'=>'text'],
'home_description' => ['title'=>'首页SEO描述', 'type'=>'textarea', 'class'=>''],
'home_keywords' => ['title'=>'首页SEO关键字', 'type'=>'text' ],
]
]);
我们很容易发现,这些函数都会有个参数:capability
,这个参数就是用来指定用户看到该菜单所需要的权限。一般它的值是一个代表某种权限的字符串,比如:edit_posts
,设置了之后就是说所有使用这些函数在后台中添加的菜单以及与这些菜单相关联的页面,是只有拥有指定的权限的用户才可以看到和访问的。
一搬主题或者插件会有设置页面,这些页面都要控制,只给一部分用户可以访问,那么怎么更好的控制呢?比如主题选项页面,就应该使用 edit_themes
权限,而插件选项页面的话,使用的应该是 edit_plugins
权限,当然也可以直接 manage_options
权限来限制只能管理员访问插件和主题选项页面。
判断用户的权限
如果使用的插件或主题允许用户更改博客的数据(添加新的内容或编辑现有的内容等),那么我们就要检测当前用户是否有足够的权限来执行这些动作,这个时候我们可以使用 current_user_can() 这个函数:
if ( current_user_can( $capability ) ) {
//如果用户拥有 $capability 的权限时执行的动作。
}
此函数也可以接受一个可选的参数:postID,用来检查当前用户是否有权限对特定文章进行某种操作:
// 检测用户对 ID 为 $post_ID 的日志是否有编辑的权限
current_user_can( 'edit_post', $post_id );
如果不是判断当前登录的用户,判断某个用户是否有某项权限,可以使用 user_can 函数:
// 检测 ID 为 245 的用户对 ID 为 $post_ID 的文章是否有编辑的权限
user_can( 245, 'edit_post', $post_id );
除此之外,还有个函数:author_can(),可以用来检查某篇文章的作者是否具有权限:
if ( author_can( $post, $capability ) ) {
// 如果文章 $post 的作者拥有 $capability 时执行的动作
}
函数 author_can
第一个参数可以是一个 $post 对象,或一个 Post ID。
自定义用户角色
有时候需要为插件添加新的用户角色,比如我们要写一个相册插件,用户可以注册并上传照片到网站,但是我们不希望这些注册用户可以添加或修改网站上任何其他类型的内容(如文章或页面),为了做到权限细分,最好的办法就是添加一个新的自定义用户角色:
添加自定义用户角色用到的函数是:add_role(),它会添加含有一组权限的一个新的用户角色,这里我添加一个叫做 'photo_uploader' 的用户角色,它显示的名字是:'Photo Uploader',它默认的权限是:'organize_gallery':
add_role( 'photo_uploader', 'Photo Uploader', array( 'organize_gallery' ) );
创建好用户角色之后,当一个用户创建,编辑或上传相册的时候,我们就可以使用 current_user_can( 'organize_gallery' )
来检查当前用户是否有权限了。
并且被赋予了这个角色的用户只可以 organize_gallery
,但不能 edit_posts
或 publish_posts
,所以我们无需担心他会修改网站其他内容了。
WPJAM Basic 的「用户角色」扩展支持在 WordPress 后台可视化管理用户角色,并且支持对角色进行增删查和修改
要删除一个角色,使用 remove_role() 函数,比如当用户决定卸载插件时,就应该有一个选项让插件的用户可以删除这些自定义角色:
remove_role( 'photo_uploader' );
自定义用户权限
如果我们想为现有用户添加权限该怎么办呢?继续我们的相册插件的例子,我们想让作者也有上传图片的权限,我们可以使用 add_cap() 函数:
//获取 "author" 的角色对象
$role = get_role( 'author' );
//为角色对象添加 "organize_gallery" 权限
$role->add_cap( 'organize_gallery' );
同样,如上图所示,WPJAM Basic 的「用户角色」扩展也支持自定义现有角色的权限列表。
角色和权限相关类
我们已经讨论过了检查和添加权限,以及添加角色,这是管理 WordPress 用户权限最常用的函数,我们希望更加深入一些,接着会介绍 WordPress 用于角色和权限管理幕后工作的三个类,以及这些类提供的接口,我们可以在插件中进行高级权限管理。
首先这三个类是:
- WP_Roles
- WP_Role
- WP_User
这三个类的源代码可以在 wp-includes/capabilities.php
中找到,源代码注释写得很详细,下面总结一下怎样使用这些类:
WP_Roles 类
WP_Roles 是一般的角色管理类,当我们在插件中使用的时候,可以不用实例化一个新的对象,而是直接使用 WordPress 默认创建的一个全局对象 $wp_roles
,可以在任何地方使用它,只要事先声明 global
即可:
global $wp_roles;
我们上面使用的函数 add_role()
和 remove_role()
实际上是 $wp_roles->add_role()
和 $wp_roles->remove_role()
的别名。因此,我们也可以直接使用 $wp_roles
对象添加和删除角色,例如:
global $wp_roles;
//添加新角色,和add_role()功能一样
$wp_roles->add_role( $role, $display_name, $capabilities )
//删除角色, 和remove_role()功能一样
$wp_roles->remove_role( $role );
同样也可以使用类的方法获取一个角色:
global $wp_roles;
//通过角色名称得到一个角色,和get_role()功能一样
$wp_roles->get_role( $role );
还可以得到一个可用角色列表,含有角色的名称和角色的显示名称。这个对想为用户提供一个接口,改变权限分配时候非常有用的。
global $wp_roles;
//得到一个值列表包括 $role_name => $display_name
$roles = $wp_roles->get_names();
最后可以使用 $wp_roles
添加和删除权限,此对象几乎包括所有的角色和权限操作。
global $wp_roles;
//为角色$role添加权限$cap
$wp_roles->add_cap( $role, $cap );
//为角色$role删除权限$cap
$wp_roles->remove_cap( $role, $cap );
//例子
$wp_roles->add_cap( 'administrator', 'manage_galleries' );
$wp_roles->remove_cap( 'subscriber', 'view_galleries' );
WP_Role 类
这是一个非常简单的类,它的功能就是添加和删除权限。
//得到角色对象
$role_object = get_role( $role_name );
//为角色对象添加权限$cap
$role_object->add_cap( $capability_name );
//为角色对象删除权限$cap
$role_object->remove_cap( $capability_name );
WP_User 类
这个类可以管理每个用户的角色和权限,这意味着可以为一个特定具体的用户分配多个角色,或者为当前用户添加特定的权限,不论他目前是什么角色。
首先需要获取用户对象来操纵它的角色和权限:
//通过用户ID得到用户对象
$user = new WP_User( $id );
//或者通过用户名
$user = new WP_User( null, $name );
我们可以通过用户ID或用户名得到一个用户对象。对于第二种方法,第一个参数必须是空的(null
或空字符串),如:
//通过ID得到管理员对象
$admin = new WP_User( 1 );
//通过用户名得到管理员对象
$admin = new WP_User( null, 'admin' );
一旦得到了用户对象,就可以为这个用户的添加另一个角色,而无需修改他目前的角色,这意味着用户可以有多个角色:
$user->add_role( $role_name );
也可以使用 remove_role()
,来为该用户删除某个角色:
$user->remove_role( $role_name );
还可以为该用户设置一个角色,这意味着该用户将被删除当前所有的角色,并分配一个新的角色:
$user->set_role( $role_name );
对于权限操作,该类也有很多的方法来做各种事情:
//检查该用户是否具有某种权限或角色名称
if ( $user->has_cap( $cap_name ) ) {
//做一些事
}
//为用户添加权限
$user->add_cap( $cap_name );
//为用户删除权限
$user->remove_cap( $cap_name );
//删除用户所有权限
$user->remove_all_caps();
角色和权限总结
以上就是所有有关 WordPress 角色和权限的知识,WordPress 强大的用户角色和权限管理系统可以让我们随时创建复杂的项目。