it-swarm-id.com

Bagaimana cara membuat kapabilitas peran kustom?

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?
25
rsman

Hapus apa yang Anda tambahkan

Pertama, pastikan bahwa semua yang Anda tambahkan saat aktivasi juga mendapat dihapus saat dihapus instalan. 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 sana - cukup setel argumen kedua $grant = false;. Ini memungkinkan pengguna tunggal yang masuk daftar putih dengan hanya menambahkan batasan termasuk argumen terakhir sebagai benar.

10
kaiser

Untuk plugin yang saat ini saya kerjakan, saya ingin memberikan/membatasi akses ke pengaturan plugin (mis., Halaman menu admin yang sesuai) pada basis per peran.
Karena itu, saya harus menambahkan capability khusus plugin ke user 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 kapabilitas baru THE_NEW_CAP ke peran yang memiliki kapabilitas bawaan BUILT_IN_CAP (dalam kasus saya: edit_pages).
  2. Pada setiap pemuatan halaman, lakukan 1. (mis., Tambahkan kemampuan, lagi). Ini hanya diperlukan jika Anda ingin memperhitungkan kemungkinan peran baru yang telah dibuat setelah aktivasi plugin. Karenanya, peran baru ini tidak memiliki kapabilitas khusus plugin, meskipun peran tersebut 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 menggunakan kemampuan huruf besar. Ini hanya untuk keterbacaan.

17
tfrommen

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 );
                }
            }
        }
    }
0
Vitaly Konurin