Gruppi di funzionalità: utenti con più ruoli?


9

Sono abbastanza sicuro di comprendere i ruoli e le capacità configurate in WordPress: capacità granulari, raggruppate in ruoli che possono essere assegnati agli utenti. Il codice dovrebbe controllare le capacità granulari, non i ruoli (perché le capacità per ruoli particolari possono cambiare). I ruoli non sono necessariamente gerarchici (sebbene i ruoli predefiniti lo siano).

Esiste un modo per assegnare più ruoli agli utenti? In alternativa, avere un numero di gruppi di capacità e associare uno o più gruppi a un utente? Il modo in cui funziona il mio sito comporta una serie di ovvie responsabilità: aggiornamento delle pagine Web, moderazione dei forum, aggiornamento del calendario degli eventi e così via. Ogni responsabilità ha un gruppo di capacità necessarie per eseguire le attività ad essa associate. Vorrei consentire a un utente di eseguire una o più responsabilità. Quindi l'utente A potrebbe aggiornare le pagine Web e il calendario degli eventi ma non moderare i forum (non abbastanza discretamente), ma l'utente B potrebbe moderare i forum, aggiornare il calendario degli eventi, ma non è consentito vicino alle pagine Web.

A corto di definire un ruolo per ogni possibile combinazione di responsabilità, esiste un modo per farlo?


Il plugin Role Scoper potrebbe essere in grado di realizzare ciò che stai cercando.
Devin Humbert,

Penso che sia più per pagina o per post, il che non è proprio quello che sto cercando, ma indagherò un po 'di più, grazie.
lpryor,

@lpryor - Role Scoper ha più opzioni, puoi controllare per pagina e per post per utenti o gruppi, ma anche per categoria, per tassonomia e per tipo di post, quindi sembrerebbe che tu possa ottenere ciò che dopo questo.
Milo,

Prova questo gist.github.com/nikolov-tmw/7808046 Aggiungi più caselle di controllo alla selezione del ruolo
OzzyCzech

Risposte:


3

La mancanza di ruoli multipli mi ha irritato per molto tempo poiché la classe WP_User sottostante supporta più ruoli. Ho anche pensato di cercare una soluzione software alternativa. @lpryor - dopo aver letto il tuo post, sono stato ri-motivato a implementarlo da solo.

Ci sono voluti un numero sorprendentemente breve di linee da fare anche se ho dovuto hackerare il file users.php da quando ero troppo pigro per creare un plugin separato per farlo per me. Chiaramente questo è il modo sbagliato di farlo, quindi se in futuro sarò abbastanza motivato, potrei provare a farlo correttamente.

Se non ti interessa poter eseguire l'aggiornamento all'ultima versione di Wordpress (che dovresti), puoi implementare più ruoli con i frammenti di codice di seguito. Tieni presente che non sono un esperto di wordpress. Ho appena aperto i file pertinenti e apportato le modifiche senza cercare di comprendere le implicazioni complete di ciò che stavo facendo. Il codice mi sembra ragionevole ma non mi fiderei della mia vita.

(Sto usando 3.2 quindi i tuoi numeri di riga possono variare) In class-wp-users-list-table.php appena prima della riga 150 aggiungine alcuni come i seguenti:

<div class="alignleft actions">
    <label class="screen-reader-text" for="remove_role"><?php _e( 'Remove role &hellip;' ) ?></label>
    <select name="remove_role" id="remove_role">
        <option value=''><?php _e( 'Remove role &hellip;' ) ?></option>
        <?php wp_dropdown_roles(); ?>
    </select>
    <?php submit_button( __( 'Remove' ), 'secondary', 'changeit', false ); ?>
</div>

quindi cambia la funzione current_account in modo che assomigli a questo

function current_action() {
    if ( isset($_REQUEST['changeit']) ) {
        if ( !empty($_REQUEST['new_role']) )
            return 'promote';
        elseif ( !empty($_REQUEST['remove_role']) )
            return 'remove_role';
    }

    return parent::current_action();

}

Ora in users.php Commenta le righe 71-76

/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
    $update = 'err_admin_role';
    continue;
}
*/

Sostituisci set_role nella riga 83 con add_role

$user->add_role($_REQUEST['new_role']);

Alla riga 92 aggiungi quanto segue (Questa è solo una copia e incolla leggermente modificata dall'azione di promozione - Non ho verificato per assicurarsi che la capacità di promozione_utente sia appropriata per rimuovere i ruoli)

case 'remove_role':
    check_admin_referer('bulk-users');

    if ( ! current_user_can( 'promote_users' ) )
            wp_die( __( 'You can&#8217;t edit that user.' ) );

    if ( empty($_REQUEST['users']) ) {
            wp_redirect($redirect);
            exit();
    }

    $editable_roles = get_editable_roles();
    if ( empty( $editable_roles[$_REQUEST['remove_role']] ) )
            wp_die(__('You can&#8217;t remove that role'));

    $userids = $_REQUEST['users'];
    $update = 'remove_role';
    foreach ( $userids as $id ) {
            $id = (int) $id;

            if ( ! current_user_can('promote_user', $id) )
                    wp_die(__('You can&#8217;t edit that user.'));
            // The new role of the current user must also have promote_users caps
            // Need to think this through
            /*
            if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
                    $update = 'err_admin_role';
                    continue;
            }
            */

            // If the user doesn't already belong to the blog, bail.
            if ( is_multisite() && !is_user_member_of_blog( $id ) )
                    wp_die(__('Cheatin&#8217; uh?'));

            $user = new WP_User($id);
            $user->remove_role($_REQUEST['remove_role']);
    }

    wp_redirect(add_query_arg('update', $update, $redirect));
    exit();

Alla riga 370 aggiungere quanto segue

case 'remove_role':
    $messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
    break;

Sembra fantastico, @ adi-eyal, grazie mille! Ci proverò e lo proverò.
lpryor,

@lpryor hey, mi chiedevo solo se sei riuscito a implementare più ruoli senza hackerare il codice core di WP? Sarebbe bello saperlo! Non sono riuscito a trovare alcun plug-in, ma allo stesso tempo non voglio hackerare il codice WP principale. Grazie!
dashaluna,

@dashaluna Non sono ancora riuscito a farlo, ma si sta avvicinando alla cima della mia lista!
lpryor,

5
Hacking core come questo non è la strada da percorrere. Questo sarebbe rimosso su qualsiasi aggiornamento del core di WordPress. Agganciatelo o dimenticatelo, ma questo (anche se funziona) non dovrebbe essere raccomandato.
Kaiser

L'aggiornamento del core non è una buona pratica. Utilizzare invece ganci di azione / filtro.
Sufi,

3

Il plug-in Editor ruoli utente gestisce più ruoli per un utente.

Una volta installato, Utenti> sotto ciascun utente è l'opzione Funzionalità. URE considera il primo ruolo di WP come "ruolo primario" e consente di aggiungere "altri ruoli".


0

Uso il plug-in Members insieme a funzionalità personalizzate.

Non puoi assegnare più ruoli a una persona, ma puoi creare qualsiasi ruolo e specificare quali funzionalità ha quel ruolo.

In the tempaltes, puoi usare qualcosa come current_user_can () .


Sì, me ne rendo conto. Ma mi chiedevo se c'è un modo di non dover definire un ruolo separato per ogni possibile combinazione di responsabilità. La combinatoria potrebbe renderlo non molto divertente e soggetto a errori.
lpryor,

Non ho trovato molto su Google. Il più vicino che ho avuto è stato questo thread: wordpress.org/support/topic/multiple-roles-for-a-user .
Steven,
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.