Ottenere il ruolo di un utente WordPress
Un utente WordPress è sempre associato ad un ruolo (Sottoscrittore, Collaboratore, Autore, Editore, Amministratore) al quale sono associate delle capacità (pubblicare contenuti, modificare i parametri di configurazione, ecc). Infatti il CMS è dotato di un sistema di gestione utenti integrato, che consente di aggiungere altre “figure lavorative” oltre a quella di amministratore.
Se desiderate visualizzare sul vostro sito il ruolo di un utente, saranno necessarie un paio di righe di codice.
Per ottenere il ruolo dell’utente connesso, bisognerà inserire alcune linee che permetteranno di visualizzare le sue informazioni. Si potrebbe anche creare una funzione PHP se si prevede di riutilizzare il codice più volte.
Il codice fa l’azione seguente: recupera l’ID dell’utente per ottenere i suoi dati personali, compreso il ruolo. La funzione echo consente la visualizzazione del nome dell’utente e il ruolo WordPress.
<?php $user_id = get_current_user_id(); $user_info = get_userdata($user_id); if($user_info) { echo 'Username: '.$user_info->user_login.'<br />'; echo 'User roles: '.implode(', ', $user_info->roles).'<br />'; // Attenzione : $user_info->roles restituisce un array } ?>
Siete liberi di adattare questo codice per ottenere le altre informazioni dell’utente desiderato. Ad esempio :
<?php $user_info = get_userdata(1); $username = $user_info->user_login; $first_name = $user_info->first_name; $last_name = $user_info->last_name; echo "$first_name $last_name logs into her WordPress site with the user name of $username."; ?>
Potrete trovare la funzione utilizzata per ottenere queste informazioni nel file wp-includes/pluggable.php :
function get_userdata( $user_id ) { return get_user_by( 'id', $user_id ); }
Qui troverete la documentazione ufficiale del codice sorgente di WordPress.
Come creare la una pagina Capability
Adesso dovrebbe essere ormai chiaro che un ruolo non è altro che un insieme di capability.
Una capability non è altro che quello che può fare un utente all’interno di WordPress. Vogliamo dargli soltanto la possibilità di leggere (come accade per gli utenti Subscriber)? Allora l’unica capability che dovremmo assegnarli è read
. Desideriamo che un utente in particolare sia anche in grado di installare e disinstallare temi? Allora dovremmo assegnarli le capability install_themes
ed edit_themes
.
Ovviamente potremo andare avanti in questo modo a lungo e potremo parlare infinitamente di tutte le variabili. Per rimanere sulla tematica dell’articolo, se ciò vi interessa vi lasciamo consultare l’ottima sezione relativa a questo argomento presente all’interno del Codex WordPress.
Adesso che dovrebbe essere chiaro che cosa permettono di impostare le capability, entriamo nella parte divertente dell’articolo ed andiamo a scoprire com’è possibile aggiungere (e creare allo stesso tempo) una per un determinato ruolo o per un determinato utente.
<?php //Per Ruolo function aggiungi_capability() { // prendo il ruolo author $ruolo = get_role( 'author' ); //Aggiungo la mia Capability $role->add_cap( 'aggiungi_prodotto' ); } add_action( 'admin_init', 'aggiungi_capability'); //Per Utente $user = new WP_User( $user_id ); $user->add_cap( 'can_edit_posts');
Come potete sicuramente notare, le pratiche per aggiungere una capability differiscono leggermente quando vogliamo farlo su un ruolo oppure su un singolo utente . Se nel primo caso abbiamo bisogno di un Action Hook (precisamente di admin_init
) che ci permetta di richiamare il ruolo author
, nel secondo l’unica cosa di cui abbiamo bisogno è conoscere l’ID dell’utente per il quale desideriamo aggiungere una capability.
Dal codice si può anche notare quanto sia semplice creare una capability personalizzata, infatti, tutto quello che dovrete fare è scrivere la capability che vogliamo creare (che nel codice sarebbe aggiungi_prodotto
) ed il gioco è fatto; d’ora in avanti il ruolo author porterà con se questa impostazione.
Passiamo ai Ruoli
Come abbiamo già visto, un ruolo è un insieme di capability che permettono all’utente di accedere a determinate impostazioni o di eseguire particolari azioni che sono state definite dal plugin.
Per rendere il tutto più semplice facciamo un esempio concreto. Molto probabilmente conoscete già il plugin WooCommerce che permette di creare in pochi click il vostro eCommerce; questo non fa altro che aggiungere dei Custom Post Type e crea allo stesso tempo dei ruoli e capability dedicate alla gestione dei negozi.
Appena installato, il ruolo creato prende il nome di Shop Manager e come possiamo aspettarci permetterà all’utente con questo ruolo di gestire il proprio negozio. Per fare questo, WooCommerce crea anche delle capability e giusto per dare qualche esempio queste sono: edit_product
, delete_shop_coupon_terms
oppure read_shop_order
.
<?php //Crea un Ruolo Personalizzato $aggiungi_ruolo = add_role( 'shop_manager', __( 'Shop Manager' ), array( 'edit_product' => true, // true ci attiva la capability 'delete_shop_coupon_terms' => true, 'read_shop_order' => false, // false la disattiva ) );
Questa è una versione molto semplificata del codice utilizzato da WooCommerce durante la sua installazione. Come ormai ci ha abituato WordPress i parametri accettati dalla funzione add_role()
sono molto semplici:
- il primo elemento rappresenta lo slug (o abbreviazione per noi italiani) e ci permette di creare un nome umano per richiamare successivamente il ruolo creato;
- in seguito abbiamo la possibilità di inserire una stringa di testo che identificherà il nome che l’utente potrà leggere all’interno del proprio backend;
- ultimo, ma non per importanza, troviamo la lista di capability da assegnare al ruolo che stiamo creando.
Ecco come potrete creare dei ruoli personalizzati da utilizzare all’interno dei vostri plugin, prima di andare a vedere come sia possibile controllare se un utente ha o meno un determinato ruolo o capability, cerchiamo di capire come assegnarlo a un utente esistente all’interno della propria installazione WordPress.
Per fare questo bisogna usare la funzione wp_update_user()
che si può usare nel metodo seguente (se bisogno, non esitate a consultare il Codex WordPress):
<?php //Aggiungi un Ruolo ad un Utente $user_id = 3; $ruolo = 'shop_manager'; $user_id = wp_update_user( array( 'ID' => $user_id, 'role' => $ruolo ) );
E questo per quando vogliamo assegnare un ruolo ad un utente già esistente, ma se si desidera assegnare un ruolo particolare durante la creazione di un utente potrete procedere in due modi diversi:
- il primo, e più semplice, è quello di creare il nuovo utente utilizzando le funzionalità interne del nostro backend, ma è poco pratica quando stiamo lavorando con il codice…
- per questo potete assegnare il ruolo con il vostro codice PHP usando la funzione `wp_insert_user()` e specificando il ruolo durante la sua creazione.
Ancora una volta vi lasciamo approfondire gli argomenti consultando la pagina del Codex creata appositamente.
Ruoli e Capability
Siamo quasi alla fine di questo articolo, ma dopo tutto quello che abbiamo visto, ci sembra più che necessario spiegare come sia possibile controllare che l’utente che sta cercando di eseguire una determinata operazione abbia le competenze per farlo.
Anche perché, altrimenti, non ci sarebbe stato il motivo di creare ruoli e capability.
Diciamo quindi che vogliamo controllare che l’utente che al momento è loggato può modificare gli articoli di altre persone, come fare? Ecco un piccolo ma utilissimo codice che presenta la funzione current_user_can()
:
<?php //Controlla la capability di un utente loggato if( current_user_can('edit_others_posts') ){ echo "Puoi modificare gli articoli degli altri"; }
Questo codice è incredibilmente utile se vogliamo scoprire, o limitare, che cosa è in grado di fare un determinato utente e riprendendo i discorsi iniziali sulla sicurezza, ci permette anche di limitare i danni che gli utenti meno esperti possono fare al nostro WordPress.
Ma come fare per creare un codice che permette di controllare le capability di un utente che non è loggato? Si può utilizzare questo semplice codice:
<?php //Controlla un dato utente if ( user_can( 6, 'edit_others_posts' ) ) { // Fai qualcosa }
Ovvero bisogna usare la funzione user_can()
e passare come primo parametro l’ID dell’utente stesso e come secondo la capability che si vuole controllare.
Infine, ecco la pagina del Codex dove questa funzione è spiegata per bene.