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 :
- 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…). - 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.
2. Mu-plugins vs extensions : quelles différences ?
| Extensions classiques | Extensions de snippets (WPCode, Code Snippets) | Mu-plugins | |
|---|---|---|---|
| Installation | Depuis l’interface | Depuis l’interface | En FTP dans /wp-content/mu-plugins/ |
| Activation | Oui, manuelle | Oui, manuelle | Automatique (toujours actifs) |
| Chargement | Après le thème | Après le thème | Avant le thème et les extensions |
| Mise à jour | Gérée par WordPress | Gérée par WordPress | À maintenir soi-même |
| Désactivation possible | Oui, depuis l’interface | Oui, depuis l’interface | Non (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éfautwordpress@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 fonctionantispambot(). - 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é :
- Connectez-vous à votre site en FTP ou avec le gestionnaire de fichiers cPanel.
- Dans le répertoire
wp-content/, créez un dossier nommému-plugins(s’il n’existe pas déjà). - Ajoutez-y un fichier PHP, par exemple
mon-premier-mu-plugin.php.

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.

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


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.phpplutô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.













