Détecter la présence d’un plugin

Le fait est que WordPress est une communauté mondiale.

Le fait est que le nombre d’extensions (nos chers plugins) disponibles sur les plateformes gratuites et payantes est absolument considérable. Le fait est que nous devons souvent en tant que développeurs greffer nos codes et extensions sur des plugins existants.

Avec tout cela en tête on se rendra sur nos blogs préférés et autres références du web et l’on pourra trouver des astuces fonctionnelles. Petit exemple pour commencer :

Une récurrente

// pour le front-end on appelle plugin.php
include_once( ABSPATH . 'wp-admin/includes/plugin.php' );

if (is_plugin_active('le_repertoire_plugin/le_plugin.php')) {
     //notre code
}

Source

Une variante

function jm_tc_is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}

et plus loin dans notre code, utilisée en tant que condition :

if(jm_tc_is_plugin_active('le_repertoire_plugin/le_plugin.php') ) { /*notre code*/}

Alors qu’est-ce que je peux avoir contre ce genre d’astuce ? La réponse est “absolument rien, ça fonctionne dans la plupart des cas”. S’ajoute que si vous regardez le préfixe de la deuxième fonction vous constaterez que j’utilise la technique dans un de mes plugins (MAJ à prévoir d’ailleurs…)

Et oui mais, et si…

Le but du développeur est quand même de veiller à ce que son code puisse fonctionner quelque soit l’installation. L’idée est que le plugin puisse s’ajouter, se désactiver, se désinstaller, se réinstaller comme bon semblera à l’utilisateur.

Or ici les “variables” sont incontrôlables : le développeur du plugin que l’on veut détecter peut renommer le répertoire, le client peut le faire aussi, certaines installations font ce genre d’opérations pour des raisons de sécurité.

Et là c’est le drame surtout si vous avez conditionné une fonctionnalité à la présence d’un autre plugin !

Solution

Je reprends deux snippets que j’ai publiées sur le blog il y a quelques temps. J’ai voulu pour mon plugin de cards offrir la possibilité à mes utilisateurs de récupérer le contenu des metas title et description de plugins très célèbres de SEO pour un meilleur confort.

Au passage, on se demande pourquoi je n’ai pas appliqué l’astuce qui va suivre à l’autre partie de mon code (comme je disais plus haut, MAJ à suivre…). Et toujours au passage, 5000 téléchargements, MERCI bigsmile !

Mais revenons à nos moutonnios, voici l’astuce:

if (class_exists('WPSEO_Frontend')) {/* notre code */ }
if (class_exists('All_in_One_SEO_Pack')) {/* notre code */ }

Avec un class_exists() tout simple je détecte si WP SEO by Yoast ou All in One SEO est activé !

Pourquoi c’est mieux ?

C’est mieux parce que d’ici à ce que l’auteur change le nom de la classe qu’il utilise, on peut dormir sur nos deux oreilles, une classe du genre WP SEO ne se pond pas comme cela, c’est un peu comme une librairie (j’ai dit un peu hein bigsmile ).

C’est mieux parce que le client et/ou l’utilisateur peut renommer comme bon lui semble les répertoires des plugins en question.

Ah ouais? Et s’il n’y a pas de classe? Tu fais quoi ?

Bah tu cherches ! Si ton plugin doit se baser en partie sur l’activation d’un autre plugin ce n’est peut-être pas une mauvaise idée d’aller explorer le code du plugin sus-cité.

Hein ?

Petit exemple concret et c’est en cela que je trouve la méthode bonne :
Prenez n’importe quel plugin. Il y a bien des fonctions à l’intérieur ? Donc vous pouvez vous en servir de la même manière :

if (function_exists('une_fonction_du_plugin_a_detecter')) {/* notre code */ }

Et ça marche parce que lorsque vous ajoutez des plugins, vous ajoutez des fonctions, et tout ce petit monde se retrouve sur la même portion d’autoroute lors du chargement de WP.

Alors évidemment, vous pourriez me dire que l’auteur du plugin peut renommer voire supprimer la fonction dans une MAJ. Mais à cela je répond que vous devez de toute façon vous tenir au courant des MAJ du plugin comme vous le faites pour WP lui-même puisque vous en dépendez. Essayez également de viser des fonctions “core” du plugin, moins susceptibles d’être retirées.

Si vous avez mieux je suis preneur.