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


38

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

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


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

1
Привет @ Джереми Кларк - Очень рад, что вы приняли участие здесь, и это именно то, что мы ищем здесь; ответы, связанные с общими вопросами, которые также могут раскрыть передовой опыт. Престижность!
MikeSchinkel

Ответы:


47

Роли хранятся в глобальной переменной $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;
}

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

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

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


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

14

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

function get_role_names() {

global $wp_roles;

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

return $wp_roles->get_names();
}

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


0

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


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

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ľ
        )
)

0

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

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

// print it to the screen
echo '<pre>' . print_r( $roles, true ) . '</pre>';
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.