Le WordPress d'aujourd'hui, décodé pour les développeurs

Thèmes

« Comparatif : deux méthodes pour détecter qu’un plugin attendu est absent »

is_plugin_active() ou function_exists() : deux façons de vérifier qu'une extension attendue par le thème est bien présente, avec des différences qui comptent selon le contexte d'exécution.

Par WordPress Développement • 24 février 2024 • 4 min de lecture • Aucun commentaire
"Comparatif : deux méthodes pour détecter qu'un plugin attendu est absent"

is_plugin_active( 'woocommerce/woocommerce.php' ) et function_exists( 'WC' ) répondent, en apparence, à la même question : l’extension attendue est-elle bien présente sur ce site ? Pourtant, un thème qui choisit la première méthode sans précaution peut provoquer une erreur fatale exactement à l’endroit où il cherchait à l’éviter, tandis que l’autre fonctionne sans condition dans n’importe quel contexte.

Cette différence, rarement documentée de façon comparative, tient à un détail d’architecture de WordPress : certaines fonctions du cœur ne sont chargées que dans l’administration, et un thème qui les utilise dans un fichier exécuté en frontal doit explicitement s’assurer de leur disponibilité avant de les appeler.

Méthode 1 : is_plugin_active(), la fonction dédiée du cœur

is_plugin_active() est la fonction officiellement prévue par WordPress pour vérifier l’état d’activation d’une extension, à partir de son chemin relatif au dossier wp-content/plugins/ :

if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
    // WooCommerce est actif.
}

Cette fonction n’est cependant définie que dans le fichier wp-admin/includes/plugin.php, chargé automatiquement dans l’administration mais absent du chargement standard d’une page frontale. Un thème qui appelle cette fonction dans un fichier de gabarit affiché en frontal, sans avoir chargé ce fichier au préalable, provoque une erreur fatale « Call to undefined function ».

Méthode 2 : function_exists(), disponible partout sans condition

function_exists( 'WC' ), ou son équivalent avec class_exists( 'WooCommerce' ), s’appuie directement sur la présence effective d’une fonction ou d’une classe déclarée par l’extension elle-même, sans dépendre d’un fichier additionnel du cœur :

if ( function_exists( 'WC' ) ) {
    // WooCommerce est chargé et actif.
}

Cette approche fonctionne de manière identique en frontal, en administration, ou dans un contexte de commande WP-CLI, sans jamais nécessiter de require supplémentaire.

L'essentiel à retenir : is_plugin_active() nécessite de charger un fichier du cœur non disponible partout ; function_exists() fonctionne dans tous les contextes sans chargement additionnel ; Le bon choix dépend du moment d'exécution du code, pas d'une préférence stylistique

Comparaison directe des deux approches

Critèreis_plugin_active()function_exists() / class_exists()
Disponibilité en frontalNécessite require_once ABSPATH . ‘wp-admin/includes/plugin.php’Disponible sans condition
Précision de la vérificationVérifie l’activation, même si l’extension a échoué à se chargerVérifie que le code est réellement chargé et exécutable
Dépendance au chemin du fichierExige de connaître le chemin exact du fichier principal de l’extensionExige de connaître le nom exact de la fonction ou classe exposée
Usage recommandé dans un thèmeDans l’administration, ou après chargement explicite du fichier requisDans les gabarits frontaux et les hooks exécutés tôt

Pourquoi la nuance entre « activé » et « chargé » compte

is_plugin_active() répond à la question « cette extension est-elle activée dans la liste des extensions ? », ce qui n’est pas rigoureusement identique à « son code est-il chargé et fonctionnel à cet instant ? ». Une extension activée mais dont un fichier est corrompu, ou dont l’exécution a été interrompue par une erreur avant sa propre initialisation complète, peut répondre positivement à is_plugin_active() tout en étant incapable de répondre à function_exists() pour une fonction qu’elle est censée déclarer.

Vérifier qu’une extension est activée ne garantit pas qu’elle a terminé son propre chargement : dans un thème, ce qui compte réellement est la disponibilité effective du code que l’on s’apprête à appeler.

Le verdict pour un thème classique

Pour sécuriser un appel dans un gabarit affiché en frontal, function_exists() ou class_exists() restent le choix le plus sûr et le plus direct, sans dépendance additionnelle. is_plugin_active() garde son utilité propre dans l’administration, par exemple pour afficher une notice conditionnelle recommandant l’installation d’une extension compagne, un contexte où le fichier nécessaire est de toute façon déjà chargé par WordPress.

En résumé

Les deux fonctions ne sont pas interchangeables : l’une vérifie un état d’activation déclaré, l’autre vérifie une disponibilité effective de code, et seule la seconde fonctionne sans condition dans tous les contextes d’exécution d’un thème. Un thème qui sécurise ses dépendances envers une extension gagne à privilégier function_exists() ou class_exists() dans ses fichiers frontaux, et à réserver is_plugin_active() aux écrans d’administration où son usage reste pertinent.

Laisser un commentaire

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

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi