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


9

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

有什么办法可以为用户分配多个角色?或者,具有多个功能组,并将一个或多个组与用户相关联?我的网站的工作方式有很多明显的职责:更新网页,主持论坛,更新事件日历等。每个职责都有一组功能,这些功能是执行与其相关联的任务所必需的。我想使用户能够执行一项或多项职责。因此,用户A可以更新网页和事件日历,但不主持论坛(不够灵活),但是用户B可以主持论坛,更新事件日历,但不允许在网页附近。

缺少为每种可能的职责组合定义角色的方法,有没有办法做到这一点?


角色选取器插件可能能够完成你在找什么。
德文·洪伯特,

我认为这更多是基于每页或每篇文章,这并不是我真正想要的,但是我会做更多调查,谢谢。
lpryor 2011年

@lpryor-Role Scoper有多个选项,您可以控制用户或组的每页和每条帖子,还可以控制每个类别,每个分类法和每个帖子类型,因此看来您可以实现自己的目标追赶这个。
米洛(Milo)

试试这个gist.github.com/nikolov-tmw/7808046将多个复选框添加到“角色选择”中
OzzyCzech 2014年

Answers:


3

由于底层的WP_User类支持多个角色,长期以来缺乏多重角色使我很恼火。我什至考虑过寻找替代软件解决方案。@lpryor-阅读您的帖子后,我有动力自己去实现它。

尽管我不得不破解users.php文件,但我花了很短的时间才能完成代码,因为我懒得创建一个单独的插件来替我做。显然,这是错误的方法,因此,如果我将来有足够的动力,我可能会尝试正确地做。

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

(我使用的是3.2,因此您的行号可能会有所不同)在第150行之前的class-wp-users-list-table.php中添加以下内容:

<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_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();

}

现在在users.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_role替换为add_role

$user->add_role($_REQUEST['new_role']);

在第92行,添加以下内容(这只是升级操作中的一个经过轻松编辑的复制和粘贴-我没有检查确保boost_user功能适合删除角色)

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;

看起来不错,@ adi-eyal,非常感谢!我将逐步解决并尝试一下。
lpryor 2011年

@lpryor嘿,只是想知道您是否在不黑客WP核心代码的情况下成功实现了多个角色?很高兴知道!我找不到任何插件,但同时也不想破解核心WP代码。谢谢!
dashaluna 2011年

@dashaluna我还未能做到这一点,但它已经接近我的清单的顶部!
lpryor 2011年

5
像这样的黑客核心并不是要走的路。这将在任何 WordPress核心更新删除。挂上它或忘记它-对不起,但这(即使它可行)也没有什么值得推荐的。
kaiser

更新内核不是一个好习惯。请改用动作/过滤器挂钩。
苏菲

3

用户角色编辑器插件可为用户处理多个角色。

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


0

我将Members插件与自定义创建的功能一起使用。

您不能将多个角色分配给一个人,但是可以创建任何角色并指定该角色具有的功能。

在临时模板中,您可以使用current_user_can()之类的东西。


是的,我意识到这一点。但是我想知道是否有必要不必为每种可能的职责组合定义一个单独的角色。组合程序可能会使它变得不那么有趣,并且容易出错。
lpryor 2011年

我没有发现很多谷歌搜索。我最接近的是该线程:wordpress.org/support/topic/multiple-roles-for-a-user
史蒂文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.