
🚫 Comment désactiver sélectivement les plugins WordPress sur des pages et articles spécifiques
Chaque extension WordPress ajoute du code PHP qui s’exécute au chargement de la page, charge des scripts et des styles, et effectue parfois des requêtes supplémentaires en base de données. Plus vous avez d’extensions, plus vos pages deviennent lourdes. Mais le problème n’est pas seulement une question de quantité: même une seule extension «bavarde» comme Contact Form 7 charge ses fichiers .css et .js sur chaque page par défaut, y compris les pages où aucun formulaire n’existe.
Les développeurs de CF7 reconnaissent ouvertement que l’extension charge ses ressources partout parce que le shortcode peut apparaître n’importe où. Cette logique n’est pas propre à CF7; la plupart des extensions fonctionnent de la même manière. Résultat: la page d’accueil de votre blog charge les scripts d’un slider de galerie qui ne s’y est jamais trouvé.
La bonne nouvelle: WordPress vous permet de désactiver sélectivement le chargement des extensions uniquement sur les pages où elles sont réellement nécessaires. Nous allons couvrir les deux approches: programmatique (en utilisant un mu-plugin avec le filtre option_active_plugins) et via des extensions (Plugin Organizer, Perfmatters, Plugin Load Filter). À la fin, nous mesurerons les résultats à l’aide du moniteur réseau du navigateur.
💡 Aperçu rapide:
- Choisissez vos extensions selon trois critères: la réputation du développeur, la performance en charge et la nécessité réelle
- Approche programmatique: écrivez un extrait PHP qui utilise
get_option('active_plugins')pour obtenir la liste des extensions actives et les filtre en fonction de l’URL de la page - Mu-plugin: placez le filtre dans
/wp-content/mu-plugins/afin qu’il s’exécute AVANT toutes les extensions classiques, désactivant à la volée celles qui sont inutiles - Approche par extension: Plugin Organizer et Perfmatters offrent une interface visuelle pour les mêmes tâches sans écrire une seule ligne de code
- Mesurez l’effet avec les Chrome/Firefox DevTools: après filtrage, les requêtes HTTP diminuent et le temps de chargement baisse de façon notable
Trois règles pour choisir ses extensions
Avant de filtrer le chargement des extensions, assurez-vous que celles présentes sur votre site méritent vraiment leur place dans wp_options. Trois règles qui vous épargnent des maux de tête et des ressources serveur.
Installez uniquement des extensions vérifiées, issues de développeurs ayant fait leurs preuves. Ouvrez la page de l’extension sur WordPress.org et vérifiez: le nombre d’installations actives, la note, la date de la dernière mise à jour et le nombre de tickets de support résolus. Une extension avec plus de 100 000 installations, une note supérieure à 4,5 et une mise à jour dans les 3 derniers mois est un choix sûr.

Privilégiez les extensions qui montent en charge. Deux extensions aux fonctionnalités identiques peuvent affecter la vitesse différemment. Comparez les candidates à l’aide de l’inspecteur du navigateur (onglet Réseau) ou de services en ligne comme Google PageSpeed Insights, Pingdom et GTmetrix; mesurez le temps de chargement et le nombre de requêtes HTTP avant et après installation.
Ne conservez pas de poids mort. Chaque extension inutilisée signifie du code PHP supplémentaire à chaque requête. Auditez régulièrement votre liste d’extensions actives et supprimez celles dont votre site peut se passer. Si une extension «pourrait servir dans six mois», désactivez-la et supprimez-la, puis installez une version fraîche dans six mois.
Exemple concret: Contact Form 7
Contact Form 7 est le sujet de test parfait. Il ajoute à chaque page:
style.csspour les styles du formulairescripts.jspour la logique de validation et d’envoi
Même si une page ne contient aucun shortcode [contact-form-7], les deux fichiers se chargent fidèlement. La capture d’écran ci-dessous montre le panneau Réseau des Chrome DevTools, qui ne ment pas:

La solution: soit modifier la logique de chargement à l’intérieur de l’extension (ce qui cassera à la mise à jour), soit désactiver sélectivement l’extension pour toutes les pages sauf celle dont vous avez besoin. La seconde approche est plus fiable, concentrons-nous donc sur celle-ci.
Étape 1. Obtenir la liste des extensions actives via PHP
Avant de filtrer, vous devez comprendre où WordPress stocke la liste des extensions actives. Elles se trouvent toutes dans la table wp_options, dans la ligne dont la clé est active_plugins. Vous pouvez récupérer le tableau avec une simple fonction get_option.
Ajoutez ce code à l’extension Code Snippets ou à votre propre fichier d’extension (n’oubliez pas l’en-tête de l’extension en haut):
1 <?php 2 /** 3 * Plugin Name: Active Plugins Lister 4 */ 5 6 add_shortcode( 'activeplugins', function() { 7 $active_plugins = get_option( 'active_plugins' ); 8 $plugins = ""; 9 if ( count( $active_plugins ) > 0 ) { 10 $plugins = "<ul>"; 11 foreach ( $active_plugins as $plugin ) { 12 $plugins .= "<li>" . $plugin . "</li>"; 13 } 14 $plugins .= "</ul>"; 15 } 16 return $plugins; 17 } );
Enregistrez le fichier sous le nom active-plugins.php et téléversez-le dans /wp-content/plugins/. Créez une page de test, insérez le shortcode [activeplugins], et vous obtiendrez une liste numérotée de tous les plugins actifs au format folder/file.php.

Voici le résultat après insertion du shortcode sur une page:

Étape 2. Le filtre option_active_plugins: votre outil principal
Passons maintenant à l'outil principal: le filtre option_active_plugins. Il appartient à la famille de filtres option_$option_name et se déclenche chaque fois que WordPress récupère une valeur d'option depuis la base de données. Comme les plugins actifs sont stockés dans l'option active_plugins, ce filtre vous permet de modifier le tableau à la volée: supprimer des plugins indésirables ou en ajouter de nouveaux.
Voici un exemple minimal qui active programmatiquement Advanced Custom Fields (en supposant que le plugin est déjà installé):
1 add_filter( 'option_active_plugins', function( $plugins ) { 2 $myplugin = "advanced-custom-fields/acf.php"; 3 if ( ! in_array( $myplugin, $plugins ) ) { 4 $plugins[] = $myplugin; 5 } 6 return $plugins; 7 } );
Ce code ajoute ACF à la liste des plugins actifs sur chaque page. Ce n'est pas particulièrement pratique, mais le principe est clair: vous pouvez modifier le tableau $plugins comme bon vous semble.
Remarque importante: le filtre doit s'exécuter avant les plugins classiques, sinon WordPress lira d'abord la liste non filtrée. C'est précisément à cela que servent les mu-plugins.
Étape 3. Créer un mu-plugin pour une désactivation sélective
Les plugins must-use se trouvent dans /wp-content/mu-plugins/ et s'exécutent avant tous les plugins classiques. C'est exactement ce dont nous avons besoin: notre filtre prend le contrôle en premier.
Il y a un hic: les balises conditionnelles de WordPress (is_page(), is_single(), et autres) ne fonctionnent pas dans les mu-plugins car la requête n'a pas encore été analysée, elles renvoient donc toutes false. Vous devez analyser l'URL manuellement via $_SERVER['REQUEST_URI'].
Voici un mu-plugin prêt à l'emploi qui désactive Contact Form 7 sur toutes les pages sauf /contact/:
1 $request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ); 2 $is_admin = strpos( $request_uri, '/wp-admin/' ); 3 4 if ( false === $is_admin ) { 5 add_filter( 'option_active_plugins', function( $plugins ) { 6 global $request_uri; 7 8 $is_contact_page = strpos( $request_uri, '/contact/' ); 9 $myplugin = "contact-form-7/wp-contact-form-7.php"; 10 $k = array_search( $myplugin, $plugins ); 11 12 if ( false !== $k && false === $is_contact_page ) { 13 unset( $plugins[ $k ] ); 14 } 15 16 return $plugins; 17 } ); 18 }
Détaillons-le ligne par ligne:
parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH )extrait le chemin de la requête (par exemple,/blog/kak-otkljuchit-plaginy/)strpos( $request_uri, '/wp-admin/' )vérifie si nous sommes dans l'administration; si c'est le cas, le filtre ne s'applique pas, ce qui permet de garder les pages de réglages des plugins accessiblesarray_search( $myplugin, $plugins )trouve CF7 dans le tableau des plugins actifsunset( $plugins[ $k ] )supprime le plugin de la liste si nous ne sommes PAS sur la page de contact
Enregistrez le fichier, téléversez-le dans /wp-content/mu-plugins/, et videz le cache. Désormais, le shortcode [activeplugins] devrait afficher Contact Form 7 uniquement sur la page /contact/.
Voici à quoi ressemble le même principe appliqué à plusieurs plugins simultanément. Au lieu d'utiliser array_search avec un seul plugin, utilisez un tableau et array_diff:
1 $request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ); 2 $is_admin = strpos( $request_uri, '/wp-admin/' ); 3 4 if ( false === $is_admin ) { 5 add_filter( 'option_active_plugins', function( $plugins ) { 6 global $request_uri; 7 8 $is_contact_page = strpos( $request_uri, '/contact/' ); 9 $myplugins = array( 10 "contact-form-7/wp-contact-form-7.php", 11 "code-snippets/code-snippets.php", 12 "query-monitor/query-monitor.php", 13 "autoptimize/autoptimize.php" 14 ); 15 16 if ( false === $is_contact_page ) { 17 $plugins = array_diff( $plugins, $myplugins ); 18 } 19 20 return $plugins; 21 } ); 22 }
La fonction array_diff renvoie les valeurs du premier tableau qui ne sont pas dans le second, exactement ce qu'il vous faut pour une désactivation groupée.
Le résultat est immédiatement visible dans le panneau Réseau: le fichier script.js de Contact Form 7 disparaît de la liste des ressources sur toutes les pages sauf la page de contact.

L'approche programmatique est flexible mais nécessite des modifications de code pour chaque nouveau plugin. Pour ceux qui préfèrent une interface visuelle, il existe des plugins de filtrage prêts à l'emploi.
Approche par plugins: filtrer sans coder
Plugin Load Filter
Plugin Load Filter est un outil gratuit qui permet de filtrer les plugins selon plusieurs conditions. Il prend en charge:
- le filtrage par type de publication (articles, pages, types de publication personnalisés)
- le filtrage par format de publication
- les exceptions pour les modules Jetpack
- le filtrage d’URL pour les requêtes REST API, Heartbeat, AJAX et AMP

Paramètres d’activation du filtre par type de page:

Après activation, l’administrateur configure les pages concernées par le filtre via l’onglet «Filter Activation by Page Type». Minimaliste et efficace.
Plugin Organizer
Plugin Organizer est un vétéran des plugins de filtrage, noté 5 étoiles. Il vous donne un contrôle total sur le chargement:
- désactivation sélective des plugins par URL de page
- désactivation par rôle utilisateur
- groupes de plugins (activation/désactivation groupée)
- modification de l’ordre de chargement des plugins

Sur la page «Global Plugins», vous pouvez glisser-déposer pour désactiver globalement un plugin sur l’ensemble du site et le réactiver sélectivement sur des pages spécifiques via une metabox dans l’éditeur d’article. Dans la capture ci-dessous, Contact Form 7 est désactivé globalement:

Et voici cette même metabox sur l’écran d’édition de la page contact, qui prend le pas sur les réglages globaux:

Plugin Organizer affiche également des informations de débogage: quels plugins ont effectivement été chargés sur chaque page et pourquoi. Une documentation est disponible sur le site du développeur.
Perfmatters
Perfmatters est un outil premium développé par l’équipe de Kinsta. Sa fonctionnalité phare, Script Manager, regroupe tous les scripts et styles par nom de plugin ou de thème.

Vous pouvez désactiver entièrement un plugin ou supprimer de manière sélective certains fichiers CSS/JS qu’il contient. Pour les sites dont la structure d’URL est complexe, il existe une désactivation de scripts par expressions régulières.
Trois scénarios où Perfmatters apporte des gains immédiats:
- Plugins de réseaux sociaux (boutons de partage): désactivés partout sauf sur les articles de blog
- Contact Form 7: désactivé partout sauf sur la page du formulaire
- Styles de l’éditeur de blocs Gutenberg (
block-library/style.min.cssettheme.min.css): supprimés pour les sites utilisant l’éditeur classique
Lors d’un test indépendant sur woorkup.com, la désactivation des scripts superflus via Perfmatters a réduit le temps de chargement total de 20,2%, fait passer le nombre de requêtes HTTP sur la page d’accueil de 46 à 30, et la taille de la page de 506,3 Ko à 451,6 Ko.

Perfmatters est un plugin payant, ce qui se justifie pour les sites où la vitesse a un impact direct sur la conversion. Pour un petit blog, Plugin Organizer ou un mu-plugin programmatique suffiront.
Mesurer les résultats avec le moniteur réseau du navigateur
Optimiser sans mesurer, c’est travailler à l’aveugle. Les DevTools du navigateur vous donnent une image précise de l’avant/après sans recourir à des services tiers. N’importe quel navigateur moderne fait l’affaire:
Sur une installation WordPress de test avec 18 plugins actifs, nous avons mesuré la vitesse de la page avant filtrage (cache vide, moniteur réseau de Firefox):

Résultat: 255,19 Ko, temps de chargement 1,24 seconde, 12 requêtes.
Après avoir installé Plugin Organizer et désactivé globalement Contact Form 7, le graphique en secteurs a évolué:

Métriques: 104,21 Ko, temps de chargement 0,80 seconde, 8 requêtes.
Enfin, nous avons désactivé tous les plugins inutilisés:

Résultat final: 101,98 Ko, temps de chargement 0,46 seconde, 8 requêtes.
En comparant les extrêmes: le poids des ressources a baissé de plus de moitié (de 255 à 102 Ko), le temps de chargement est passé de 1,24 à 0,46 seconde et le nombre de requêtes HTTP de 12 à 8. Les chiffres parlent d'eux-mêmes: la désactivation sélective des extensions apporte des gains de vitesse mesurables, même sur un petit site, et la dégradation du TTFB et du LCP impacte directement le référencement.
⁉️🤔 Foire aux questions
Un mu-plugin est-il obligatoire, ou puis-je laisser le code dans une extension classique?
Vous pouvez utiliser une extension classique, mais l'ordre de chargement risque de tout compromettre. Si votre filtre
option_active_pluginss'exécute après que WordPress a déjà lu la liste des extensions actives, cela ne fonctionnera pas. Un mu-plugin est le seul moyen de garantir que votre filtre prend la main avant toutes les autres extensions. Dans une extension classique, vous dépendez de l'ordre alphabétique ou de hooks qui peuvent changer après la mise à jour d'une autre extension.
Que faire si je ne peux pas créer le dossier mu-plugins sur mon hébergement?
Vous pouvez créer le dossier
/wp-content/mu-plugins/via FTP, le gestionnaire de fichiers de votre hébergement ou WP-CLI avec la commandewp scaffold mu-plugin. Si vous n'avez aucun accès au système de fichiers, utilisez Plugin Organizer: il fait la même chose via son propre mécanisme de filtrage et ne nécessite pas de modifier les fichiers sur le serveur. La plupart des hébergeurs donnent accès à wp-content via un gestionnaire de fichiers dans le panneau de contrôle. Permissions du dossier: 0755.
Désactiver une extension via le filtre affecte-t-il ses réglages?
Non, les réglages des extensions sont stockés dans la base de données (table
wp_options) et restent intacts. Vous empêchez simplement WordPress de charger le code de l'extension lors du traitement d'une requête spécifique. Tous les réglages restent en place, et lors de la requête suivante où l'extension n'est pas filtrée, elle se charge avec toutes ses fonctionnalités. La désactivation viaoption_active_pluginsbloque le chargement du code à la volée, ce n'est pas une désactivation. Dans l'administration, l'extension reste active, ses réglages ne sont pas touchés et les tâches planifiées (WP-Cron) continuent de fonctionner.
Comment vérifier que le filtre fonctionne réellement?
La méthode la plus visuelle est le panneau Réseau des Chrome DevTools (F12 → Réseau). Ouvrez-le sur une page où l'extension doit être désactivée, actualisez en maintenant Ctrl enfoncée (vidage du cache) et cherchez le nom de l'extension ou son fichier CSS/JS. Si aucune requête n'apparaît, le filtre fonctionne. Des extensions comme Query Monitor affichent aussi la liste des composants chargés et leur temps d'exécution. Pour Contact Form 7, tapez
contact-form-7dans la recherche du panneau Réseau; si le filtre a fonctionné, vous ne verrez nistyle.cssniscripts.jsde CF7 dans la liste des ressources chargées.
Y a-t-il un intérêt à désactiver des extensions sur un tout petit site avec seulement 5 à 7 extensions?
Si les 5 extensions sont vraiment nécessaires sur chaque page, non. Mais même sur un petit site, il y a souvent deux ou trois extensions qui ne fonctionnent que sur une seule page: un formulaire de contact, une galerie portfolio, un slider de page d'accueil. Désactiver ce duo sur les autres pages réduit sensiblement les requêtes HTTP et accélère le chargement. Comme nous l'avons vu plus haut sur l'installation de test, une seule extension filtrée fait gagner des dizaines de millisecondes. Pour un site avec plus de 1 000 visiteurs par jour, ces millisecondes cumulées font une différence notable, tant pour l'utilisateur que pour les Core Web Vitals.
Code, extension ou Perfmatters: que choisir selon votre besoin
Si votre site a 5 extensions et qu'elles sont toutes vraiment nécessaires sur chaque page, ce guide n'est pas pour vous. Mais un site WordPress typique embarque 15 à 25 extensions actives, dont seulement 5 à 7 fonctionnent réellement sur une page donnée. Le reste ne fait que consommer du temps serveur et ralentir le chargement.
Un mu-plugin programmatique est une approche gratuite, légère et entièrement contrôlable, mais elle demande de l'attention à chaque nouvelle extension. Plugin Organizer est le juste milieu: interface visuelle, flexibilité et gratuité. Perfmatters est le choix pour les projets commerciaux où chaque dixième de seconde de temps de chargement se convertit en argent.
Si vous avez accumulé plus d'extensions que nécessaire, commencez par un audit et un nettoyage de celles qui sont inutilisées, puis reprenez le contrôle du chargement pour celles qui restent. Choisissez votre approche selon votre niveau de confort et la charge du site, et vous verrez la différence dès votre première mesure dans le panneau Réseau. N'attendez pas que les extensions dévorent votre TTFB.



