WordPress 角色和权限终极指南(译文-出处国外)
点击数: 2048
文章目录
- 郭师兄:基本上,比较重要的是创造角色,配合此篇「WordPress实现角色权限等级、是否登入等隐藏部分文章内容(纯代码不外挂)」
- WordPress 在 2.0 版本中引入了角色和权限(Roles and Capabilities)系统,以前的使用者等级的方法(User Levels)已经被弃用。但是还是有很多外挂程式和主题仍然使用使用者级别的方法来控制使用者查看设置页面和其他功能。所以这篇指南将详细介绍 WordPress 的角色和权限系统,最终将让你在你的外挂程式和主题中能够正确使用。
- 什么是角色和权限?
- 和其他 CMS 或者 Web 程式一样,WordPress 也有一个内置的系统来验证一个特定的用户是否有足够的权限来进行某种动作。 WordPress 这个内置的系统就是角色和权限系统,它首先将使用者分为角色(Role),然后给每个角色都分配一定的权限。
- 下面是 WordPress 默认的用户角色:
- 管理员-拥有所有的管理权限
- 编辑-发表文章,编辑文章,以及编辑其他人的文章,等等。
- 作者-发布和编辑自己的文章
- 投稿者-撰写和编辑自己的文章,但不能发布
- 订阅者-查看评论/添加评论/查看文章,等等。
- WordPress 的角色和权限系统比使用者等级的方法灵活得多,它支援对现有用户角色添加,删除和重新分配权限,甚至还可以添加更多的用户角色,并且不破坏系统原有内置的使用者角色。
- 使用者权限和后台功能表
- 很多外挂程式都都会在 WordPress 后台添加一个管理页面,让使用者自订外挂程式选项,一般我们可以通过下面的函数实现:
- 我们很容易发现,这些函数都会有个参数:
capability
,这个参数就是用来指定使用者看到该功能表所需要的权限。一般它的值是一个代表某种权限的字串,比如:edit_posts
。所以使用这些额函数在 WordPress 后台中添加的功能表以及与这些功能表相关联的页面,是只有拥有指定的权限的用户才可以看到和访问的。 - 如果你的主题或者外挂程式有设置页面,应该正确的控制哪些用户有权限可以访问这些页面,比如,添加的是一个主题选项页面,就应该使用
edit_themes
权限,而添加的是一个外挂程式选项页面的话,使用的应该是edit_plugins
权限,当然也可以直接manage_options
权限来控制访问外挂程式和主题选项页面。 - 许多外挂程式仍然使用使用者等级系统(用从0到10的数位代表使用者的权限),但是 WordPress 已经废弃了等级系统,不应该再被使用。所以使用权限系统,就不必去担心 WordPress 不再支援使用者等级系统,并且如果想添加和使用自订的权限,也只能使用权限系统。
- 检查用户的权限
- 如果使用的外挂程式或主题允许使用者更改博客的资料(添加新的内容或编辑现有的内容等),那么我们就要检测当前用户是否有足够的权限来执行这些动作,这个时候我们可以使用current_user_can()这个函数:
- 此函数也可以接受一个可选的参数:postID,用来检查当前用户是否有权限对特定文章进行某种操作:
// 检测用户对 ID 为 $post_ID 的日志是否有编辑的权限current_user_can( 'edit_post', $post_id );
- 还有另外一个函数:author_can(),可以用来检查某个文章的作者是否具有一定的权限:
- 函数
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
,所以我们无需担心他会修改网站其他内容了。 - 要删除一个角色,使用remove_role()函数,比如当使用者决定卸载外挂程式时,就应该有一个选项让外挂程式的使用者可以删除这些自订角色:
remove_role( 'photo_uploader' );
- 添加自订用户权限
- 如果我们想为现有用户添加权限该怎么办呢?继续我们的相册外挂程式的例子,我们想让作者也有上传图片的权限,我们可以使用add_cap()函数:
- WordPress的权限类
- 我们已经讨论过了检查和添加权限,以及添加角色,这是管理 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; //通过角色名称得到一个角色,和get_role()功能一样$wp_roles->get_role( $role );
- 还可以得到一个可用角色列表,含有角色的名称和角色的显示名称。这个对想为使用者提供一个介面,改变权限分配时候非常有用的。
global $wp_roles; //得到一个值列表包括 $role_name => $display_name$roles = $wp_roles->get_names();
- 最后可以使用
$wp_roles
添加和删除权限,此物件几乎包括所有的角色和权限操作。 - wp_Role 类
- 这是一个非常简单的类,它的功能就是添加和删除权限。
- wp_User类
- 这个类可以管理每个用户的角色和权限,这意味着可以为一个特定具体的用户分配多个角色,或者为当前用户添加特定的权限,不论他目前是什么角色。
- 首先需要获取使用者物件来操纵它的角色和权限:
- 我们可以通过使用者ID或用户名得到一个使用者物件。对于第二种方法,第一个参数必须是空的(
null
或空字串),如: - 一旦得到了使用者物件,就可以为这个用户的添加另一个角色,而无需修改他目前的角色,这意味着用户可以有多个角色:
$user->add_role( $role_name );
- 也可以使用
remove_role()
,来为该用户删除某个角色: $user->remove_role( $role_name );
- 还可以为该用户设置一个角色,这意味着该用户将被删除当前所有的角色,并分配一个新的角色:
$user->set_role( $role_name );
- 对于权限操作,也有很多的方法来做各种事情:
- WordPress角色和权限之结论
郭师兄:基本上,比较重要的是创造角色,配合此篇「WordPress实现角色权限等级、是否登入等隐藏部分文章内容(纯代码不外挂)」
WordPress 在 2.0 版本中引入了角色和权限(Roles and Capabilities)系统,以前的使用者等级的方法(User Levels)已经被弃用。但是还是有很多外挂程式和主题仍然使用使用者级别的方法来控制使用者查看设置页面和其他功能。所以这篇指南将详细介绍 WordPress 的角色和权限系统,最终将让你在你的外挂程式和主题中能够正确使用。
什么是角色和权限?
和其他 CMS 或者 Web 程式一样,WordPress 也有一个内置的系统来验证一个特定的用户是否有足够的权限来进行某种动作。 WordPress 这个内置的系统就是角色和权限系统,它首先将使用者分为角色(Role),然后给每个角色都分配一定的权限。
下面是 WordPress 默认的用户角色:
-
管理员-拥有所有的管理权限
-
编辑-发表文章,编辑文章,以及编辑其他人的文章,等等。
-
作者-发布和编辑自己的文章
-
投稿者-撰写和编辑自己的文章,但不能发布
-
订阅者-查看评论/添加评论/查看文章,等等。
WordPress 的角色和权限系统比使用者等级的方法灵活得多,它支援对现有用户角色添加,删除和重新分配权限,甚至还可以添加更多的用户角色,并且不破坏系统原有内置的使用者角色。
使用者权限和后台功能表
很多外挂程式都都会在 WordPress 后台添加一个管理页面,让使用者自订外挂程式选项,一般我们可以通过下面的函数实现:
// 添加主菜单add_menu_page(page_title,menu_title,capability,handle, [function], [icon_url]);
// 添加子功能表add_submenu_page(parent,page_title,menu_title,capability,file/handle, [function]);
//添加选项功能表子功能表add_options_page(page_title,menu_title,capability,handle, [function]);
//添加工具功能表子功能表add_management_page(page_title,menu_title,capability,handle, [function]);
//添加页面功能表子功能表add_pages_page(page_title,menu_title,capability,handle, [function]);
//添加文章菜单子功能表add_posts_page(page_title,menu_title,capability,handle, [function]);
//添加主题功能表子功能表add_theme_page(page_title,menu_title,capability,handle, [function]);
我们很容易发现,这些函数都会有个参数:capability
,这个参数就是用来指定使用者看到该功能表所需要的权限。一般它的值是一个代表某种权限的字串,比如:edit_posts
。所以使用这些额函数在 WordPress 后台中添加的功能表以及与这些功能表相关联的页面,是只有拥有指定的权限的用户才可以看到和访问的。
如果你的主题或者外挂程式有设置页面,应该正确的控制哪些用户有权限可以访问这些页面,比如,添加的是一个主题选项页面,就应该使用edit_themes
权限,而添加的是一个外挂程式选项页面的话,使用的应该是edit_plugins
权限,当然也可以直接manage_options
权限来控制访问外挂程式和主题选项页面。
许多外挂程式仍然使用使用者等级系统(用从0到10的数位代表使用者的权限),但是 WordPress 已经废弃了等级系统,不应该再被使用。所以使用权限系统,就不必去担心 WordPress 不再支援使用者等级系统,并且如果想添加和使用自订的权限,也只能使用权限系统。
检查用户的权限
如果使用的外挂程式或主题允许使用者更改博客的资料(添加新的内容或编辑现有的内容等),那么我们就要检测当前用户是否有足够的权限来执行这些动作,这个时候我们可以使用current_user_can()这个函数:
if (current_user_can( $capability ) ) {
//如果用户拥有 $capability 的权限时执行的动作。}
此函数也可以接受一个可选的参数:postID,用来检查当前用户是否有权限对特定文章进行某种操作:
// 检测用户对 ID 为 $post_ID 的日志是否有编辑的权限current_user_can( '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
,所以我们无需担心他会修改网站其他内容了。
要删除一个角色,使用remove_role()函数,比如当使用者决定卸载外挂程式时,就应该有一个选项让外挂程式的使用者可以删除这些自订角色:
remove_role( 'photo_uploader' );
添加自订用户权限
如果我们想为现有用户添加权限该怎么办呢?继续我们的相册外挂程式的例子,我们想让作者也有上传图片的权限,我们可以使用add_cap()函数:
//获取 "author" 的角色物件$role =get_role( 'author' );
//为角色物件添加 "organize_gallery" 权限$role->add_cap( 'organize_gallery' );
WordPress的权限类
我们已经讨论过了检查和添加权限,以及添加角色,这是管理 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 = newwp_User( $id );
//或者通过用户名$user = newwp_User(null, $name );
我们可以通过使用者ID或用户名得到一个使用者物件。对于第二种方法,第一个参数必须是空的(null
或空字串),如:
//通过ID得到管理员物件$admin = newwp_User( 1 );
//通过用户名得到管理员物件$admin = newwp_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();