Як створити власну функцію ролей?


26

Я хочу створити користувацьку можливість доступу до інтерфейсу мого плагіна.

  • Чи повинен плагін керувати додаванням цієї можливості до всіх облікових записів адміністратора під час активації?
  • Якщо так: чи вдається WordPress додавати можливості всім адміністраторам підблогів та супер адміністраторів у багатосайтових установках, чи цю функцію потрібно обробляти плагіном?

Блог з деталями: goo.gl/xNuafH
Суреш Камруші

Відповіді:


11

Видаліть додане вами

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

Тест з невеликим плагіном:

Я дійсно мало знаю про MU, але, наскільки я можу сказати, об'єкт ролей є глобальним у всіх блогах. Просто спробуйте цей маленький плагін і подивіться, що ви можете отримати:

<?php
/*
Plugin Name:    MU Roles check
Plugin URI:     https://github.com/franz-josef-kaiser/
Description:    Check roles during viewing a blog
Author:     Franz Josef Kaiser
Author URI:     https://plus.google.com/u/0/107110219316412982437
Version:        0.1
Text Domain:    murc
License:        GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/

/**
 * Show the blog data and the role names in this blog
 * Also shows if the custom capability was successfully added, or displays n/a for the role
 * 
 * @return void
 */
function wpse35165_role_check()
{
    $blog = get_current_site();
    $custom_cap = 'name_of_your_custom_capability';

    $html = "<hr /><table>";
    $html .= "<caption>List roles in (Blog) {$blog->site_name} / ID#{$blog->id}</caption>"
    $html .= "<thead><tr><th>Role Name</th><th>Capabilties</th></tr></thead><tbody>";
    foreach ( $GLOBALS['wp_roles'] as $name => $role_obj )
    {
        $cap = in_array( $custom_cap, $role_obj->caps ) ? $custom_cap : 'n/a';
        $cap = $cap OR in_array( $custom_cap, $role_obj->allcaps ) ? $custom_cap : 'n/a';
        $html .= "<tr><td>{$name}</td><td>{$cap}</td></tr>";
    }
    $html .= '</tbody></table>';

    print $html;
}
add_action( 'shutdown', 'wpse35165_role_check' );

Додавання можливостей

/**
 * Add the capability to the role objects
 * Should be in your activation function and done before you inspect with your plugin
 * 
 * @return void
 */
function wpse35165_add_cap()
{
    $custom_cap = 'name_of_your_custom_capability';
    $min_cap    = 'the_minimum_required_built_in_cap'; // Check "Roles and objects table in codex!
    $grant      = true; 

    foreach ( $GLOBALS['wp_roles'] as $role_obj )
    {
        if ( 
            ! $role_obj->has_cap( $custom_cap ) 
            AND $role_obj->has_cap( $min_cap )
        )
            $role_obj->add_cap( $custom_cap, $grant );
    }
}

Примітка. Ви можете додати можливість до ролі, не надаючи їй доступ - просто встановіть другий аргумент $grant = false;. Це дозволяє дозволити одиноким користувачам просто додати обмеження, включаючи останній аргумент як істинний.


17

Для плагіна, над яким я зараз працюю, я хотів надати / обмежити доступ до налаштувань плагінів (тобто, відповідно до сторінок меню адміністратора) на основі ролей .
Тому мені довелося додати новий плагін, специфічний capabilityдляuser roles .

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


Розклад

Перш ніж я поділюся з вами своїм кодом, ось про що йдеться у простому тексті:

  1. Під час активації плагіну додайте нові можливості THE_NEW_CAPдо ролей, що мають певну вбудовану можливість BUILT_IN_CAP(у моєму випадку edit_pages:).
  2. На кожному завантаженні сторінки зробіть 1. (тобто знову додайте можливість). Це необхідно лише в тому випадку, якщо ви хочете врахувати можливі нові ролі, створені після активації плагіна. Отже, ці нові ролі не мають можливості плагіна, навіть якщо вони мають необхідну вбудовану можливість.
  3. Використовуйте нові можливості для всього, що вам завгодно. Як було пояснено раніше, я використовую це для надання / обмеження доступу до сторінок меню адміністратора плагіна, так це робиться в наступному прикладі коду.
  4. Після дезактивації плагіну вийміть можливість. Звичайно, ви можете це зробити і під час видалення плагіна. Так чи інакше, зробіть це зрештою.

Кодекс

А ось наведений вище список, перетворений у код:

»Налаштування

class WPSE35165Plugin {

    public function __construct() {
        // Register hooks
        register_activation_hook(__FILE__, array(__CLASS__, 'activation'));
        register_deactivation_hook(__FILE__, array(__CLASS__, 'deactivation'));

        // Add actions
        add_action('admin_menu', array(__CLASS__, 'admin_menu'));
    }

    public function activation() {
        self::add_cap();
    }

    // Add the new capability to all roles having a certain built-in capability
    private static function add_cap() {
        $roles = get_editable_roles();
        foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) {
            if (isset($roles[$key]) && $role->has_cap('BUILT_IN_CAP')) {
                $role->add_cap('THE_NEW_CAP');
            }
        }
    }

»Використовуючи це

    // Add plugin menu pages to admin menu
    public function admin_menu() {
        // Remove the following line if you don't care about new roles
        // that have been created after plugin activation
        self::add_cap();

        // Set up the plugin admin menu
        add_menu_page('Menu', 'Menu', 'THE_NEW_CAP', …);
        add_submenu_page('wpse35165', 'Submenu', 'Submenu', 'THE_NEW_CAP', ...);
    }

»Очищення

    public function deactivation() {
        self::remove_cap();
    }

    // Remove the plugin-specific custom capability
    private static function remove_cap() {
        $roles = get_editable_roles();
        foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) {
            if (isset($roles[$key]) && $role->has_cap('THE_NEW_CAP')) {
                $role->remove_cap('THE_NEW_CAP');
            }
        }
    }

}

Примітка. Будь ласка, не використовуйте великі регістри. Це просто для читабельності.


1
Завжди використовуйте get_editable_roles()для отримання ролей, які ви хочете редагувати. Ви будете ламати плагін інакше.
fuxia

1
@toscho Ну, ладно, я вважаю , що одна з цих функцій навіть Кодекс про це не знає ...;) Звичайно, ця функція має своє право на існування, однак, я не бачу , з використанням глобальної WP_Roles масиву ломки будь-які плагіни в моєму випадку.
tfrommen

2
Деякі плагіни створюють спеціалізовані ролі користувачів та покладаються на точний набір можливостей. У деяких випадках одна можливість виключає використання іншої в логіці програми. Ви не можете знати, коли це так.
fuxia

0

Це працює для мене:

    add_action('admin_init', 'add_custom_cap');
    function add_custom_cap()
    {
        $custom_cap = 'test_cap';
        $min_cap    = 'read';
        $grant      = true;
        $to_role = 'your_user_role';
        $role = 'user_role';

        foreach ( $GLOBALS['wp_roles'] as $role_obj )
        {
            if (is_object($role_obj[$role])) {
                if (!$role_obj[$role]->has_cap( $custom_cap ) && $role_obj[$role]->has_cap( $min_cap )) {
                    $role_obj[$role]->add_cap( $custom_cap, $grant );
                }
            }
        }
    }

Ніколи не змінюйте глобальних ролей! Ніколи. Не треба! Ви не будете запускати гачки і забороняти фільтри, і не зробите свій код рухомою ціллю. Ніхто ніколи не дізнається, коли і де ти зареєстрував цю роль (ти цього не зробив, ти просто її кудись набивав, десь, як-небудь). Будь ласка: Ніколи цього не робіть. Особливо не з ролями.
кайзер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.