对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,file/handle,[function]);

//添加选项菜单子菜单
add_options_page(page_title,[function]);

//添加工具菜单子菜单
add_management_page(page_title,[function]);

//添加页面菜单子菜单
add_pages_page( page_title,[function]);

//添加文章菜单子菜单
add_posts_page( page_title,[function]);

//添加主题菜单子菜单
add_theme_page( page_title,[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 = 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 角色和权限的知识,WordPress 强大的用户角色和权限管理系统可以让我们随时创建复杂的项目。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我想将wordpress的默认接口路由改掉,愿意是默认的带一个 wp-json,我想换成 api,直接简单明了。默认路由https://www.xxzhuti.com/wp-json/wp/v2/posts/1新的路由https://www.xxzhuti.com/api/wp/v2/posts/1路由修改wordpress提供了一个钩子来修改 wp-json 的地址,代码入汛function r
wordpress自定义分类法之后,我看到链接都自动在后面添加了一个斜杠,如下图所示打开链接后都是先从一个链接301后到另外一个链接,我这个纳闷,然后一顿找原因,最后竟然是因为固定链接看我后台的固定链接是 /%post_id%/ 这么写的,然后每次都会301自动跳转。正确的写法是 /%post_id%.html 这样写才不会301跳转。一个小问题,往往一个小问题就会折腾好长时间,在这记录一下吧..
事情是这样的,我用 get_post_type 函数创建了一个自定义分类法类型,然后自定义了文件的访问路径代码如下。function tblog_chat_template( $template_path ){    if ( get_post_type() == 'aichat' ) {         if ( is_single() )         {             $temp
最近网站莫名其妙的被顶上了,过一个多小时,就注册一个账号,虽然不多,但是也挺烦,时间一长垃圾注册的就多了。由于我前台把注册关掉了,只允许用第三方登录,经过查找发现是通过后台注册的,后台无须邮箱验证即可注册,也是就想着在后台加个验证码。效果如下实现方法一将下面的代码加入到 function.php 中,刷新页面就会看到。//WordPress新用户注册随机数学验证码function add_s...
最近服务器要到期了,就想着把网站转移到另外一台服务器,本来打算要续费的,但是腾讯云的服务器有了新的规定,域名必须在腾讯云备案才能使用,在别的地方备案的域名需要转到腾讯云,在腾讯云在走一遍备案流程,若是备案简单,时间短也就无所谓了,就转一下,可是这个备案大家也知道,至少得一个月,于是就只能放弃腾讯云了,将站点转回备案的阿里云,以后就用阿里云了,贵点就贵点吧。这不网站迁移过去了,死活图片不显示,各..
今天在写wordpress的接口,然后碰到个奇怪的问题,怎么访问都提示 rest_no_route 的错误,然后就一直跟踪代码,终于找到原因所在。报错信息{'code': 'rest_no_route','message': '未找到匹配URL和请求方式的路由。','data': {'status': 404}}原因分析register_rest_route( string $namespace,
今天看到群友突然滴滴滴的找我QQ,好像出什么大事情一样。原来他由于误操作导致网站文章被删除。
今天遇到一个网友提示网站访问速度比较慢,然后通知日志看到有他的网站WordPress默认登录地址wp-login.php一直在被爬虫抓取,因为是有被破解后台账户信息,导致的占用数据库资源使得网站资源带宽不足后访问降低导致
今天老左在帮助客户升级WordPress的时候我看他网站也比较简单就直接在后台手工升级的。升级后打开网站有出现"There has been a critical error on your website."的错误提示。
我们在使用WordPress搭建的网站是否有留意查看源代码的时候看到标题中的原本"-",被转义成"&#8211"。其实这样并不影响用户阅读体验和搜索引擎,搜索引擎在收录后也会反向转义的。就是感觉看
WordPress默认是无法上传.webp格式的文件,如果要上传需要对上传文件限制进行解除后才能上传。
GTranslate 是一个流行的翻译插件,在免费和付费版本中提供不同的体验。 使用免费版本,您可以轻松提供任何语言的动态翻译,而付费版本提供可索引、可编辑的翻译版本,就像 Weglot 一样。
时下主流的浏览器都自带了广告屏蔽功能,还有ADSafe、ADB等软件插件,不断更新,屏蔽网站代码!
您是否正在寻找可用于显示数据的 WordPress 表格插件? WordPress 表格插件可让您以表格格式存储和呈现数据,以方便访问者阅读。
wordPress数据库除了本身的表以外,部分插件会增加表来存储数据。如果插件已经删除了,这些插件生成的表还在数据库中,那么怎么删除呢?
WordPress几乎是世界上最安全的开源程序,但其后台登录注册的地址始终是众所周知的,所以不少人觉得隐藏WordPress的登录地址后可能会更加安全。下面浩子就针对这个问题来简单说明一下方法。WordPress隐藏后台登录地址
自 WordPress 5.8 正式版发布 以后,后台的小工具就默认是块编辑器的界面样式,很多老用户还没有来得及学习就一脸茫然了,今天浩子就来教大家如何恢复WordPress经典小工具。
您想用您的语言翻译 WordPress 插件吗?许多 WordPress 插件是完全可翻译的,世界上任何人都可以轻松翻译。在本文中,我们将向您展示如何轻松地将 WordPress 插件翻译成您的语言(无需任何代码)。
WordPress新手不清楚WordPress调试模式怎么开启,今天来教大家认识和开启。什么是WordPress的调试模式
最近不少用户反馈说WordPress后台的外观-自定义点开后直接报错,错误信息如下: