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


9

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

Чи є спосіб призначити кілька ролей користувачам? Крім того, маючи ряд груп можливостей і пов’язуючи одну або кілька груп з користувачем? У тому, як працює мій сайт, існує ряд очевидних обов'язків: оновлення веб-сторінок, модерація форумів, оновлення календаря подій тощо. Кожна відповідальність має групу можливостей, необхідних для виконання завдань, пов’язаних з нею. Я б хотів дозволити користувачеві виконувати одну або кілька обов'язків. Таким чином, користувач A міг оновлювати веб-сторінки та календар подій, але не модерував форуми (не майже достатньо тактично), але користувач B міг модерувати форуми, оновлювати календар подій, але це заборонено поблизу веб-сторінок.

Окрім визначення ролі для кожної можливої ​​комбінації обов'язків, чи є це можливим?


Модуль Role Scoper може виконати те, що ви шукаєте.
Девін Хамберт

Я думаю, що це більше на сторінці або на пошті, що насправді не те, що я шукаю, але я ще трохи вивчу, спасибі.
lpryor

@lpryor - Роль 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

@dashaluna Мені ще не вдалося дійти до цього, але це вже близько до мого списку!
lpryor

5
Як таке хакерське ядро, це не шлях. Це буде видалено при будь-якому оновленні ядра WordPress. Підключіть його або забудьте - звичайно, але це (навіть якщо це працює) нічого, що не слід рекомендувати.
кайзер

Оновлення ядра не є хорошою практикою. Замість цього використовуйте гачки дії / фільтра.
тнє Суфі

3

Плагін редактора ролей користувача обробляє кілька ролей для користувача.

Після встановлення "Користувачі>" під кожним користувачем є опція "Можливості". URE трактує першу роль WP як "первинну роль" і дозволяє додавати "інші ролі".


0

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

Ви не можете призначити кілька ролей одній людині, але ви можете створити будь-які ролі та вказати, які можливості цієї ролі мають.

У шаблонах ви можете використовувати щось на зразок current_user_can () .


Так, я це розумію. Але мені було цікаво, чи існує якийсь спосіб не визначати окрему роль для кожного можливого поєднання обов'язків. Комбінаторика може зробити це не дуже веселим і схильним до помилок.
lpryor

Я не знайшов багато гугла. Найближча мені ця тема була: wordpress.org/support/topic/multiple-roles-for-a-user .
Стівен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.