仅允许admin以下的角色添加订阅者

时间:2012-02-11 作者:Tomas Buteler

我想为一组用户类型(编辑器+自定义角色)提供添加用户/创建用户功能。唯一需要注意的是,我想将该功能限制为仅添加“订阅者”类型的用户,除此之外没有其他功能。有没有办法做到这一点?

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

实现这一目标的第一步是将功能添加到create_users 指定角色。你这么做是在打电话get_role, 然后使用add_cap 方法这只需要做一次。这里有一个插件激活的例子。

<?php
register_activation_hook( __FILE__, \'wpse42003_activation\' );
function wpse42003_activation()
{
    foreach( array( \'editor\', \'your_custome_role\' ) as $r )
    {
        $role = get_role( $r );
        if( $role )
            $role->add_cap( \'create_users\' );
    }
}
如果这样做,可能需要确保在插件停用时使用remove_cap.

<?php
register_deactivation_hook( __FILE__, \'wpse42003_deactivation\' );
function wpse42003_deactivation()
{
    foreach( array( \'editor\', \'your_custome_role\' ) as $r )
    {
        $role = get_role( $r );
        if( $role )
            $role->remove_cap( \'create_users\' );
    }
}
现在的问题是确保这些用户只能注册订阅者。在user-new.php 第页,角色下拉列表由一个名为wp_dropdown_roles, 然后调用函数get_editable_roles 获取当前用户可以编辑/创建的角色。

幸运的是,这里有一个过滤器,允许我们修改这个位。首先,我们将复制所有$roles 数组键,然后循环并取消设置订阅服务器以外的任何角色$roles -- 仅当当前用户具有角色编辑器或自定义角色时。

<?php
add_filter( \'editable_roles\', \'wpse42003_filter_roles\' );
function wpse42003_filter_roles( $roles )
{
    $user = wp_get_current_user();
    if( in_array( \'editor\', $user->roles ) || in_array( \'your_custom_role\', $user->roles ) )
    {
        $tmp = array_keys( $roles );
        foreach( $tmp as $r )
        {
            if( \'subscriber\' == $r ) continue;
            unset( $roles[$r] );
        }
    }
    return $roles;
}
这其中的好处是get_editable_roles 在添加或更新用户之前调用—编辑器将无法通过在JS或类似的表单中插入额外选项来添加用户。

note: change your_custom_role in the examples above to your role\'s name.

所有这些as a plugin.

SO网友:rkeet

“chrisguitarguy”的答案很好。我对代码做了一个小的修改,让开发局在多站点安装中为客户提供服务。我们需要创建“客户”用户角色,但当然不应允许客户向其域中添加其他客户。根据公认的答案进行修改,我得出以下结论:

/**
 * Add filter to ensure a Customer type can NOT create another Customer user
 */
add_filter( \'editable_roles\', \'limit_create_user\' );
function limit_create_user( $roles ){
    $user = wp_get_current_user();
    if( in_array( \'customer\', $user->roles )){
        unset( $roles[ \'customer\' ]);
    }
    return $roles;
}
希望将来有人能用上它。这在WP3中进行了测试和应用。9.1。

结束

相关推荐