Отримання списку доступних ролей на веб-сайті WordPress?


38

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

Який найкращий спосіб отримати список?


6
Примітка. Спочатку це питання задав Райан Білескі в списку розсилки wp-хакерів і відповів на мене. Я додав його сюди, тому що це чіткий випадок найкращого практичного питання, яке люди можуть задати 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.