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

Роли хранятся в глобальной переменной $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>
(хотя в большинстве сценариев, где нужно выбрать, у кого есть доступ к чему-либо, чекбоксы, вероятно, подойдут лучше).

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

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

Для тех, у кого многоязычный сайт, функция
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ľ
)
)

Вот как получить массив всех существующих ролей пользователей и их возможностей (capabilities) в WordPress. Если вы не хотите выводить его на экран, просто пропустите последнюю строку. Переменная $roles во второй строке будет содержать массив пользователей и их возможностей, который вы сможете использовать по своему усмотрению. Ниже приведен пример возвращаемого массива.
global $wp_roles;
$roles = $wp_roles->roles;
// вывод на экран
echo '<pre>' . print_r( $roles, true ) . '</pre>';

Я не уверен, что принятый ответ является лучшим решением вопроса, так как согласно документации, функция get_editable_roles()
получает отфильтрованный список ролей пользователей, которые текущий пользователь имеет право редактировать.
Возможно, нам просто нужно использовать wp_roles()
. Эта функция получает глобальный экземпляр WP_Roles
и создаёт его, если необходимо. И если вам просто нужен массив, где ключами являются идентификаторы ролей, а значениями — их названия, вы можете сделать так:
$roles = wp_roles()->get_names();

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