如何过滤角色选择器?

时间:2011-11-02 作者:Zach

我知道WordPress中的角色没有层次结构,但我想知道是否有任何类型的功能可以“将用户分配到角色”。我所能看到的就是是否能够添加用户。

这里真正重要的是,我使用贾斯汀·塔洛克的成员插件创建了一个新角色,称为“客户端”,它删除了所有他们不需要看到或无法控制的东西,这很好<但是,如果我给他们创建新用户的能力,他们也可以选择我的“超级管理员”角色,它可以查看所有内容。因此,在某种程度上,他们有点欺骗了系统。

是否有任何方法可以“隐藏”某个角色,使其不显示在用户可以设置新用户/编辑用户的内容中?或者,是否可能根据角色从添加/编辑用户屏幕中删除角色标识符<我知道这听起来有点偏离WordPress对用户权限的要求,但从管理的角度来看,这听起来很有用——至少在我的脑海中是这样的;)

谢谢

2 个回复
最合适的回答,由SO网友:kaiser 整理而成

UI选择元素打开user-edit.php, 您可以在UI中看到下拉列表。下拉列表<select> 包装是硬编码的。

然后,管理界面根据内联注释做了一件漂亮的事情:// Get the highest/primary role for this user. 事实上,它是获得分配给用户的第一个角色(我们必须记住这一点)。

那么基本上只有一个电话wp_dropdown_roles(). 此函数除了遍历可用角色并将其包装在其中之外,不做任何其他事情<option> 元素。But, 它做了一件很酷的事:它使用get_editable_roles(). 魔法来了!过滤器,用于global $wp_roles->roles. 默认情况下,这将返回所有角色,但您可以跳入并简单地取消设置您想要的任何角色。

// Add this as mu-plugin
function wpse32738_get_editable_roles( $editable_roles )
{
    if ( current_user_can( \'client\' ) )
        // unset whatever you need here.

    return $editable_roles;
}
add_filter( \'editable_roles\', \'wpse32738_get_editable_roles\' );
角色是一个“扁平”系统。一个角色可以具有可以否决其他功能的功能

SO网友:Louis-Rémi

我按照Kaiser的指示编写了以下代码,允许我向特定角色授予用户管理功能,并防止权限升级到任何内置角色(如果定义自定义中介角色,则应调整我的代码)。

// add user-management capabilities
add_action(\'admin_init\', function() {
  $role = get_role( \'editor\' );

  $role->add_cap( \'list_users\' );
  $role->add_cap( \'create_users\' );
  $role->add_cap( \'edit_users\' );
  $role->add_cap( \'delete_users\' );
});

// prevent privilege escalation
add_filter( \'editable_roles\', function( $editable_roles ) {
  if ( ! current_user_can( \'promote_users\' ) ) {
    // always remove admin roles
    if ( isset($editable_roles[\'super_admin\']) ) {
      unset( $editable_roles[\'super_admin\'] );
    }
    unset( $editable_roles[\'administrator\'] );

    // remove other roles conditionnaly to prevent escalation
    if ( ! current_user_can( \'editor\' ) ) {
      unset( $editable_roles[\'editor\'] );

      if ( ! current_user_can( \'author\' ) ) {
        unset( $editable_roles[\'author\'] );

        if ( ! current_user_can( \'contributor\' ) ) {
          unset( $editable_roles[\'contributor\'] );
        }
      }
    }
  }

  return $editable_roles;
});
使用此代码,可以向参与者授予用户管理功能,并且他/她应该只能创建其他参与者或订阅者。

BEWARE: 这是一个黑客解决方案,尚未在网络模式下进行测试,也未对输入进行验证:恶意用户仍可能升级权限!

结束

相关推荐

Recommended File Permissions

嘿,伙计们,我花了很长时间试图解决这个问题。我想知道WordPress中的文件权限应该是什么样子in order to use the autoupdate feature. 到目前为止,我的wordpress安装程序一直在询问我的FTP信息,我不想使用那种升级/安装方法,我想使用纯/直接PHP。某些上下文:Web服务器和php fcgi守护程序运行为www-data:www-data</wordpress安装位于/home/blaenk/sites/domain.tld/</首先,我read