Come creare un mu-plugin WordPress

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 .php con un’intestazione di plugin in wp-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 No Hook a esecuzione obbligatoria, costanti, regole di sicurezza
Plugin normale Solo quando è attivo Funzionalità opzionali controllate dal proprietario del sito
wp-config.php No Solo costanti PHP define()
.htaccess / php.ini Sì (a livello di server) 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
<?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
<?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.

Articoli correlati

Rene Hermenau

Autore: Rene Hermenau

Informazioni sull'autore: René Hermenau è il fondatore di WP STAGING. Si occupa di backup WordPress, staging, migrazioni, gestione dei database e flussi di deployment sicuri.