功能组:拥有多个角色的用户?

时间:2011-08-26 作者:lpryor

我很确定我了解WordPress中的角色和功能设置:粒度功能,组合在可以分配给用户的角色中。代码应该检查粒度功能,而不是角色(因为特定角色的功能可以更改)。角色不一定是分层的(尽管默认角色是)。

有没有办法为用户分配多个角色?或者,拥有多组功能,并将一个或多个组与用户关联?我的网站的工作方式有很多明显的职责:更新网页、调节论坛、更新活动日历等等。每个职责都有一组执行与其相关的任务所需的能力。我想让用户能够履行一项或多项职责。因此,用户A可以更新网页和活动日历,但不能调节论坛(不够得体),但用户B可以调节论坛,更新活动日历,但不允许靠近网页。

除了为每个可能的职责组合定义一个角色之外,还有什么方法可以做到这一点吗?

3 个回复
最合适的回答,由SO网友:Adi Eyal 整理而成

由于底层WP\\u用户类支持多个角色,长期以来,缺少多个角色一直困扰着我。我甚至考虑过寻找另一种软件解决方案@lpryor——读了你的帖子后,我又有了实现它的动力。

虽然我不得不对用户进行黑客攻击,但却花费了惊人的短行数。php文件,因为我太懒了,无法创建单独的插件来为我完成它。很明显,这样做是错误的,如果我将来有足够的动力,我可能会尝试正确地去做。

如果您不想升级到Wordpress的最新版本(您应该升级),那么可以使用下面的代码片段实现多个角色。请记住,我不是wordpress专家。我只是打开了相关文件并进行了更改,而没有试图理解我所做的一切的全部含义。这个准则对我来说似乎是合理的,但我一生都不会相信它。

(我使用的是3.2,所以您的行号可能会有所不同)在类别wp用户列表中。PHP在第150行之前添加如下内容:

<div class="alignleft actions">
    <label class="screen-reader-text" for="remove_role"><?php _e( \'Remove role &hellip;\' ) ?></label>
    <select name="remove_role" id="remove_role">
        <option value=\'\'><?php _e( \'Remove role &hellip;\' ) ?></option>
        <?php wp_dropdown_roles(); ?>
    </select>
    <?php submit_button( __( \'Remove\' ), \'secondary\', \'changeit\', false ); ?>
</div>
然后将current\\u account函数更改为如下所示

function current_action() {
    if ( isset($_REQUEST[\'changeit\']) ) {
        if ( !empty($_REQUEST[\'new_role\']) )
            return \'promote\';
        elseif ( !empty($_REQUEST[\'remove_role\']) )
            return \'remove_role\';
    }

    return parent::current_action();
}

现在在用户中。PHP注释输出线71-76

/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST[\'new_role\']]->has_cap(\'promote_users\') ) {
    $update = \'err_admin_role\';
    continue;
}
*/
将第83行中的set\\u角色替换为add\\u角色

$user->add_role($_REQUEST[\'new_role\']);
在第92行添加以下内容(这只是升级操作中经过轻微编辑的复制和粘贴-我没有检查以确保promote\\u用户功能适合删除角色)

case \'remove_role\':
    check_admin_referer(\'bulk-users\');

    if ( ! current_user_can( \'promote_users\' ) )
            wp_die( __( \'You can&#8217;t edit that user.\' ) );

    if ( empty($_REQUEST[\'users\']) ) {
            wp_redirect($redirect);
            exit();
    }

    $editable_roles = get_editable_roles();
    if ( empty( $editable_roles[$_REQUEST[\'remove_role\']] ) )
            wp_die(__(\'You can&#8217;t remove that role\'));

    $userids = $_REQUEST[\'users\'];
    $update = \'remove_role\';
    foreach ( $userids as $id ) {
            $id = (int) $id;

            if ( ! current_user_can(\'promote_user\', $id) )
                    wp_die(__(\'You can&#8217;t edit that user.\'));
            // The new role of the current user must also have promote_users caps
            // Need to think this through
            /*
            if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST[\'new_role\']]->has_cap(\'promote_users\') ) {
                    $update = \'err_admin_role\';
                    continue;
            }
            */

            // If the user doesn\'t already belong to the blog, bail.
            if ( is_multisite() && !is_user_member_of_blog( $id ) )
                    wp_die(__(\'Cheatin&#8217; uh?\'));

            $user = new WP_User($id);
            $user->remove_role($_REQUEST[\'remove_role\']);
    }

    wp_redirect(add_query_arg(\'update\', $update, $redirect));
    exit();
在第370行添加以下内容

case \'remove_role\':
    $messages[] = \'<div id="message" class="updated"><p>\' . __(\'Removed role.\') . \'</p></div>\';
    break;

SO网友:garec

User Role Editor plugin 为用户处理多个角色。

安装后,用户>在每个用户的“是功能”选项下。URE将第一个WP角色视为“主要角色”,并允许您添加“其他角色”。

SO网友:Steven

我使用Members plugin 以及自定义创建的功能。

您不能为一个人分配多个角色,但可以创建任何角色并指定该角色具有哪些功能。

在tempaltes中,可以使用current_user_can().

结束

相关推荐

query users by role

我有一个查询用户和usermeta的自定义插件,但我现在需要从结果中筛选管理员。我的sql查询的一个非常简化的版本是:SELECT * FROM usermeta LEFT JOIN users ON users.ID = user_id WHERE meta_key = \'last_name\' AND user_role != \'admin\' ORDER BY meta_value ASC LIMIT 0, 25 user_role 不是字段,我看