角色和权限是 WordPress 的两个重要方面,允许你控制用户特权。
WordPress 将角色及其权限存储在 options 表的 user_roles 键下。
角色
角色为用户定义了一组权限。例如,用户可以在其仪表板中看到什么以及做什么。
默认情况下,WordPress 拥有六个角色:
- 超级管理员 (Super Admin)
- 管理员 (Administrator)
- 编辑 (Editor)
- 作者 (Author)
- 贡献者 (Contributor)
- 订阅者 (Subscriber)
可以添加更多角色并移除默认角色。

添加角色
使用 add_role() 添加新角色并为其分配权限。
function wporg_simple_role() {
add_role(
'simple_role',
'Simple Role',
array(
'read' => true,
'edit_posts' => true,
'upload_files' => true,
),
);
}
// 添加 simple_role。
add_action( 'init', 'wporg_simple_role' );首次调用 add_role() 后,角色及其权限将存储在数据库中!
连续调用不会执行任何操作:包括修改权限列表,这可能与您的预期行为不符。
若要批量修改权限列表:使用 remove_role() 移除角色,然后使用 add_role() 并指定新权限再次添加该角色。
请确保仅在权限与您预期的不同(即条件满足)时执行此操作,否则性能将严重下降!
移除角色
使用 remove_role() 移除角色。
function wporg_simple_role_remove() {
remove_role( 'simple_role' );
}
// 移除 simple_role。
add_action( 'init', 'wporg_simple_role_remove' );首次调用 remove_role() 后,角色及其权限将从数据库中移除!
连续调用不会执行任何操作。
如果您要移除默认角色:
- 我们不建议移除管理员和超级管理员角色!
- 请确保在插件/主题中保留代码,因为未来的 WordPress 更新可能会再次添加这些角色。
- 运行
update_option('default_role', YOUR_NEW_DEFAULT_ROLE)
因为您将删除subscriber,这是 WP 的默认角色。
权限
权限定义了角色可以做什么以及不能做什么:编辑帖子、发布帖子等。
自定义文章类型可能需要特定的一组权限。
添加权限
您可以为角色定义新权限。
使用 get_role() 获取角色对象,然后使用该对象的 add_cap() 方法添加新权限。
function wporg_simple_role_caps() {
// 获取 simple_role 角色对象。
$role = get_role( 'simple_role' );
// 添加新权限。
$role->add_cap( 'edit_others_posts', true );
}
// 添加 simple_role 权限,优先级必须在初始角色定义之后。
add_action( 'init', 'wporg_simple_role_caps', 11 );可以向任何角色添加自定义权限。
在默认的 WordPress 管理后台中,它们将不起作用,但可用于自定义管理屏幕和前端区域。
移除权限
您可以从角色中移除权限。
实现方式与添加权限类似,不同之处在于使用 remove_cap() 方法作用于角色对象。
使用角色和权限
获取角色
使用 get_role() 获取包含所有权限的角色对象。
get_role( $role );用户可执行
使用 user_can() 检查用户是否具有指定的角色或权限。
user_can( $user, $capability );有一个未记录的第三个参数 $args,可以包含应对其进行测试的对象。
例如:传递帖子 ID 以测试该特定帖子的权限。
当前用户可执行
current_user_can() 是 user_can() 的包装函数,使用当前用户对象作为 $user 参数。
在需要特定级别权限才能访问和/或修改的后端和前端区域场景中使用时。
current_user_can( $capability );示例
这是一个在实际模板文件中添加编辑链接的实用示例,前提是用户具有适当的权限:
if ( current_user_can( 'edit_posts' ) ) {
edit_post_link( esc_html__( 'Edit', 'wporg' ), '<p>', '</p>' );
}多站点
current_user_can_for_blog() 函数用于测试当前用户在特定博客上是否具有特定的角色或权限。
current_user_can_for_blog( $blog_id, $capability );参考
用户角色和权限 的 Codex 参考。