Gestire 30, 50 o 100 siti WordPress significa gestire centinaia di utenti: clienti, redattori, sviluppatori esterni, amministratori. I ruoli WordPress per agenzie sono il primo strumento di sicurezza e organizzazione operativa. Una configurazione sbagliata dei permessi puo causare danni che vanno dal contenuto pubblicato per errore fino alla compromissione completa del sito.
In questa guida spieghiamo come configurare ruoli e capability in WordPress singolo e Multisite, creare ruoli custom con PHP e plugin, applicare il principio del minimo privilegio, e automatizzare la gestione utenti con WP-CLI. Tutto con esempi di codice reale usato nella nostra gestione di agenzia.
TL;DR — Punti chiave
- WordPress ha 6 ruoli predefiniti (Super Admin, Administrator, Editor, Author, Contributor, Subscriber) ma nessuno e pensato per le agenzie multi-sito
- Il principio del minimo privilegio e la regola numero uno: dai sempre il ruolo piu basso sufficiente per il compito
- In Multisite, solo il Super Admin ha controllo di rete. Gli Administrator sono limitati al singolo sito
- I ruoli custom si creano con
add_role()in functions.php o con plugin come User Role Editor e Members - WP-CLI permette batch operation su utenti di tutti i siti in pochi secondi
- Oltre 20 capability critiche vanno verificate prima di assegnare un ruolo, non solo quelle ovvie
Ruoli WordPress predefiniti: cosa fanno davvero
Secondo la documentazione ufficiale WordPress, il sistema ruoli e basato su due concetti: Role (insieme di permessi) e Capability (permesso singolo). Ogni ruolo ha un set di capability. Un utente puo avere un ruolo per sito.
I ruoli predefiniti sono 6, ma in realta sono 5 per installazioni singole. Il Super Admin esiste solo in Multisite.
Tabella ruoli e capability principali
| Ruolo | Cosa puo fare | Cosa NON puo fare | Quando usarlo in agenzia |
|---|---|---|---|
| Super Admin | Tutto, su tutta la rete Multisite. Gestisce siti, temi, plugin di rete, utenti globali | Limitato solo dal filesystem e dal server | Solo 1-2 persone nell’agenzia. Mai al cliente |
| Administrator | Tutto sul singolo sito: plugin, temi, utenti, impostazioni | Non puo gestire la rete Multisite, non puo installare temi/plugin di rete | Project manager dell’agenzia per quel cliente. Mai al cliente finale |
| Editor | Gestisce tutti i post (anche di altri), moderate commenti, gestire categorie | Non puo installare plugin/temi, non puo gestire utenti, non puo cambiare impostazioni | Redattore del cliente che pubblica e revisa contenuti |
| Author | Scrivi e pubblica i propri post, carica file | Non puo modificare post altrui, non gestisce categorie, non moderate commenti | Blog ghost writer o contributor esterno fidato |
| ContributorScrivi post ma non puo pubblicarli (salva come draft) | Non puo caricare file, non puo pubblicare | Guest poster, stagista, cliente che vuole proporre contenuti | |
| SubscriberLegge, commenta (se abilitato), gestisce il proprio profilo | Tutto il resto | Utente registrato per area riservata o newsletter |
Perche i ruoli predefiniti non bastano alle agenzie
Il problema principale e che Administrator ha troppo potere. Un cliente con ruolo Administrator puo installare plugin insicuri, cambiare tema, disattivare plugin di sicurezza, modificare file via editor. Abbiamo visto clienti disattivare Wordfence perche “bloccava un plugin” e ritrovarsi il sito infetto 48 ore dopo.
Dall’altra parte, Editor ha troppo poco potere per molti casi reali. Un redattore spesso ha bisogno di gestire menu, widget, o alcune impostazioni del tema. Ma il ruolo Editor non include edit_theme_options.
La soluzione e creare ruoli custom che danno esattamente i permessi necessari. Niente di piu, niente di meno.
Creare ruoli custom con PHP: esempi reali
1. Ruolo “Cliente Editor” — editor con gestione menu
Il caso piu comune: il cliente deve gestire contenuti e menu, ma non plugin o impostazioni. Creiamo un ruolo che parte da Editor e aggiunge edit_theme_options (menu, widget, Customizer).
// functions.php — Aggiungere ruolo Cliente Editor
function agencypilot_add_cliente_editor_role() {
// Verifica che il ruolo non esista gia
if ( get_role( 'cliente_editor' ) ) {
return;
}
// Clona le capability di Editor
$editor_caps = get_role( 'editor' )->capabilities;
add_role(
'cliente_editor',
__( 'Cliente Editor', 'agencypilot' ),
array_merge( $editor_caps, array(
'edit_theme_options' => true, // Menu e widget
'manage_categories' => true, // Categorie e tag
'moderate_comments' => true, // Moderazione commenti
'list_users' => false, // No gestione utenti
'edit_users' => false, // No modifica utenti
'manage_options' => false, // No impostazioni generali
'activate_plugins' => false, // No plugin
'switch_themes' => false, // No cambio tema
) )
);
}
add_action( 'init', 'agencypilot_add_cliente_editor_role' );
2. Ruolo “Developer” — accesso completo senza gestione utenti
Per sviluppatori esterni o collaboratori che devono lavorare su codice e contenuti ma non gestire il team.
function agencypilot_add_developer_role() {
if ( get_role( 'developer' ) ) {
return;
}
$admin_caps = get_role( 'administrator' )->capabilities;
// Rimuovi capability sensibili
unset( $admin_caps['edit_users'] );
unset( $admin_caps['create_users'] );
unset( $admin_caps['delete_users'] );
unset( $admin_caps['promote_users'] );
add_role(
'developer',
__( 'Developer', 'agencypilot' ),
$admin_caps
);
}
add_action( 'init', 'agencypilot_add_developer_role' );
3. Ruolo “SEO Manager” — content e SEO senza admin
Per consulenti SEO che devono ottimizzare contenuti, meta tag, e alcune impostazioni SEO senza avere accesso completo.
function agencypilot_add_seo_manager_role() {
if ( get_role( 'seo_manager' ) ) {
return;
}
$editor_caps = get_role( 'editor' )->capabilities;
add_role(
'seo_manager',
__( 'SEO Manager', 'agencypilot' ),
array_merge( $editor_caps, array(
'edit_theme_options' => true,
'manage_options' => false,
// Yoast SEO capability
'wpseo_manage_options' => true,
// Rank Math capability
'rank_math_manage_options' => true,
) )
);
}
add_action( 'init', 'agencypilot_add_seo_manager_role' );
Nota importante: le capability dei plugin SEO (Yoast, Rank Math) sono definite dai plugin stessi. Verifica con get_role('administrator')->capabilities dopo aver attivato il plugin per vedere i nomi esatti.
WordPress Multisite: ruoli e permessi di rete
In una configurazione Multisite, la gestione utenti cambia radicalmente. Il Super Admin (chiamato anche Network Administrator) e l’unico ruolo che ha controllo su tutta la rete. Tutti gli altri ruoli sono limitati al singolo sito.
- Un Administrator del Sito A non puo vedere o gestire il Sito B
- Un utente puo avere ruoli diversi su siti diversi (Editor nel Sito A, Subscriber nel Sito B)
- Solo il Super Admin puo installare temi e plugin di rete
- Solo il Super Admin puo creare nuovi siti nella rete
Assegnare utenti a piu siti con WP-CLI
# Aggiungi utente mario@cliente.it come Editor nel sito 3
wp user add-role mario@cliente.it editor --url=cliente3.agency.it
# Aggiungi lo stesso utente come Cliente Editor nel sito 5
wp user add-role mario@cliente.it cliente_editor --url=cliente5.agency.it
# Verifica i ruoli dell'utente su tutti i siti
wp user list --fields=user_login,display_name,roles --format=csv | grep mario
Critical capability: manage_network
La capability manage_network e quella che trasforma un Administrator normale in Super Admin. In Multisite, questa capability e assegnata automaticamente all’utente che ha creato la rete. Per aggiungere un secondo Super Admin:
// In un plugin must-use (mu-plugin) o via WP-CLI
// Via WP-CLI (consigliato):
wp cap add administrator manage_network
// Oppure via PHP nel Super Admin esistente:
grant_super_admin( $user_id );
Attenzione: grant_super_admin() funziona solo in Multisite. In installazioni singole non ha effetto.
Plugin per gestire ruoli e permessi
Se preferisci non scrivere PHP, ci sono plugin che permettono di gestire ruoli e capability da interfaccia. Ecco i piu affidabili che usiamo nei progetti dei clienti.
Members (MemberPress)
Plugin gratuito, oltre 300.000 installazioni attive. Permette di creare ruoli custom, assegnare capability singole, gestire permessi sui contenuti, e creare area riservate. Interfaccia chiara e hookabili per sviluppatori.
Link: wordpress.org/plugins/members
User Role Editor
Plugin gratuito con premium add-on. Mostra tutte le capability in una griglia, permette di crearne di custom e assegnarle ai ruoli. Utile per audit veloce dei permessi esistenti.
Link: wordpress.org/plugins/user-role-editor
Capability Manager Enhanced
Alternativa piu leggera, meno opzioni ma piu veloce. Buona per siti dove serve solo tweakare i ruoli esistenti senza creare architetture complesse.
Link: wordpress.org/plugins/capability-manager-enhanced
Best practice di sicurezza per ruoli e permessi
1. Mai dare Administrator al cliente
Questa e la regola piu importante. Il cliente paga per il sito, ma questo non significa che debba avere accesso completo. Un cliente con ruolo Administrator puo:
- Installare plugin insicuri o incompatibili
- Disattivare plugin di sicurezza (Wordfence, iThemes Security)
- Cambiare tema e rompere il layout
- Modificare file PHP via editor del tema (rischiando fatal error)
- Cambiare URL e permalink (rompendo SEO e redirect)
Nella nostra esperienza, oltre il 60% dei siti compromessi che ci arrivano per ripristino hanno un cliente con ruolo Administrator che ha installato un plugin nulled o disattivato la sicurezza.
2. Disabilitare l’editor di file di WordPress
Anche con ruoli limitati, e buona pratica disabilitare l’editor di temi e plugin dal backend. Una riga in wp-config.php:
// wp-config.php
define( 'DISALLOW_FILE_EDIT', true );
Questo rimuove la capability edit_files, edit_themes e edit_plugins per tutti gli utenti, incluso Administrator. Il codice si modifica via FTP/SFTP o Git, non dal browser.
3. Disabilitare l’installazione di plugin/temi
// wp-config.php
define( 'DISALLOW_FILE_MODS', true );
Questo blocca install_plugins, install_themes, update_plugins, update_themes e update_core. Utile per siti in produzione dove gli aggiornamenti sono gestiti dal processo CI/CD dell’agenzia. Attenzione: disabilita anche gli aggiornamenti automatici di sicurezza. Usalo solo se hai un processo di aggiornamento gestito.
4. Audit periodico dei ruoli utente
Ogni 3 mesi, controlla chi ha accesso e a che livello. Con WP-CLI e un comando solo:
# Lista tutti gli Administrator su tutti i siti (Multisite)
wp user list --role=administrator --fields=user_login,user_email,display_name --format=table
# Lista tutti gli utenti con capability edit_files (potenziale rischio)
wp cap list administrator --fields=name | grep edit_files
# Esporta report completo utenti/ruoli
wp user list --fields=user_login,user_email,roles,registered --format=csv > audit-utenti-$(date +%Y%m%d).csv
Per un’agenzia che gestisce molti siti, automatizzare questo report con un cron mensile e fondamentale. AgencyPilot lo fa in automatico e invia il report via email o Slack.
Gestione utenti su scala: automazione con WP-CLI
Quando gestisci decine di siti, la gestione manuale via dashboard non e praticabile. WP-CLI diventa essenziale. Ecco i comandi che usiamo piu spesso nella nostra agenzia.
Operazioni batch su tutti i siti
# Aggiorna il ruolo di un utente su TUTTI i siti (Multisite)
wp user list --field=ID | xargs -I {} wp user set-role {} editor --url=$(wp site list --field=url)
# Crea utente su tutti i siti della rete
wp user create newdev@agency.it newdev --role=developer --porcelain
# Rimuovi un utente da tutti i siti eccetto il principale
for site in $(wp site list --field=url --skip-comments); do
wp user delete olddev@agency.it --reassign=1 --url=$site
done
Sincronizzazione utenti tra siti
In Multisite, gli utenti sono condivisi a livello di rete. Quando un utente viene creato, e disponibile su tutti i siti. Ma il ruolo e per-sito. Per assegnare lo stesso ruolo su tutti i siti:
# Assegna ruolo Editor a mario@cliente.it su tutti i siti
wp site list --field=url | while read site; do
wp user set-role mario@cliente.it editor --url=$site
done
# Verifica
wp site list --field=url | while read site; do
echo -n "$site: "
wp user get mario@cliente.it --field=roles --url=$site
done
Capability critiche da verificare sempre
Ci sono capability che spesso vengono assegnate per sbaglio o che sfuggono ai controlli. Ecco le piu pericolose quando sono in mani sbagliate.
| Capability | Pericolosa perche | Chi dovrebbe averla |
|---|---|---|
unfiltered_html |
Permette di inserire qualsiasi HTML, inclusi script e iframe. Rischio XSS | Solo Administrator fidati. Mai a Editor obelow |
edit_files |
Permette di modificare file PHP del tema/plugin via browser. Rischio fatal error o backdoor | Nessuno se DISALLOW_FILE_EDIT e attivo |
install_plugins |
Permette di installare qualsiasi plugin, inclusi quelli nulled o con vulnerabilita note | Solo Administrator o Super Admin dell’agenzia |
manage_options |
Accesso a tutte le impostazioni del sito. Puo cambiare URL, permalink, privacy, lettura | Solo Administrator dell’agenzia |
export |
Permette di esportare tutto il contenuto (XML). Rischio data leak | Administrator dell’agenzia. Mai al cliente |
delete_site |
In Multisite, permette di eliminare un sito della rete. Operazione irreversibile | Solo Super Admin |
Integrazione con AgencyPilot
AgencyPilot include un modulo di gestione utenti che si integra con i ruoli WordPress. Per ogni sito gestito, puoi:
- Visualizzare tutti gli utenti e i loro ruoli in un unico pannello
- Ricevere alert quando viene creato un nuovo utente Administrator
- Verificare che nessun utente abbia capability vietate (edit_files, install_plugins)
- Generare report mensili con l’elenco completo utenti e permessi
- Applicare policy di ruolo standard su tutti i siti con un click
Questo elimina la necessita di accedere singolarmente a ogni dashboard WordPress per verificare chi ha accesso. Il modulo monitora anche i cambiamenti di ruolo in tempo reale tramite le webhook di WordPress.
FAQ — Ruoli e permessi WordPress per agenzie
Qual e la differenza tra ruolo e capability in WordPress?
Una capability e un permesso singolo (es. edit_posts). Un ruolo e un insieme di capability. WordPress assegna ruoli, non capability singole, agli utenti. Ma e possibile assegnare capability extra a un utente specifico con $user->add_cap().
Posso creare un ruolo personalizzato senza scrivere codice?
Si. Plugin come Members e User Role Editor permettono di creare ruoli custom da interfaccia, selezionando le capability da una lista. Il risultato e identico a scrivere PHP, ma piu rapido per chi non sviluppa.
Come rimuovo un ruolo custom che non serve piu?
remove_role( 'cliente_editor' );
Aggiungi questa riga in functions.php, ricarica il sito, poi rimuovi la riga. Gli utenti che avevano quel ruolo tornano senza ruolo (e perdono l’accesso). Assegna loro un nuovo ruolo prima di rimuovere quello custom.
In Multisite, un utente puo avere ruoli diversi su siti diversi?
Si. In Multisite l’utente e unico a livello di rete, ma il ruolo e assegnato per-sito. Un utente puo essere Editor nel Sito A, Author nel Sito B, e non avere ruolo nel Sito C. Questo e gestibile da dashboard network o con WP-CLI.
Come verifico quali capability ha un ruolo specifico?
// Via PHP
$role = get_role( 'editor' );
print_r( $role->capabilities );
// Via WP-CLI
wp cap list editor --format=csv
E sicuro usare plugin nulled per gestire ruoli?
No. I plugin nulled (versioni crackate di plugin premium) sono una delle cause principali di compromissione di siti WordPress. Spesso contengono backdoor o malware. Per la gestione ruoli, i plugin gratuiti del repository ufficiale (Members, User Role Editor) sono piu che sufficienti e sono revisionati dal team di sicurezza WordPress.