Beaucoup de plugins WordPress utilisent des fichiers JavaScript, ou même leurs propres feuilles de style CSS. Pour faciliter l’inclusion de ces fichiers, WordPress fournit les fonctions wp_enqueue_script() et wp_enqueue_style() qui devraient être utilisées de façon systématique dans ces cas-là. Cependant, il est tout aussi important de ne pas les utiliser n’importe où afin de ne les charger que si la chose est nécessaire, et nous allons ainsi voir ici quelques bonnes méthodes pour faire cela.
Bien évidemment, le tout premier réflexe à avoir est d’utiliser les actions : WordPress fournit l’action wp_enqueue_scripts qui est justement appelée lorsqu’il charge tous les scripts. Si vous avez constamment besoin de vos scripts, c’est dans cette action que vous devez les appeler. Mais on n’a pas forcément toujours besoin de nos scripts.
Pour changer, je vais prendre l’exemple de WP Photo Sphere qui, dans ses premières versions, incluait de façon systématique les scripts nécessaires à son bon fonctionnement. Bien sûr, aucun problème d’utilisation n’était alors à déplorer mais il faut bien avouer que c’était un peu dégueulasse : que le visiteur en ait besoin ou non, les scripts étaient inclus. Moche.
La version 2.0 a apporté la solution à ce problème, en n’incluant les scripts que si nécessaires. Et si vous cherchez vous aussi à n’inclure vos scripts que si nécessaire, il faut simplement se poser une question : où le sont-ils ?
Si vous regardez le code source de WP Photo Sphere à partir de la version 2.0, vous verrez que je n’utilise même plus d’action pour importer les scripts qui sont appelés à un autre moment, justement celui où j’en ai besoin.
L’idée est simple et pourtant très efficace. Elle repose sur toute la puissance de wp_enqueue_script() (c’est bien sûr la même chose pour wp_enqueue_style()) : cette fonction est celle à utiliser pour appeler vos scripts, tout simplement parce qu’elle effectue quelques vérifications avant de les appeler. En effet, si vous appelez deux fois de suite wp_enqueue_script() avec deux fois le même script, WordPress n’inclura pas plusieurs fois le script et ne le fera qu’une seule fois.
Sachant cela, revenons à notre exemple. A priori, un script de WP Photo Sphere peut être nécessaire un peu partout : sur un article seul, sur une page, sur l’index qui peut lister des articles contenant des panoramas, etc., bref, impossible de viser un certain type de page en question.
Par contre, on sait quand un script est nécessaire : lorsqu’on a trouvé un tag. Dans le plugin, une fonction est appelée chaque fois qu’un contenu doit être affiché, une fonction qui s’occupe justement de vérifier si un tag de WPPS est présent pour le remplacer par ce qu’il faut.
Si aucun tag n’est trouvé, rien n’est fait bien sûr, mais s’il y en a au moins un, la fonction wpps_enqueue_scripts() est appelée. Cette dernière, comme son nom l’indique, s’occupe d’appeler tous les scripts nécessaires. Et c’est tout ce qu’il y a à faire : avec le fonctionnement de wp_enqueue_script(), on sait que si deux contenus ont besoin des scripts, ces derniers ne seront inclus qu’une seule fois.
Cette méthode possède cependant un léger désavantage : il est évident qu’à ce moment-là, il est largement trop tard pour demander à WordPress d’inclure les scripts dans le head, et ils seront ainsi inclus en fin de page. Pour la très grande majorité des cas, ça ne posera bien sûr aucun problème puisqu’il faut de toute façon attendre que la page soit entièrement chargée, mais si votre plugin nécessite des scripts dans le head, c’est loupé pour les bonnes manières.
Pour ceux qui se le demandent, par défaut, wp_enqueue_script() demande l’inclusion dans le head comme nous l’indique si justement la doc. Pour modifier ce comportement, il faut utiliser le dernier argument qui est un booléen : en le mettant à true, vous demanderez l’inclusion dans le footer.
C’est à peu près tout ce dont vous avez besoin : en utilisant ces méthodes, vos scripts ne seront chargés que si c’est nécessaire et si vous utilisez le même principe que pour WP Photo Sphere, il sera impossible de faire mieux puisqu’on ne les demande qu’au tout dernier moment.
3 commentaires
[…] Plugins WordPress : n’incluez vos scripts que si nécessaire ! […]
Entièrement d’accord avec cet article : la plupart des développeurs WordPress ne se posent pas la question et font leur enqueue de manière constante.
Un autre exemple parfait de cette démarche est le plugin de contact « Contact Form 7 ». La plupart des sites qui l’utilisent n’ont qu’un seul formulaire sur une seule page, et pourtant le script est ajouté sur l’ensemble des pages.
Il faut dire que trouver des infos sur ce type de sujet est assez dur finalement, c’est malheureusement un cercle vicieux : peu de gens se posent la question, donc rien n’est dit, et parmi le peu qui se posent des questions, beaucoup n’ont pas forcément le temps ni l’envie de batailler pour trouver leurs propres méthodes. Perso, même si, une fois trouvée, la méthode est juste évidente, elle ne l’a pas été tant que ça à trouver…