角色和权限是 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 参考。