Группы возможностей: пользователи с несколькими ролями?

9

Я почти уверен, что понимаю настройки ролей и возможностей в WordPress: детализированные возможности, сгруппированные в роли, которые можно назначать пользователям. Код должен проверять гранулярные возможности, а не роли (поскольку возможности для определенных ролей могут изменяться). Роли не обязательно являются иерархическими (хотя роли по умолчанию).

Есть ли способ назначить несколько ролей пользователям? В качестве альтернативы, имея несколько групп возможностей и связывая одну или несколько групп с пользователем? Как работает мой сайт, существует ряд очевидных обязанностей: обновлять веб-страницы, модерировать форумы, обновлять календарь событий и так далее. Каждая ответственность имеет группу возможностей, которые необходимы для выполнения связанных с ней задач. Я бы хотел, чтобы пользователь мог выполнять одну или несколько обязанностей. Таким образом, пользователь A может обновлять веб-страницы и календарь событий, но не модерировать форумы (не достаточно тактично), но пользователь B может модерировать форумы, обновлять календарь событий, но не допускается рядом с веб-страницами.

Если не считать определение роли для каждой возможной комбинации обязанностей, есть ли способ сделать это?

lpryor
источник
Роль Scoper плагин может быть в состоянии сделать то , что вы ищете.
Девин Гумберт
Я думаю, что это больше для каждой страницы или для каждого поста, что не совсем то, что я ищу, но я буду исследовать немного больше, спасибо.
lpryor
@lpryor - Role Scoper имеет несколько опций, вы можете управлять для каждой страницы или для поста для пользователей или групп, а также для каждой категории, для каждой таксономии и для каждого типа, так что может показаться, что вы можете достичь того, что вам нужно с этим.
Майло
Попробуйте это gist.github.com/nikolov-tmw/7808046 Добавить несколько флажков для выбора ролей
OzzyCzech

Ответы:

3

Отсутствие множественных ролей раздражало меня долгое время, так как базовый класс WP_User поддерживает несколько ролей. Я даже подумывал о поиске альтернативного программного решения. @lpryor - после прочтения вашего поста у меня появилась мотивация реализовать его самостоятельно.

Это заняло удивительно короткое количество строк, хотя мне пришлось взломать файл users.php, так как я был слишком ленив, чтобы создать отдельный плагин, чтобы сделать это для меня. Очевидно, что это неправильный способ сделать это, поэтому, если я буду достаточно мотивирован в будущем, я могу попытаться сделать это правильно.

Если вас не волнует возможность обновления до последней версии Wordpress (что вам и нужно) - вы можете реализовать несколько ролей с помощью фрагментов кода ниже. Пожалуйста, имейте в виду, что я не эксперт по WordPress. Я просто открыл соответствующие файлы и внес изменения, не пытаясь понять все последствия того, что я делал. Код кажется мне разумным, но я бы не стал доверять ему свою жизнь.

(Я использую 3.2, поэтому ваши номера строк могут отличаться). В class-wp-users-list-table.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_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;
}
*/

Замените set_role в строке 83 на add_role

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

В строке 92 добавьте следующее (Это просто слегка отредактированное копирование и вставка из действия по продвижению - я не проверил, чтобы возможность promo_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
@lpryor Эй, просто интересно, удалось ли вам реализовать несколько ролей, не взломав основной код WP? Было бы здорово узнать! Я не смог найти никаких плагинов, но в то же время не хочу взламывать основной код WP. Спасибо!
Дашалуна
@dashaluna Я еще не смог добраться до этого, но он находится на вершине моего списка!
lpryor
5
Взломать ядро, как это не путь. Это будет удалено при любом обновлении ядра WordPress. Крюк или забывай - извините, но это (даже если это работает) ничего, что следует рекомендовать.
Кайзер
Обновление ядра не является хорошей практикой. Вместо этого используйте ловушки action / filter.
тн Суфи
3

Плагин User Role Editor обрабатывает несколько ролей для пользователя.

После установки «Пользователи» под каждым пользователем выбирается «Возможности». URE рассматривает первую роль WP как «основную роль» и позволяет добавлять «другие роли».

garec
источник
0

Я использую плагин Members вместе с пользовательскими возможностями.

Вы не можете назначить несколько ролей одному человеку, но вы можете создать любые роли и указать, какие функции имеет эта роль.

В шаблонах вы можете использовать что-то вроде current_user_can () .

Стивен
источник
Да, я понимаю это. Но мне было интересно, есть ли способ не определять отдельную роль для каждой возможной комбинации обязанностей. Комбинаторика может сделать его не очень веселым и подверженным ошибкам.
lpryor
Я не нашел много Google. Самым близким, что я получил, была эта тема: wordpress.org/support/topic/multiple-roles-for-a-user .
Стивен