Получение списка доступных ролей на сайте WordPress

11 сент. 2010 г., 22:38:22
Просмотры: 58.4K
Голосов: 50

При разработке плагинов WordPress часто возникает необходимость настройки опций, определяющих, какие роли на сайте имеют доступ к определенным функциям или контенту. Для этого разработчику плагина нужно получить список ролей, существующих на сайте, чтобы использовать их в настройках. Поскольку могут быть созданы пользовательские роли, мы не можем предполагать, что доступны только роли по умолчанию.

Какой самый лучший способ получить такой список?

2
Комментарии

Примечание: Этот вопрос был изначально задан Райаном Байлски в рассылке wp-hackers и был ответен мной. Я добавил его сюда, потому что это отличный пример вопроса о лучших практиках, который люди могут задавать в Google :)

jerclarke jerclarke
11 сент. 2010 г. 22:42:34

Эй @Jeremy Clarke - Очень рад видеть твое участие здесь, и именно такие вещи мы ищем на этом ресурсе; ответы, связанные с распространенными вопросами, которые также раскрывают лучшие практики. Респект!

MikeSchinkel MikeSchinkel
12 сент. 2010 г. 02:07:02
Все ответы на вопрос 6
3
63

Роли хранятся в глобальной переменной $wp_roles.

Идеальная функция — это get_editable_roles() из /wp-admin/includes/user.php

function get_editable_roles() {
    global $wp_roles;

    $all_roles = $wp_roles->roles;
    $editable_roles = apply_filters('editable_roles', $all_roles);

    return $editable_roles;
}

Часть "editable" (редактируемые) присутствует потому, что она даёт другим плагинам возможность фильтровать список на случай, если у кого-то, кроме администратора, есть привилегия 'edit_users' (и тогда роль 'admin' нужно удалить из списка, иначе такой пользователь сможет сделать себя администратором). Плагины для управления ролями, которые создают пользовательские роли, как раз используют этот фильтр. В противном случае эта функция по сути является get_roles() (которой не существует).

Предположительно, ваш плагин будет показывать страницу настроек только тем, у кого есть права уровня администратора, например 'manage_options', то есть фактически администраторам с доступом ко всем ролям, поэтому фильтр не должен вас затрагивать.

Также есть wp_dropdown_roles(), которая возвращает роли в виде полей <option> для списка <select> (хотя в большинстве сценариев, где нужно выбрать, у кого есть доступ к чему-либо, чекбоксы, вероятно, подойдут лучше).

11 сент. 2010 г. 22:41:25
Комментарии

Примечание: Я создал эту функцию как часть патча для повышения безопасности WP, так что я предвзят в её пользу ;)

jerclarke jerclarke
11 сент. 2010 г. 23:06:30

Не уверен, что это лучшее решение вопроса, так как согласно документации, get_editable_roles() получает отфильтрованный список пользовательских ролей, которые текущий пользователь имеет право редактировать. Возможно, wp_roles() был бы лучшим выбором. Пожалуйста, проверьте мой ответ.

Pablo S G Pacheco Pablo S G Pacheco
26 апр. 2022 г. 21:46:03

Ответы Pablo или Rarst являются правильными. Этот ответ будет показывать всех пользователей только если у вас есть доступ к редактированию всех пользовательских ролей.

Obed Parlapiano Obed Parlapiano
20 окт. 2022 г. 20:20:45
0
20

Попробуйте это:

function get_role_names() {

global $wp_roles;

if ( ! isset( $wp_roles ) )
    $wp_roles = new WP_Roles();

return $wp_roles->get_names();
}

PS хех, пропустил это объяснение и ответ, слишком быстро я :)

11 сент. 2010 г. 22:47:14
0

Для тех, у кого многоязычный сайт, функция

function wp_roles_array() {
    $editable_roles = get_editable_roles();
    foreach ($editable_roles as $role => $details) {
        $sub['role'] = esc_attr($role);
        $sub['name'] = translate_user_role($details['name']);
        $roles[] = $sub;
    }
    return $roles;
}

возвращает локализованный массив такого вида (названия ролей на словацком языке):

Array
(
    [0] => Array
        (
            [role] => administrator
            [name] => Administrátor
        )

    [1] => Array
        (
            [role] => editor
            [name] => Editor
        )

    [2] => Array
        (
            [role] => author
            [name] => Autor
        )

    [3] => Array
        (
            [role] => contributor
            [name] => Prispievateľ
        )
)
25 мая 2016 г. 13:58:05
0

Вот как получить массив всех существующих ролей пользователей и их возможностей (capabilities) в WordPress. Если вы не хотите выводить его на экран, просто пропустите последнюю строку. Переменная $roles во второй строке будет содержать массив пользователей и их возможностей, который вы сможете использовать по своему усмотрению. Ниже приведен пример возвращаемого массива.

global $wp_roles;
$roles = $wp_roles->roles; 

// вывод на экран
echo '<pre>' . print_r( $roles, true ) . '</pre>';
9 сент. 2019 г. 17:30:58
0

Я не уверен, что принятый ответ является лучшим решением вопроса, так как согласно документации, функция get_editable_roles() получает отфильтрованный список ролей пользователей, которые текущий пользователь имеет право редактировать.

Возможно, нам просто нужно использовать wp_roles(). Эта функция получает глобальный экземпляр WP_Roles и создаёт его, если необходимо. И если вам просто нужен массив, где ключами являются идентификаторы ролей, а значениями — их названия, вы можете сделать так:

$roles = wp_roles()->get_names();
26 апр. 2022 г. 21:39:18
1

Вот как можно найти список ролей без использования плагинов или функций http://screencast.com/t/uaWsGLAR3Sh

26 янв. 2016 г. 22:47:50
Комментарии

Хотя данная ссылка может содержать ответ на вопрос, лучше включить основные части ответа здесь и оставить ссылку для справки. Ответы, состоящие только из ссылки, могут стать недействительными, если страница по ссылке изменится.

Gabriel Gabriel
26 янв. 2016 г. 23:19:18