当前位置:首页WP教程WordPress用户权限层级管理:限制只能管理低级别的用户

WordPress用户权限层级管理:限制只能管理低级别的用户

上一篇文章详细介绍了WordPress默认用户角色权限,以及如何新增用户角色、添加权限等,参考WordPress用户角色权限详解在实际开发中,很少需要对默认权限…

上一篇文章详细介绍了WordPress默认用户角色权限,以及如何新增用户角色、添加权限等,参考WordPress用户角色权限详解

在实际开发中,很少需要对默认权限进行修改,通常是添加若干个角色,然后对这些角色赋于不同的权限。

以我之前开发的实体店铺会员系统为例,一共新增了三个角色:经理、主管、店员。其中,经理可以添加、编辑主管和店员,主管只能添加、编辑店员。

首先给经理赋于用户管理的权限:

$wp_roles->add_cap(\'manager\', array(\'list_users\' => true,\'create_users\' => true,\'delete_users\' => true,\'edit_users\' => true,\'remove_users\' => true,));

注意:主管不需要remove_users权限,因为主管下面只有一个店员角色了,并且主管也没有将店员提升为主管的权限。

此时,经理不仅可以管理所有用户,也能修改删除所有用户,这是不符合要求的,因为经理上面还有管理员administrator。

通过Hook users_list_table_query_args可以对不同级别角色进行过滤:

function bzg_editable_roles($roles) {global $current_user;$role = $current_user->roles;$role = $role[0];switch($role) {case \'administrator\' :unset($roles[\'administrator\']);break;case \'manager\' :unset($roles[\'administrator\']);unset($roles[\'manager\']);break;case \'charge\' :unset($roles[\'administrator\']);unset($roles[\'manager\']);unset($roles[\'charge\']);break;default:$roles = null;}return $roles;}add_filter(\'editable_roles\', \'bzg_editable_roles\', 10, 1);

此时,在修改角色选项中,经理只能看到主管和店员,接下来过滤用户列表中的显示:

function bzg_users_list_table_query_args($args) {global $current_user;$role = $current_user->roles;$role = $role[0];switch($role) {case \'administrator\' :$roles = [\'administrator\', \'manager\', \'charge\', \'sales\'];break;case \'manager\' :$roles = [\'charge\', \'sales\'];break;case \'charge\' :$roles = [\'sales\'];break;default:$roles = [\'sales\'];}$args[\'role__in\'] = $roles;return $args;}add_filter(\'users_list_table_query_args\', \'bzg_users_list_table_query_args\', 10, 1);

在主管的用户列表中,不再出现经理,但是在顶部的用户导航中仍然显示了管理员和经理的数量,可以使用以下代码过滤:

function bzg_views_users($views) {global $current_user;$role = $current_user->roles;$role = $role[0];switch($role) {case \'administrator\' :break;case \'manager\' :unset($views[\'administrator\']);unset($views[\'manager\']);unset($views[\'all\']);break;case \'charge\' :unset($views[\'administrator\']);unset($views[\'manager\']);unset($views[\'charge\']);unset($views[\'sales\']);unset($views[\'all\']);break;default:}return $views;}add_filter(\'views_users\', \'bzg_views_users\', 10, 1);

还没完,为了防止用户直接给用户编辑和删除页面传递用户ID参数跳过之前的限制,还需要控制一下权限:

function bzg_user_has_cap($allcaps, $caps, $args) {global $current_user;$user_id = 0;if(isset($args[2])) {$user_id = (int) $args[2];} elseif(isset($_REQUEST[\'user_id\'])) {$user_id = (int) $_REQUEST[\'user_id\'];} elseif(isset($_REQUEST[\'user\'])) {$user_id = (int) $_REQUEST[\'user\'];}if(!$user_id) return $allcaps;if(in_array($args[0], array(\'edit_user\', \'delete_users\', \'delete_user\', \'list_users\'))) {$user_role = get_user_meta($user_id, \'wp_capabilities\', true);if(!$user_role)  return $allcaps;$user_role = key($user_role);$role = $current_user->roles;$role = $role[0];if(!bzg_role_comparing($role, $user_role)) {return false;}}return $allcaps;}add_filter(\'user_has_cap\', \'bzg_user_has_cap\',10, 3);

这里使用了一个自定义函数来比较用户权限大小:

function bzg_role_comparing($a, $b) {$roles = array(\'administrator\' => 10,\'manager\' => 5,\'charge\' => 3,\'sales\' => 1,);return $roles[$a] > $roles[$b];}

好了,你可以灵活运用以上Hook来实现不同需求。

温馨提示:

文章标题:WordPress用户权限层级管理:限制只能管理低级别的用户

文章链接:https://www.jitheme.com/2550.html

更新时间:2024年03月28日

1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:service@jitheme.com,我们将第一时间处理!

2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。

3.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读极(子)主题网络服务协议

给TA打赏
共{{data.count}}人
人已打赏
WP教程

WordPress支持CDN的文章阅读计数

2023-3-8 22:11:08

WP教程

WordPress用户角色权限详解

2023-3-8 22:11:11

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
购物车
优惠劵
有新私信 私信列表
搜索
  • 无言发布问答图片里这标题哪里改? 等您回答!
  • 沐颜小栈-MUOOY.CN发布问答文章评论框上移错位,下个版本几个优化一下 等您回答!
  • 沐颜小栈-MUOOY.CN对文章测试子主题灯箱幻灯片效果发布评论!
  • 沐颜小栈-MUOOY.CN发布问答老胡,可不可以在子主题里面把下载页面搞一下 等您回答!
  • 极主题1380参与回答 测试回答问题!!!!非常感谢!
  • Cik参与回答 安装一个插件,晨风自定义非常感谢!
  • 百度🔍达人圈参与回答 可以复制啊 开启防盗非常感谢!
  • YESICAN参与回答 好的好的谢谢啦非常感谢!
  • Cik参与回答 用插件非常感谢!
  • 偷喝可乐发布问答这个菜单样式怎么是在哪里设置的 等您回答!
  • 小蔡发布问答下载列表里面的投诉举报 和版权声明 等您回答!
  • 老胡发布圈子测试图片发布
  • 旅途点赞了文章把帮助改成文库?超级牛B!