asset 1
asset 2
asset 3
asset 2
asset 21

MU-plugins WordPress : à quoi servent-ils et comment les utiliser ?

3 septembre 2025

Quand on débute avec WordPress, on pense souvent aux extensions classiques pour ajouter des fonctionnalités. Pourtant, il existe un autre mécanisme méconnu mais très puissant : les mu-plugins (pour must-use plugins).
Ces petits fichiers PHP permettent d’ajouter du code qui sera exécuté automatiquement par WordPress, sans que vous ayez à les activer dans l’interface d’administration. Ils sont particulièrement utiles pour appliquer des réglages qui doivent être valables en permanence, quelle que soit l’évolution de votre site ou le thème utilisé.

1. Qu’est-ce qu’un mu-plugin ?

Un mu-plugin est un fichier PHP placé dans le dossier spécial /wp-content/mu-plugins/.
Dès que WordPress détecte ce dossier, il exécute automatiquement tout fichier qui s’y trouve. Contrairement à une extension classique, il n’y a aucun bouton d’activation ou de désactivation : le simple fait qu’un fichier soit présent dans ce répertoire suffit pour qu’il soit pris en compte.

Deux points clés à retenir :

  1. Indépendance totale du thème : un mu-plugin ne dépend pas de votre fichier functions.php. Il reste actif même si vous changez de thème, ce qui le rend idéal pour des réglages globaux (sécurité, maintenance, personnalisation légère…).
  2. Chargement prioritaire : les mu-plugins sont exécutés très tôt, juste après le cœur de WordPress et avant les extensions classiques. Cela garantit qu’ils sont toujours pris en compte, quelle que soit la configuration du site.

En résumé, si vous avez besoin d’une fonctionnalité essentielle qui doit fonctionner en toutes circonstances, le mu-plugin est l’outil parfait.

Schéma détaillé du chargement des fichiers dans WordPress
Schéma détaillé du chargement des fichiers dans WordPress (cliquez sur l’image pour l’agrandir)

2. Mu-plugins vs extensions : quelles différences ?

Extensions classiquesExtensions de snippets (WPCode, Code Snippets)Mu-plugins
InstallationDepuis l’interfaceDepuis l’interfaceEn FTP dans /wp-content/mu-plugins/
ActivationOui, manuelleOui, manuelleAutomatique (toujours actifs)
ChargementAprès le thèmeAprès le thèmeAvant le thème et les extensions
Mise à jourGérée par WordPressGérée par WordPressÀ maintenir soi-même
Désactivation possibleOui, depuis l’interfaceOui, depuis l’interfaceNon (ou suppression manuelle du fichier en FTP)

Un mu-plugin peut aussi être un peu moins gourmand en ressources, puisqu’il est chargé directement par WordPress, sans surcouche d’interface, sans fonctionnalité supplémentaire ni gestion additionnelle.

3. Pourquoi utiliser des mu-plugins ?

Les mu-plugins ne sont pas faits pour tout le monde, ni pour toutes les situations. Ils répondent à un besoin précis : disposer d’un code fiable, permanent et indépendant du thème. Voici quelques cas d’usage typiques :

  • Forcer une configuration SMTP
    Beaucoup de sites envoient encore leurs emails depuis l’adresse par défaut wordpress@domaine.tld. Un mu-plugin permet de définir un serveur SMTP (par exemple votre hébergeur), afin d’assurer une meilleure délivrabilité des messages.
  • Protéger les adresses email
    Pour éviter que les robots spammeurs ne récoltent vos adresses publiées en clair sur le site, un mu-plugin peut automatiquement encoder les emails avec la fonction antispambot().
  • Nettoyer les noms de fichiers téléversés
    Lorsqu’un utilisateur téléverse une image avec des accents ou des espaces, cela peut poser problème. Un mu-plugin peut forcer la “sanitisation” (remplacement des caractères spéciaux) des noms de fichiers.
  • Assurer une sécurité ou une maintenance minimale
    Vous pouvez par exemple ajouter un mu-plugin qui désactive l’éditeur de fichiers depuis l’administration, ou qui force certaines options de sécurité définies dans le fichier wp-config.php.

En bref : si vous avez une règle qui doit être respectée quoi qu’il arrive (même en cas de changement de thème ou de désactivation accidentelle d’une extension), le mu-plugin est la meilleure solution.

4. Créer un mu-plugin : premiers pas

Pour utiliser un mu-plugin, il faut d’abord créer un dossier dédié :

  1. Connectez-vous à votre site en FTP ou avec le gestionnaire de fichiers cPanel.
  2. Dans le répertoire wp-content/, créez un dossier nommé mu-plugins (s’il n’existe pas déjà).
  3. Ajoutez-y un fichier PHP, par exemple mon-premier-mu-plugin.php.
Répertoire des mu-plugins dans le gestionnaire de fichiers
Le répertoire des mu-plugins dans le gestionnaire de fichiers o2switch

Un premier exemple de mu-plugin :

Objectif : afficher un message de bienvenue dans le tableau de bord.

<?php
if ( ! defined('ABSPATH') ) exit;
/*
Plugin Name: Mon premier mu-plugin
Description: Affiche un message de bienvenue dans le Tableau de bord pour vérifier que le MU-plugin est actif.
Author: Votre Nom
*/

/**
 * Affiche un message uniquement sur le Tableau de bord (accueil de l’admin).
 * - Hook : admin_notices (déclenché sur la plupart des écrans d’administration)
 * - Filtrage : via get_current_screen() pour ne viser que le dashboard
 */
add_action('admin_notices', function () {
    // Sécurité : on ne fait rien si l’utilisateur n’est pas connecté
    if ( ! is_user_logged_in() ) {
        return;
    }

    // Récupère l’écran courant (exemples : 'dashboard', 'edit-post', etc.)
    if ( ! function_exists('get_current_screen') ) {
        return;
    }
    $screen = get_current_screen();

    // Ne rien afficher si on n’est pas sur la page d’accueil de l’admin
    // - 'dashboard'          = Tableau de bord du site
    // - 'dashboard-network'  = Tableau de bord réseau (multisite)
    if ( ! $screen || ( $screen->id !== 'dashboard' && $screen->id !== 'dashboard-network' ) ) {
        return;
    }

    // Construit un nom convivial : Prénom Nom > Nom d’affichage > Identifiant
    $user  = wp_get_current_user();
    $first = trim( get_user_meta( $user->ID, 'first_name', true ) );
    $last  = trim( get_user_meta( $user->ID, 'last_name',  true ) );

    if ( $first || $last ) {
        $name = trim("$first $last");
    } elseif ( ! empty( $user->display_name ) ) {
        $name = $user->display_name;
    } else {
        $name = $user->user_login;
    }

    // Astuce : personnalisez le message ci-dessous selon votre projet
    $message = sprintf('👋 Bonjour %s, votre MU-plugin est bien actif.', $name);

    // Affiche un bandeau « succès » WordPress, repliable
    printf(
        '<div class="notice notice-success is-dismissible"><p>%s</p></div>',
        esc_html( $message )
    );
});

Petit rappel utile : si rien n’apparaît côté “Prénom – Nom”, vérifiez que Prénom et/ou Nom sont renseignés dans votre profil utilisateur (Comptes › Profil). Sinon, le mu-plugin affichera votre identifiant de connexion.

premier mu-plugin
Affichage du tableau de bord après avoir ajouté le mu-plugin. Le message ne s’affichera que dans votre tableau de bord.

Attention, pas de sous-dossiers : contrairement aux extensions classiques, WordPress ne charge pas automatiquement les fichiers présents dans un sous-dossier de mu-plugins/. Pour qu’un mu-plugin soit pris en compte, il doit se trouver à la racine du dossier.

Dès que ce fichier est présent dans /wp-content/mu-plugins/, WordPress l’exécute automatiquement. Vous pouvez renommer le mu-plugin autant de fois que vous le voulez, cela n’a aucun impact. Si vous ne voyez pas l’effet immédiatement, videz le cache.

Désactiver temporairement un mu-plugin : renommez le fichier en .php.disabled (ou déplacez-le hors de mu-plugins/) pour le désactiver ponctuellement.

5. Exemples pratiques de mu-plugins utiles

5.1. Sanitize : nettoyer les noms de fichiers téléversés

Objectif : éviter les accents, espaces et caractères spéciaux dans les médias.

<?php
if ( ! defined('ABSPATH') ) exit;
/*
Plugin Name: EM – Sanitize filenames
Description: Nettoie les noms de fichiers uploadés (accents, espaces, caractères spéciaux).
Author: Votre Nom
*/


// Nettoie et simplifie les noms de fichiers uploadés
add_filter('sanitize_file_name', function ($filename) {
$filename = remove_accents($filename);
$filename = preg_replace('/[^A-Za-z0-9\.\-\_]+/', '-', $filename);
$filename = preg_replace('/-+/', '-', $filename);
return strtolower(trim($filename, '-'));
}, 10, 1);

À noter : certaines extensions proposent déjà cette fonctionnalité. Avoir deux systèmes de nettoyage n’est pas “grave”, mais cela peut être inutilement redondant et légèrement plus gourmand en ressources.

5.2. Antispambot : protéger les adresses e-mail affichées

Objectif : encoder automatiquement les e-mails dans le contenu pour (essayer) de limiter leur collecte par les robots.

<?php
if ( ! defined('ABSPATH') ) exit;
/*
Plugin Name: EM – Antispambot content
Description: Encode automatiquement les adresses e-mail dans le contenu.
Author: Votre Nom
*/


// Encode les adresses e-mail affichées pour limiter leur collecte
function em_antispambot_replace_emails($content) {
$pattern = '/[A-Z0-9._%+\-]+@[A-Z0-9.\-]+\.[A-Z]{2,}/i';
return preg_replace_callback($pattern, function ($m) {
return antispambot($m[0]);
}, $content);
}


add_filter('the_content', 'em_antispambot_replace_emails', 20);

5.3. SMTP : forcer un serveur d’envoi d’e-mails

Objectif : améliorer la délivrabilité et éviter l’expéditeur par défaut wordpress@domaine.tld. Je prends comme exemple un e-mail créé chez o2switch.

<?php
if ( ! defined('ABSPATH') ) exit;
/*
Plugin Name: EM – SMTP enforce
Description: Force un serveur SMTP via phpmailer_init.
Author: Votre Nom
*/

/**
 * Configure PHPMailer à partir de constantes définies dans wp-config.php
 * Notes :
 * - 587 => STARTTLS  => 'tls'
 * - 465 => SSL implicite => 'ssl'
 * - On évite de planter si certaines constantes manquent.
 */
add_action('phpmailer_init', function ($phpmailer) {

    // Vérifie le minimum vital
    if ( ! defined('SMTP_HOST') || ! defined('SMTP_USER') || ! defined('SMTP_PASS') ) {
        return; // Sortie silencieuse si config incomplète
    }

    // Valeurs par défaut
    $host   = SMTP_HOST;
    $port   = defined('SMTP_PORT')   ? (int) SMTP_PORT   : 587;
    $secure = defined('SMTP_SECURE') ? strtolower(SMTP_SECURE) : 'tls';

    // Normalisation simple port <-> secure pour éviter les confusions fréquentes
    //  - 465 utilise 'ssl'
    //  - 587 utilise 'tls'
    if ($port === 465 && $secure !== 'ssl') {
        $secure = 'ssl';
    } elseif ($port === 587 && $secure === 'ssl') {
        $secure = 'tls';
    }

    // Configuration PHPMailer
    $phpmailer->isSMTP();
    $phpmailer->Host        = $host;
    $phpmailer->Port        = $port;
    $phpmailer->SMTPAuth    = true;
    $phpmailer->Username    = SMTP_USER;
    $phpmailer->Password    = SMTP_PASS;
    $phpmailer->SMTPSecure  = $secure;           // 'ssl' ou 'tls'
    $phpmailer->SMTPAutoTLS = true;              // Active STARTTLS si possible
    $phpmailer->CharSet     = 'UTF-8';

    // Adresse d’expéditeur (facultatif mais recommandé)
    if ( defined('SMTP_FROM') ) {
        $from_name = defined('SMTP_FROM_NAME') ? SMTP_FROM_NAME : '';
        $phpmailer->setFrom( SMTP_FROM, $from_name );
    }
});

Et dans le fichier wp-config.php (jamais dans le mu-plugin pour des raisons de sécurité) :

// Hôte SMTP (o2switch / cPanel : mail.votredomaine.tld)
define('SMTP_HOST', 'mail.eric-redacteur.fr');

// Choisissez UNE des deux options ci-dessous :

// Option A (recommandée) : STARTTLS sur 587
define('SMTP_PORT', 587);
define('SMTP_SECURE', 'tls');

// Option B : SSL implicite sur 465
// define('SMTP_PORT', 465);
// define('SMTP_SECURE', 'ssl');

// Identifiants de la boîte
define('SMTP_USER', 'bonjour@eric-redacteur.fr');
define('SMTP_PASS', 'mot-de-passe-TRES-solide');

// Expéditeur par défaut (facultatif)
define('SMTP_FROM', 'bonjour@eric-redacteur.fr');
define('SMTP_FROM_NAME', 'Eric Martin');

Sécurité : stocker ces informations sensibles dans wp-config.php permet de limiter les risques (sauvegardes, dépôt Git, etc.).

Et pour la délivrabilité, pensez aussi à SPF/DKIM/DMARC côté DNS : le protocole SMTP chiffré ne suffit pas à lui seul.

5.4. Désactiver l’éditeur de fichiers depuis l’admin

Objectif : désactiver la possibilité d’éditer des fichiers depuis l’interface d’administration de WordPress. Attention, je ne parle pas de l’éditeur du thème (Thème FSE) mais de celui qui permet d’éditer functions.php ou style.css par exemple.

<?php
if ( ! defined('ABSPATH') ) exit;
/*
Plugin Name: EM – Désactiver l’éditeur de fichiers
Description: Bloque l’édition de fichiers depuis l’administration WordPress.
Author: Votre Nom
*/


// Empêche toute modification de fichiers depuis l’administration
if ( ! defined('DISALLOW_FILE_EDIT') ) {
define('DISALLOW_FILE_EDIT', true);
}

5.5. Personnaliser l’écran de connexion

Objectif : ajouter une touche de personnalisation au formulaire de connexion WordPress.

<?php
if ( ! defined('ABSPATH') ) exit;
/*
Plugin Name: EM - Login branding
Description: Personnalise le logo de la page de connexion WordPress.
Author: Votre Nom
*/


// Ajoute un logo personnalisé à l'écran de connexion
add_action('login_head', function() {
    echo '<style>
    /* Styles CSS à adapter selon votre projet */
        body.login h1 a {
            /* logo.svg à placer à la racine de votre site */
            background-image: url("https://example.com/logo.svg");
            display: block;
            margin: 0 auto;
            width: 100%;
            height: auto;
            /* Largeur max en responsive */
            max-width: 320px;
            /* Préserve les proportions - Ratio à adapter selon votre logo (ou à supprimer) */
            aspect-ratio: 100 / 75;
            background-size: contain;
            background-repeat: no-repeat;
        }
    </style>';
});

Avantage : cette personnalisation reste active même si vous changez de thème, car le mu-plugin est indépendant de celui-ci.

Rendu avant/après de la personnalisation de l’écran de connexion

Écran de connexion avant
Écran de connexion avant
Écran de connexion après
Écran de connexion après

Ces exemples montrent bien que les mu-plugins servent à mettre en place des règles permanentes et globales. Certains sont techniques (SMTP), d’autres plus visuels (login), mais tous ont en commun d’être actifs en toutes circonstances.

6. Bonnes pratiques et limites

Les mu-plugins sont puissants, mais ils demandent rigueur. Avant de vous lancer, gardez en tête quelques conseils essentiels :

  • Toujours protéger vos fichiers avec if ( ! defined('ABSPATH') ) exit;.
  • Commentez votre code : un mu-plugin est toujours actif. Si vous revenez dessus plusieurs mois plus tard (ou si un autre administrateur prend le relais), des commentaires clairs éviteront bien des incompréhensions.
  • Évitez les doublons : si une extension ou un autre snippet fait déjà la même chose (ex. nettoyage des fichiers uploadés), inutile de le répéter dans un mu-plugin. Cela ne cassera pas le site, mais peut entraîner une perte de lisibilité et un peu de consommation de ressources en plus.
  • Centralisez les réglages sensibles : pour tout ce qui est identifiants (SMTP, API, etc.), privilégiez le fichier wp-config.php plutôt que de les écrire directement dans un mu-plugin. Vous limitez ainsi les risques de fuite (sauvegardes, versionnage Git, etc.).
  • Testez en environnement de préproduction : un mu-plugin mal écrit peut bloquer le site dès son chargement. Avant de l’ajouter en production, testez-le sur un environnement de staging.
  • Ne multipliez pas les fichiers inutilement : pour plus de clarté, vous pouvez regrouper plusieurs petites fonctions dans un seul fichier “boîte à outils”. À l’inverse, pour des fonctionnalités plus conséquentes, mieux vaut séparer.
  • Pas de mise à jour automatique : contrairement aux extensions classiques, les mu-plugins ne sont pas suivis par WordPress.org. C’est à vous d’en assurer la maintenance.

Conclusion

Les mu-plugins font partie de ces outils un peu cachés de WordPress, mais redoutablement efficaces dès qu’il s’agit d’appliquer des règles globales. Indépendants du thème, chargés avant les extensions et toujours actifs, ils assurent que vos réglages critiques restent en place quoi qu’il arrive.

Ils ne sont pas forcément adaptés à tous les projets. Pour la plupart des besoins, une extension classique ou un gestionnaire de snippets suffira amplement, mais pour certaines fonctionnalités essentielles (SMTP, sécurité, personnalisation globale), les mu-plugins apportent une solution simple, fiable et durable.

Même si vous n’en aurez pas besoin tous les jours, expérimenter un mu-plugin simple est une excellente façon de mieux comprendre comment WordPress fonctionne en profondeur. Si vous souhaitez pousser plus loin vos explorations techniques, nous vous conseillons de prendre le temps de tester sur un environnement de préproduction, avant de déployer en production.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *