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.

Comparaison directe des deux approches
| Critère | is_plugin_active() | function_exists() / class_exists() |
|---|---|---|
| Disponibilité en frontal | Nécessite require_once ABSPATH . ‘wp-admin/includes/plugin.php’ | Disponible sans condition |
| Précision de la vérification | Vérifie l’activation, même si l’extension a échoué à se charger | Vérifie que le code est réellement chargé et exécutable |
| Dépendance au chemin du fichier | Exige de connaître le chemin exact du fichier principal de l’extension | Exige de connaître le nom exact de la fonction ou classe exposée |
| Usage recommandé dans un thème | Dans l’administration, ou après chargement explicite du fichier requis | Dans 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.