Come posso creare una funzione di ruolo personalizzata?


26

Vorrei creare una capacità personalizzata per accedere all'interfaccia del mio plugin.

  • Il plug-in dovrebbe gestire l'aggiunta di questa funzionalità a tutti gli account amministratore all'attivazione?
  • In tal caso: WordPress riesce ad aggiungere la capacità a tutti gli amministratori di sub blog e super amministratori in installazioni multisito o tale funzione deve essere gestita dal plugin?

Un blog dettagliato: goo.gl/xNuafH
Suresh Kamrushi

Risposte:


11

Rimuovi ciò che aggiungi

Innanzitutto, assicurati che tutto ciò che aggiungi all'attivazione venga rimosso anche durante la disinstallazione . Ho un breve tutorial che include un codice di esempio per te.

Prova con un piccolo plugin:

Non so davvero molto di MU, ma per quanto ne so, l'oggetto ruoli è globale in tutti i blog. Prova questo piccolo plugin e vedi cosa puoi ottenere:

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

Aggiunta di funzionalità

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

Nota: è possibile aggiungere la funzionalità al ruolo senza concedere l'accesso ad esso - basta impostare il secondo argomento $grant = false;. Ciò consente la whitelisting di singoli utenti semplicemente aggiungendo il cap incluso l'ultimo argomento come vero.


17

Per un plug-in su cui sto attualmente lavorando, volevo concedere / limitare l'accesso alle impostazioni del plug-in (ovvero le pagine del menu di amministrazione corrispondenti) in base al ruolo .
Pertanto, ho dovuto aggiungere un nuovo plug-in specifico capabilityaluser roles .

Sfortunatamente, la risposta di Kaiser sembra non funzionare più, quindi ho trascorso un po 'di tempo a cercare di capire come consentire la funzionalità sopra menzionata.


Il programma

Prima di condividere il mio codice con te, ecco di cosa si tratta, in testo semplice:

  1. All'attivazione del plug-in, aggiungi la nuova funzionalità THE_NEW_CAPai ruoli con una certa funzionalità integrata BUILT_IN_CAP(nel mio caso:edit_pages .
  2. Ad ogni caricamento della pagina, esegui 1. (ovvero, aggiungere di nuovo la funzionalità). Ciò è necessario solo se si desidera tenere conto di possibili nuovi ruoli che sono stati creati dopo l'attivazione del plug-in. Pertanto, questi nuovi ruoli non dispongono della funzionalità specifica del plug-in, anche se dispongono della funzionalità integrata richiesta.
  3. Usa la nuova funzionalità per quello che vuoi. Come spiegato in precedenza, lo uso per concedere / limitare l'accesso alle pagine del menu di amministrazione del plug-in, in questo modo viene fatto nel seguente esempio di codice.
  4. Alla disattivazione del plug-in, rimuovere la funzionalità. Naturalmente, potresti farlo anche quando il plugin viene disinstallato. Ad ogni modo, fallo alla fine.

Il codice

Ed ecco la lista sopra convertita in codice:

»Impostazione

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

" Usandolo

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

»Pulizia

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

}

Nota: non utilizzare le maiuscole. Questo è solo per leggibilità.


1
Utilizzare sempre get_editable_roles()per recuperare i ruoli che si desidera modificare. Si dovrà rompere i plugin altrimenti.
fuxia

1
@toscho Bene, bene, suppongo che sia una di queste funzioni anche il Codex non conosce ...;) Naturalmente, questa funzione ha il suo diritto di esistere, tuttavia, non vedo utilizzando il WP_Roles matrice globale di rottura eventuali plugin nel mio caso.
martedì

2
Alcuni plugin creano ruoli utente specializzati e si basano sull'esatto set di funzionalità. In alcuni casi una funzionalità esclude l'uso di un'altra nella logica del programma. Non puoi sapere quando è così.
fuxia

0

Questo funziona per me:

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

Non modificare mai le parti globali dei ruoli! Mai. Non farlo! Non innescerai alcun hook e negherai i filtri e renderai il tuo codice un bersaglio mobile. Nessuno saprà mai quando e dove hai registrato quel ruolo (non l'hai fatto, l'hai inserito da qualche parte, da qualche parte, in qualche modo). Per favore: non farlo mai. Soprattutto con i ruoli.
Kaiser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.