问题描述
我已经为客户设置了一个 WordPress 站点。客户端具有编辑器角色,但是我已经安装了 Members plugin,并给予客户端添加新用户到 WP 管理员的功能。这是正常工作。
我的问题是,我希望客户能够创建新用户,与贡献者,订阅者,编辑者和作者,而不是管理员的角色一样。客户端创建的新用户不应具有管理员角色。有可能以某种方式隐藏此选项吗?
谢谢 Vayu
最佳解决方案
其实很简单您需要过滤到 map_meta_caps 并停止编辑器创建/编辑管理员,并从’editable roles’ 数组中删除管理员角色。这个类,作为一个插件或在你的主题的 functions.php 文件中会做到这一点:
class JPB_User_Caps {
// Add our filters
function JPB_User_Caps(){
add_filter( 'editable_roles', array(&$this, 'editable_roles'));
add_filter( 'map_meta_cap', array(&$this, 'map_meta_cap'),10,4);
}
// Remove 'Administrator' from the list of roles if the current user is not an admin
function editable_roles( $roles ){
if( isset( $roles['administrator'] ) && !current_user_can('administrator') ){
unset( $roles['administrator']);
}
return $roles;
}
// If someone is trying to edit or delete and admin and that user isn't an admin, don't allow it
function map_meta_cap( $caps, $cap, $user_id, $args ){
switch( $cap ){
case 'edit_user':
case 'remove_user':
case 'promote_user':
if( isset($args[0]) && $args[0] == $user_id )
break;
elseif( !isset($args[0]) )
$caps[] = 'do_not_allow';
$other = new WP_User( absint($args[0]) );
if( $other->has_cap( 'administrator' ) ){
if(!current_user_can('administrator')){
$caps[] = 'do_not_allow';
}
}
break;
case 'delete_user':
case 'delete_users':
if( !isset($args[0]) )
break;
$other = new WP_User( absint($args[0]) );
if( $other->has_cap( 'administrator' ) ){
if(!current_user_can('administrator')){
$caps[] = 'do_not_allow';
}
}
break;
default:
break;
}
return $caps;
}
}
$jpb_user_caps = new JPB_User_Caps();
EDIT
好的,所以我看看为什么让用户删除通过。看起来 delete_user 处理与 edit_user 略有不同; 我修改了 map_meta_cap 方法来解决这个问题。我已经在 3.0.3 上测试过,这样可以防止任何人,但管理员实际上删除,编辑或创建管理员。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。