Bagaimana cara membuat kapabilitas peran kustom?

26

Saya ingin membuat kemampuan khusus untuk mengakses antarmuka plugin saya.

  • Haruskah plugin mengelola menambahkan kemampuan ini ke semua akun administrator saat aktivasi?
  • Jika demikian: Apakah WordPress mengelola penambahan kemampuan untuk semua administrator sub blog dan administrator super dalam instalasi multisite, atau apakah fungsi itu perlu ditangani oleh plugin?
rsman
sumber
Blog detail: goo.gl/xNuafH
Suresh Kamrushi

Jawaban:

11

Hapus apa yang Anda tambahkan

Pertama, pastikan bahwa semua yang Anda tambahkan pada aktivasi juga akan dihapus saat dihapus . Saya mendapat tutorial singkat termasuk kode contoh untuk Anda.

Uji dengan plugin kecil:

Saya benar-benar tidak tahu banyak tentang MU, tetapi sejauh yang saya tahu, objek peran bersifat global di semua blog. Coba saja plugin kecil ini dan lihat apa yang bisa Anda dapatkan:

<?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' );

Menambah Kemampuan

/**
 * 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 );
    }
}

Catatan: Anda dapat menambahkan kemampuan ke peran tanpa memberikan akses ke peran - cukup setel argumen kedua $grant = false;. Ini memungkinkan pengguna tunggal yang masuk daftar putih dengan hanya menambahkan batasan termasuk argumen terakhir sebagai benar.

kaisar
sumber
17

Untuk plugin yang saat ini saya kerjakan, saya ingin memberikan / membatasi akses ke pengaturan plugin (yaitu, halaman menu admin yang sesuai) pada basis per peran .
Oleh karena itu, saya harus menambahkan plugin khusus capabilityuntukuser roles .

Sayangnya, jawaban kaiser tampaknya tidak berfungsi lagi, jadi saya meluangkan waktu mencoba mencari cara untuk mengizinkan fungsi yang disebutkan di atas.


Jadwal

Sebelum saya membagikan kode saya dengan Anda, berikut ini semuanya, dalam teks biasa:

  1. Pada aktivasi plugin, tambahkan kemampuan baru THE_NEW_CAPke peran yang memiliki kemampuan bawaan tertentu BUILT_IN_CAP(dalam kasus saya:) edit_pages.
  2. Pada setiap pemuatan halaman, lakukan 1. (yaitu, tambahkan kemampuan, lagi). Ini hanya diperlukan jika Anda ingin memperhitungkan kemungkinan peran baru yang telah dibuat setelah aktivasi plugin. Karenanya, peran-peran baru ini tidak memiliki kemampuan khusus plugin, bahkan jika mereka memiliki kemampuan bawaan yang diperlukan.
  3. Gunakan kemampuan baru untuk apa pun yang Anda inginkan. Seperti yang dijelaskan sebelumnya, saya menggunakannya untuk memberikan / membatasi akses ke halaman menu admin plugin, jadi itulah yang dilakukan pada contoh kode berikut.
  4. Pada penonaktifan plugin, hapus kapabilitas. Tentu saja, Anda juga bisa melakukan ini ketika plugin sedang dihapus instalasinya. Either way, lakukan pada akhirnya.

Kode

Dan inilah daftar di atas yang diubah menjadi kode:

»Menyiapkannya

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');
            }
        }
    }

»Menggunakannya

    // 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', ...);
    }

»Membersihkannya

    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');
            }
        }
    }

}

Catatan: Tolong jangan gunakan kemampuan huruf besar. Ini hanya untuk keterbacaan.

para pria
sumber
1
Selalu gunakan get_editable_roles()untuk mengambil peran yang ingin Anda edit. Anda akan merusak plugin jika tidak.
fuxia
1
@toscho Yah, oke, saya kira itu salah satu dari fungsi-fungsi ini bahkan Codex tidak tahu tentang ...;) Tentu saja, fungsi ini memiliki hak untuk hidup, namun, saya tidak melihat menggunakan global WP_Roles array breaking plugin dalam kasus saya.
tfrommen
2
Beberapa plugin membuat peran pengguna khusus dan mengandalkan set kemampuan yang tepat. Dalam beberapa kasus satu kemampuan mengecualikan penggunaan yang lain dalam logika program. Anda tidak bisa tahu kapan itu terjadi.
fuxia
0

Ini bekerja untuk saya:

    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 );
                }
            }
        }
    }
Vitaly Konurin
sumber
Jangan pernah memodifikasi global peran! Tak pernah. Jangan! Anda tidak akan memicu kait dan menolak filter dan menjadikan kode Anda target yang bergerak. Tidak ada yang akan tahu kapan dan di mana Anda mendaftarkan peran itu (Anda tidak, Anda hanya memasukkannya di suatu tempat, entah bagaimana, entah bagaimana). Tolong: Jangan pernah melakukan itu. Apalagi tidak dengan peran.
kaiser