Un mu-plugin di WordPress (must-use plugin) è un file PHP collocato in wp-content/mu-plugins/ che WordPress carica automaticamente a ogni richiesta. Non può essere disattivato dall’area di amministrazione e viene eseguito prima di qualsiasi plugin normale. Usalo per il codice che deve essere sempre presente: hook personalizzati, regole di sicurezza, ottimizzazioni delle prestazioni o costanti a caricamento anticipato.
Un altro caso d’uso per un mu-plugin è quello di aggiungere funzioni extra a un plugin o al core di WP. WP STAGING, ad esempio, dispone di molti filtri e hook che possono fornire ulteriori funzionalità alla feature di staging o di backup di WP STAGING. Tutti questi filtri documentati possono essere aggiunti a un mu-plugin personalizzato.
Risposta rapida: inserisci un file
.phpcon un’intestazione di plugin inwp-content/mu-plugins/. WordPress lo rileva al caricamento successivo della pagina, senza bisogno di attivarlo. Verifica in Plugin → Plugin indispensabili che sia stato caricato.
Introduzione ai must-use plugin
I mu-plugin si trovano in wp-content/mu-plugins/ (il percorso è controllato dalla costante WPMU_PLUGIN_DIR) e vengono caricati da WordPress prima di qualsiasi plugin in wp-content/plugins/. Non compaiono nell’elenco standard dei plugin e non possono essere disattivati dall’interfaccia di amministrazione.
Lo scenario più comune in cui gli sviluppatori ricorrono a un mu-plugin: hanno una funzione o un filtro che si rompe di continuo perché un altro amministratore disattiva il plugin che lo conteneva, oppure perché un aggiornamento di un plugin sovrascrive una personalizzazione. Un mu-plugin elimina entrambi i rischi in una volta sola.
La documentazione ufficiale di WordPress tratta i must-use plugin all’indirizzo wordpress.org/documentation/article/must-use-plugins/.
Come si confronta un mu-plugin con gli altri posti in cui potresti inserire lo stesso codice?
| Opzione | Caricamento automatico | Sopravvive agli aggiornamenti dei plugin | L’admin può disattivarlo | Ideale per |
|---|---|---|---|---|
| mu-plugin | Sì | Sì | No | Hook a esecuzione obbligatoria, costanti, regole di sicurezza |
| Plugin normale | Solo quando è attivo | Sì | Sì | Funzionalità opzionali controllate dal proprietario del sito |
wp-config.php |
Sì | Sì | No | Solo costanti PHP define() |
.htaccess / php.ini |
Sì (a livello di server) | Sì | No | Riscritture del server e impostazioni ini di PHP |
Vantaggi dei mu-plugin
Il vantaggio principale rispetto a un plugin normale è la resistenza alle manomissioni. Un plugin normale può essere disattivato da qualsiasi utente con ruolo di amministratore, o rimosso se una credenziale viene compromessa. Un mu-plugin no.
Usa un mu-plugin quando:
- Il codice deve essere eseguito anche se tutti i plugin normali sono disattivati (un reindirizzamento di manutenzione, un header di sicurezza, una regola HTTPS forzato)
- Stai registrando azioni e filtri di WP STAGING che devono essere caricati prima che il plugin stesso venga inizializzato
- Gestisci più siti WordPress e desideri un comportamento specifico del sito al di fuori dei plugin sotto controllo di versione
- Vuoi applicare impostazioni PHP a runtime (come
memory_limit) all’inizio del ciclo di vita della richiesta
Usa un plugin normale quando:
- La funzionalità deve poter essere attivata e disattivata dal proprietario del sito o da uno sviluppatore
- La funzionalità viene distribuita come prodotto installabile con aggiornamenti automatici
- Stai costruendo qualcosa che altri plugin rilevano tramite
is_plugin_active()
Come creare un mu-plugin di WordPress
Passo 1: accedi ai file del tuo sito
Collegati al tuo sito tramite FTP, SFTP o il file manager del tuo provider di hosting.
Passo 2: individua o crea la directory mu-plugins
Spostati in wp-content/. Cerca la cartella mu-plugins/. Se non esiste, creala. WordPress inizierà a caricare i file PHP da quella directory immediatamente, senza ulteriore configurazione.
Passo 3: crea il file del tuo plugin
Crea un nuovo file PHP, ad esempio my-mu-plugin.php. Usa lettere minuscole e trattini (niente spazi) nel nome del file. Il nome del file compare in Plugin → Plugin indispensabili nell’amministrazione di WordPress, quindi scegli un nome descrittivo.
Passo 4: aggiungi l’intestazione del plugin e il tuo codice
Ogni mu-plugin ha bisogno di un commento di intestazione del plugin in cima, esattamente come un plugin normale. Di seguito è riportata la struttura minima:
<?php
/*
Plugin Name: My Custom Mu-Plugin
Description: A custom must-use plugin to enhance my WordPress site.
Version: 1.0
Author: Mickey Mouse
*/
// Your custom code goes here
Passo 5: carica il tuo mu-plugin
Carica il file .php in wp-content/mu-plugins/ sul tuo server.
Passo 6: verifica l’attivazione
Non c’è alcun passaggio di attivazione. Visita Plugin → Plugin indispensabili nell’amministrazione di WordPress per confermare che il file è stato caricato. Se non compare, controlla che il file si trovi direttamente in mu-plugins/ (e non all’interno di una sottodirectory).
Esempio di mu-plugin: testo personalizzato per il footer admin
Ecco un esempio completo e funzionante che modifica il testo del footer mostrato in fondo a ogni schermata di amministrazione di WordPress:
<?php
/*
Plugin Name: Custom Admin Footer
Description: Changes the footer text in the WordPress admin area.
Version: 1.0
Author: Your Name
*/
add_filter('admin_footer_text', function () {
echo 'Customized by Tony Stark - Powered by WordPress';
});
Casi d’uso comuni dei mu-plugin
Questi sono gli schemi che ricorrono più spesso nei ticket di supporto di WP STAGING e nei forum per sviluppatori:
1. Forzare il logging di debug senza modificare wp-config.php
<?php
/*
Plugin Name: Enable Debug Log
*/
if ( ! defined( 'WP_DEBUG' ) ) {
define( 'WP_DEBUG', true );
}
if ( ! defined( 'WP_DEBUG_LOG' ) ) {
define( 'WP_DEBUG_LOG', true );
}
if ( ! defined( 'WP_DEBUG_DISPLAY' ) ) {
define( 'WP_DEBUG_DISPLAY', false );
}
È utile su ambienti di staging o di sviluppo in cui vuoi tenere attivo il logging senza toccare il wp-config.php di produzione. Consulta Enable WordPress Debug Log Mode per il flusso di debug completo.
2. Aumentare il limite di memoria di PHP
La direttiva ini memory_limit può essere modificata a runtime tramite ini_set(), il che rende un mu-plugin un posto pulito per applicarla prima che vengano caricati i plugin normali:
<?php
/*
Plugin Name: Increase Memory Limit
*/
@ini_set( 'memory_limit', '256M' );
Nota: alcune impostazioni PHP sono fissate a livello di server e non possono essere modificate tramite ini_set() a runtime. Un riferimento completo sulle direttive che accettano modifiche a runtime è disponibile su php.net/manual/en/ini.list.php.
3. Codice per i filtri di WP STAGING
WP STAGING espone azioni e filtri documentati per controllare il comportamento di backup e staging. Poiché devono essere caricati prima che WP STAGING stesso venga inizializzato, un mu-plugin è il posto giusto per registrarli. Colloca qualsiasi chiamata add_filter() o add_action() in un file mu-plugin e sarà sempre presente indipendentemente dall’ordine di attivazione dei plugin. Sfoglia tutti gli hook disponibili nella documentazione delle azioni e dei filtri di WP STAGING, collegata più in basso in Articoli correlati.
4. Reindirizzamento HTTPS forzato
<?php
/*
Plugin Name: Force HTTPS
*/
add_action( 'template_redirect', function () {
if ( ! is_ssl() ) {
wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 );
exit;
}
} );
5. Disattivare XML-RPC
<?php
/*
Plugin Name: Disable XML-RPC
*/
add_filter( 'xmlrpc_enabled', '__return_false' );
Limiti e insidie
Prima di scegliere un mu-plugin, vale la pena conoscere alcuni comportamenti:
Nessun hook di disattivazione o disinstallazione. WordPress non attiva mai deactivate_{plugin} o uninstall_{plugin} per i mu-plugin. Se il tuo plugin crea opzioni, tabelle personalizzate o eventi cron pianificati, devi ripulirli manualmente: elimina il file, poi rimuovi a mano i dati memorizzati.
Il caricamento da una sottodirectory richiede un file loader. WordPress carica solo i file PHP che si trovano direttamente in wp-content/mu-plugins/. Se collochi il codice in una sottodirectory (ad esempio, mu-plugins/my-plugin/my-plugin.php), WordPress non lo rileverà. Lo schema standard consiste nel creare un file loader leggero nella radice di mu-plugins/ che richiami require_once sul file all’interno della sottodirectory.
Comportamento in multisito. Su una rete multisito di WordPress, i mu-plugin vengono caricati su ogni sito a ogni richiesta. Non esiste un interruttore per singolo sito. Usa is_main_site() o get_current_blog_id() all’interno del plugin se devi limitare il comportamento a un sito specifico della rete.
Ordine di caricamento. I mu-plugin vengono caricati in ordine alfabetico crescente per nome file, prima di qualsiasi plugin in wp-content/plugins/. Se l’ordine tra i tuoi mu-plugin è importante, anteponi un prefisso ai nomi dei file: 00-runs-first.php, 10-runs-second.php.
Visibilità nell’amministrazione. I mu-plugin compaiono in Plugin → Plugin indispensabili, ma non mostrano alcun dettaglio a meno che l’intestazione del plugin non includa Plugin Name, Description e Version. Includi sempre un’intestazione; velocizza notevolmente la diagnosi quando qualcosa va storto.
Nessun meccanismo di aggiornamento. WordPress non ha alcun modo integrato per avvisarti riguardo ai mu-plugin o per aggiornarli. Se stai adattando codice di terze parti per un mu-plugin, sei tu il responsabile del monitoraggio degli aggiornamenti e della loro applicazione manuale. Per i mu-plugin sviluppati internamente questo non è un problema, ma è bene tenerlo presente se stai valutando di convertire un plugin della community in un mu-plugin.
Dove dovrebbe andare questo codice?
| Scenario | Posizione migliore |
|---|---|
Costante PHP o define() |
wp-config.php |
| Regola di riscrittura del server | .htaccess |
| Limite di memoria o di esecuzione di PHP | .htaccess (tramite php_value) o php.ini |
| Codice che usa funzioni di WordPress e deve essere sempre eseguito | mu-plugin in wp-content/mu-plugins/ |
| Funzionalità opzionale controllata dal proprietario del sito | Plugin normale in wp-content/plugins/ |
| Output o modifiche di stile specifiche del tema | functions.php del tema child |
Una regola pratica utile: se il tuo codice richiama una funzione di WordPress (add_filter, get_option, wp_redirect, ecc.), mettilo in un mu-plugin. Se si tratta di un semplice define() PHP o di una modifica che deve essere eseguita prima dell’avvio di WordPress, wp-config.php è il posto giusto.
Conclusione
Un mu-plugin è lo strumento adatto per il codice che deve essere sempre eseguito e non può rischiare di essere disattivato per errore. La configurazione richiede pochi minuti: crea wp-content/mu-plugins/, aggiungi un file .php con un’intestazione di plugin e WordPress fa il resto.
Se stai sviluppando o testando codice di un mu-plugin personalizzato, ti consigliamo di verificarlo in un ambiente di staging prima di distribuirlo in produzione. WP STAGING rende semplice clonare il tuo sito live e confermare che il mu-plugin si comporti come previsto prima che le tue modifiche vadano online.