在wordpress主题开发和日常使用过程中,清楚的了解不同的权限之间的联系,是很有必要的,这一篇wordpress权限的文章来源于官方文档,值得参考。
描述
WordPress使用角色概念,旨在让网站所有者能够控制用户在网站内可以做什么和不可以做什么。站点所有者可以通过为每个用户分配特定角色来管理用户对诸如撰写和编辑帖子,创建页面,定义链接,创建类别,审核评论,管理插件,管理主题以及管理其他用户等任务的访问权限。
WordPress有六个预定义的角色:超级管理员,管理员,编辑,作者,贡献者和订阅者。允许每个角色执行一组称为“ 功能”的任务。有许多功能,包括“ publish_posts ”,“ moderate_comments ”和“ edit_users ”。为每个角色预先分配了一组默认功能,但可以使用add_cap()和 remove_cap()函数分配或删除其他功能。可以使用add_role()引入或删除新角色和remove_role()函数。
在超级管理员角色允许用户执行所有可能的功能。每个其他角色的允许功能数量都在减少。例如,订阅者角色只具有“ 读取 ”功能。不应将一个特定角色视为另一个角色的高级角色。相反,请考虑角色定义用户在站点内的职责。
WordPress 的角色和权限系统比用户等级的方法灵活得多,它支持对现有用户角色添加,删除和重新分配权限,甚至还可以添加更多的用户角色,并且不破坏系统原有内置的用户角色。
使用权限系统,就不必去担心 WordPress 不再支持用户等级系统,并且如果想添加和使用自定义的权限,也只能使用权限系统。
角色摘要
- 超级管理员 - 有权访问网站管理功能和所有其他功能的人。请参阅创建网络文章。
- 管理员(slug:'administrator') - 有权访问单个站点中的所有管理功能的人。
- 编辑(slug:'编辑') - 可以发布和管理帖子的人,包括其他用户的帖子。
- 作者(slug:'author') - 可以发布和管理自己帖子的人。
- 贡献者(slug:'贡献者') - 可以编写和管理自己的帖子但无法发布它们的人。
- 订阅者(slug:'subscriber') - 只能管理其个人资料的人。
安装WordPress后,将自动创建管理员帐户。
可以在“ 管理面板” > “设置” >“ 常规”中设置新用户的默认角色。
您可以通过访问全局WP_Roles对象的role_names属性(可以使用wp_roles()检索,或者在版本4.3之前使用全局$ wp_roles;)来查看所有已定义角色的列表。
角色
角色定义允许用户分配角色的一组任务。例如,超级管理员角色包括能够在内部进行一切可能的任务,网络虚拟的WordPress 网站。该管理员角色限制所允许的任务,只有那些影响一个站点。另一方面,Author角色只允许执行一小部分任务。
来源于:
https://www.solagirl.net/wordpress-get-current-user-role.html
过去判断登录用户的角色我喜欢用current_user_can(),比如判断当前用户是否是作者用current_user_can('author'),记得WordPress官方文档中给的例子也是这样用,不过今天看了一下文档,貌似用法变了,传递角色作为参数不再可靠,正确的用法是传递$capability,那么该如何判断用户角色呢?
注:以下内容在WP 3.4+上测试通过
current_user_can()的正确用法
current_user_can()文档中有一句话要注意一下
Do not pass a role name to current_user_can(), as this is not guaranteed to work correctly.
意思是说传递用户角色名称(如author、contributor)作为参数不能100%保证返回正确的结果,正确的用法是传递$capability,从这个函数的表面意思看,参数是权限比参数是角色名称更靠谱。
所以,要根据不同角色拥有的权限来判断用户角色,用户权限可以在Roles and Capabilities中找到。
判断用户是否为管理员(Administrator)
if( current_user_can( 'manage_options' ) ) { echo 'The current user is a administrator'; }
判断用户是否为编辑(Editor)
if( current_user_can( 'publish_pages' ) && !current_user_can( 'manage_options' ) ) { echo 'The current user is an editor'; }
判断用户是否为作者(Author)
if( current_user_can( 'publish_posts' ) && !current_user_can( 'publish_pages' ) ) { echo 'The current user is an author'; }
判断用户是否为投稿者(Contributor)
if( current_user_can( 'edit_posts' ) && !current_user_can( 'publish_posts' ) ) { echo 'The current user is a contributor'; }
判断用户是否为订阅者(Subscriber)
if( current_user_can( 'read' ) && !current_user_can( 'edit_posts' ) ) { echo 'The current user is a subscriber'; }
用$current_user判断
$current_user是WordPress的一个全局变量,当用户登录后,这个里面就会有用户的角色和权限信息。
当WordPress的init action执行后,就可以安全的使用$current_user全局变量了。
在模板文件中判断登录用户是否为作者(Author)
global $current_user; if( $current_user->roles[0] == 'author' ) { echo 'The current user is an author'; }
在functions.php中判断用户是否为作者(Author)
add_action( 'init', 'check_user_role' ); function check_user_role() { global $current_user; if( $current_user->roles[0] == 'author' ) { echo 'The current user is an author'; } }
之所以要使用
add_action( 'init', 'check_user_role' );
是因为$current_user这个全部变量到init action执行时才完成赋值,既然要读它的内容,至少要等到它的内容准备好后再读取。functions.php的代码先与init action执行,所以在functions.php中直接写global $current_user是无法获取用户信息的。详细信息可以参考《WordPress Actions加载顺序》。
检查用户角色之前,还可以先检查一下用户是否登录
if( is_user_logged_in() ) { //用户已登录,检查用户角色 } ?>
author_can(),可以用来检查某个文章的作者是否具有一定的权限:
if ( author_can( $post, $capability ) ) {
// 如果文章 $post 的作者拥有 $capability 时执行的动作
}
函数 author_can
第一个参数可以是一个 $post 对象,或一个 Post ID。
更简单的方法
还有一种更直接的方法,例如判断当前用户是否为管理员
global $current_user; if(in_array( 'administrator', $current_user->roles )){ echo 'administrator'
你好,请问判断用户登录后再提供下载链接,这样如何操作?
if ( is_user_logged_in() ) { echo '登陆用户'; } else { echo '未登录用户!'; }
WordPress判断用户等级显示相应内容
- 参考原文:详情
实现方法
if( !current_user_can('administrator') ) { echo '这段文字在非管理员角色才会显示,因为判断函数前加了感叹号。'; }?>
判断是否管理员
if( current_user_can('administrator') ) { echo '这段文字只会在“管理员”角色登录后显示。'; }?>
判断是否编辑
if( current_user_can('editor') ) { echo '这段文字只会在“编辑”角色登录后显示。'; }?>
判断是否作者
if( current_user_can('author') ) { echo '这段文字只会在“作者”角色登录后显示。'; }?>
判断是否投稿者
if( current_user_can('contributor') ) { echo '这段文字只会在“投稿者”角色登录后显示。'; }?>
判断是否订阅者
if( current_user_can('subscriber') ) { echo '这段文字只会在“订阅者”角色登录后显示。'; }?>
根据权限判断角色
有些时候因为某些原因用户角色权限会被修改,所以这个时候再用以上代码直接判断用户角色可能就实现不到我们想要的功能了,但我们还可以通过区分权限来区分角色。
if( current_user_can( ‘manage_options’ ) ) { echo ‘这段文字只会在“管理员”角色登录后显示。’; } if( current_user_can( ‘publish_pages’ ) && !current_user_can( ‘manage_options’ ) ) { echo ‘这段文字只会在“编辑”角色登录后显示。’; } if( current_user_can( ‘publish_posts’ ) && !current_user_can( ‘publish_pages’ ) ) { echo ‘这段文字只会在“作者”角色登录后显示。’; } if( current_user_can( ‘edit_posts’ ) && !current_user_can( ‘publish_posts’ ) ) { echo ‘这段文字只会在“投稿者”角色登录后显示。’; } if( current_user_can( ‘read’ ) && !current_user_can( ‘edit_posts’ ) ) { echo ‘这段文字只会在“订阅者”角色登录后显示。’; } ?>
WordPress 会员等级
首先先来了解WordPress会员的等级区分:
管理者:Administrator: level 10
编辑:Editor: Level 7
作者:Author: Level 4
撰写人员:Contributor: Level 2
订阅者:Subscriber: Level 0
一般访客(非会员): Level 在 0 以下
以下将使用官方提供的函数: current_user_can 来做会员等级区分.
仅允许管理员可浏览
global $user_ID; if( $user_ID ) : ?>if( current_user_can('level_10') ) : ?>
这里显示的内容为管理员可以看到的.
endif; ?>endif; ?>
依照会员等级显示不同的内容
if (current_user_can('level_10')) : ?>
管理员可看到
elseif (current_user_can('level_7')) : ?>
编辑可看到
elseif (current_user_can('level_4')) : ?>
作者可看到
elseif (current_user_can('level_2')) : ->
撰写者可看到
elseif (current_user_can('level_0')) : ?>
订阅者可看到
else : ?-->
一般非会员(未登入者)可看到
endif; ?-->
用户权限和后台菜单
- 原文来源:详情
很多插件都都会在 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
权限来控制访问插件和主题选项页面。
显示不同权限的用户
- 原文参考:详情
在数据库中,关于权限的字段位于数据库中 wp_usermeta 表中的 meta_value,所以这个判断函数可以这么写:
//以下为代码正文… global $wpdb; //显示管理员 $administrators = $wpdb->get_col("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'wp_user_level' AND meta_value = 10 ORDER BY user_id"); //显示管理员、编辑 $editors = $wpdb->get_col("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'wp_user_level' AND meta_value >= 7 ORDER BY user_id"); //显示管理员、编辑、作者 $authors = $wpdb->get_col("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'wp_user_level' AND meta_value >= 2 ORDER BY user_id"); //显示管理员、编辑、作者、投稿者 $contributors = $wpdb->get_col("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'wp_user_level' AND meta_value >= 1 ORDER BY user_id"); //显示管理员、编辑、作者、投稿者、订阅者 $subscribers = $wpdb->get_col("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'wp_user_level' AND meta_value >= 0 ORDER BY user_id"); //历遍显示输出所有相关用户的显示名称 foreach($administrators as $administrator){ echo get_the_author_meta('display_name', $administrator).' '; } ?>
以上示例中只输出权限最高的管理员用户,大家都自己发挥吧!注释都写明了相关的权限和角色。