在本站之前发布的文章中,介绍过不用插件定制修改 WordPress 角色的权限的方法。如果想针对某种特定的业务需求新建一个角色,而不是修改默认角色的权限,最优的方案是:用 WordPress 的 add_role 方法添加角色,并且在添加时直接继承某个现有角色的权限,然后再根据具体需求去微调(添加或删减权限)。
为什么要“继承”而不是“从零创建”?
WordPress 的一个基本角色(比如 editor 编辑)底层往往包含了数十个甚至上百个非常细碎的权限(如 read, edit_posts, upload_files, edit_others_pages 等等)。如果你从零开始去赋权,极其容易漏掉一些基础权限,导致新角色连上传图片或者查看待审文章都会报错。
因此,“基于一个最接近的现有角色进行克隆”,是最稳妥的开发姿势。
实战场景:创建一个专属的“电商发货员/合伙人”角色
假设我们正在运维一个 WooCommerce 商城系统。我们需要给仓库的“发货员”或者外部的“代发货合伙人(Partner)”开通一个后台账号。他们的工作范围很明确:只能看订单、处理商品,但绝对不能修改网站的页面、不能写博客文章、更不能装插件。
由于他们需要处理 WooCommerce 订单,这实际上是一个偏高级的操作权限。我们可以以商店管理员(shop_manager)为基础进行克隆,然后把他们不需要的博客文章和页面权限全部“阉割”掉:
function wpzhiku_add_partner_role() {
// 1. 获取基础角色的对象,这里以 shop_manager 为例(如果是普通博客,可以填 editor)
$shop_manager = get_role( 'shop_manager' );
// 如果该基础角色不存在(比如没装 WooCommerce),则中止执行
if ( ! $shop_manager ) {
return;
}
// 2. 提取基础角色身上的所有权限数组
$capabilities = $shop_manager->capabilities;
// 3. 注册新角色,直接赋予提取出来的能力数组
// add_role( $role_slug, $display_name, $capabilities )
add_role( 'partner', __('代发货合伙人', 'textdomain'), $capabilities );
// 4. 获取刚刚注册好的新角色对象,开始进行“外科手术”微调
$partner = get_role('partner');
// 移除新角色不应该拥有的权限(做减法)
$partner->remove_cap( 'edit_comment' ); // 不能管理评论
$partner->remove_cap( 'edit_users' ); // 不能管理其他用户
$partner->remove_cap( 'edit_pages' ); // 不能修改页面
$partner->remove_cap( 'edit_others_pages' );
$partner->remove_cap( 'edit_posts' ); // 不能写文章
$partner->remove_cap( 'manage_categories' ); // 不能管文章分类
$partner->remove_cap( 'export' ); // 不能导出网站数据
}
/**
* ⚠ 注意:角色的增删是写进数据库的,不需要每次加载页面都执行。
* 建议在只执行一次(比如访问一下后台页面)之后,就将这行钩子代码注释掉,或者挂载到主题/插件激活钩子上。
*/
add_action( 'admin_init', 'wpzhiku_add_partner_role' );把代码放入主题的 functions.php 或者您的子插件中,触发执行一次后。您在后台新建用户时,就会发现多了一个“代发货合伙人”的选项。分配此角色后,该用户登录后台将拥有极为清爽和受限的菜单视图。


