Premier contact

ExtensionsWordpress

Glissons dextrement le dossier text-floating-image dans le répertoire wp-content\plugins de notre installation WordPress et rendons nous pour voir un peu sur la page des extensions de notre back-end. Là, on joue la surprise extasiée que, quand même, c’est trop génial, notre plugin à nous est bien là avec une ch’tite description qui dit rien mais quand même et puis tiens puisqu’on est là à s’esbaudir ne nous retenons pas plus longtemps et activons la bête !

Bon, à ce moment précis du film, on est un peu déçu forcément parce que si la bête est bel est bien activée, elle n’a pas rugi pour autant, rien n’a bougé, les trompettes de la renommée sont restées cruellement coites et même la terre continue de tourner qu’à bien y réfléchir c’est quand même préférable…

En même temps, faut bien admettre que jusqu’ici on ne s’est pas franchement foulé…

Il est d’ailleurs plus que temps de nous y mettre car la route est encore longue !

Une description qui va bien

On va commencer tout doucement en donnant une description idoine à notre plugin. La chose se fait très simplement dans la classe principale text-floating-image.php logée à la racine du dossier de notre extension. Il suffit de renseigner de façon éclairante la ligne Description qui figure au sein des commentaires introductifs du fichier :


Ainsi donc, en ce qui nous concerne, la ligne Description devient :


Alors oui bon je sais je sais je sais : depuis le fondement de mon trou breton j’entends monter vos hurlements outrés que c’est du grand n’importe quoi cet english de cuisine, et pis qu’on est en France et qu’en France on cause français Môssieur !  Ce à quoi je réponds que d’abord et avant tout je fais ce que je veux, je parle comme je veux et anglais comme je peux et qu’ensuite, tout ça c’est pour la bonne cause because (ah ! ah !) ce plugin, mes p’tits gars, il a la grande classe internationale et que si on le pense d’emblée en british sauce mondialisée ça ne nous empêchera surtout pas d’étudier le comment de la traduction que même ce sera un excellent exercice ! Ah mais !

Ceci étant dit et plutôt que de ressasser vos ronchonneries que c’est mauvais pour l’ulcère qui vous guette du coin de son œil qu’il a mauvais, vous pouvez vous assurer que la description a bien été prise en compte en actualisant sans plus traîner la page des extensions de WordPress.

Ajout d’une entrée dans le menu Réglages

Continuons notre périple en nous efforçant d’ajouter une entrée Text Floating Image dans le menu Réglages du tableau de bord de WordPress pour ouvrir un accès à la page des options paramétrables de notre belle extension.

Le chose se réalise en s’appuyant sur le hook admin_menu que nous allons employer pour lancer une fonction add_plugin_admin_menu() écrite de nos petites mains. Celle-ci appellera la fonction add_options_page() de WordPress, laquelle est justement dédiée à l’ajout d’une entrée dans le menu Réglages. Pour finir, add_options_page() aura pour callback une fonction display_plugin_setup_page() qui se chargera d’inclure la page partials/text-floating-image-admin-display.php, prévue d’office par notre boilerplate et destinée à renfermer le contenu de notre page de paramètres.

Comme nous l’avons vu au cours de l’épisode précédent, la gestion des hooks est déléguée à la classe admin/includes/class-text-floating-image-loader.php dans laquelle nous n’avons rien à faire si ce n’est y jeter un œil pour mieux comprendre son mécanisme.

Pour la partie administration du blog qui nous intéresse ici et maintenant, les hooks doivent être définis dans la fonction define_admin_hooks() contenue dans includes/class-text-floating-image.php (pour ce qui concerne le front-end, c’est la fonction define_public_hooks() de cette même classe qui se charge du boulot).

Quant à notre fonction add_plugin_admin_menu chargée de réaliser la tâche au final, nous la rangerons soigneusement à la place qui lui revient, c’est-à-dire dans la classe admin/class-text-floating-image-admin.php.

Commençons donc par définir notre hook admin_menu :


Et continuons avec la fonction add_plugin_admin_menu() et sa suite :


 

Wordpress-MenuReglages

Vous pouvez dès à présent constater que le menu Réglages comporte désormais une nouvelle entrée Text Floating Image, laquelle vous amène d’un clic sur une page encore désespérément vide mais que nous ne manquerons pas de remplir quand le moment sera venu.

Quoi, il n’est pas encore arrivé ce foutu moment ?

Ben non !

Pas t’encore petits scarabées !

Parce que si nos futurs utilisateurs disposent bien désormais d’un accès à notre page d’options, ils seraient sans conteste au comble de l’extase si nous songions à leur en offrir un autre sur la page du tableau de bord listant les extensions. Les occasions extatiques se faisant rares par les temps qui courent, il serait particulièrement cruel de les en priver d’autant que la chose est plutôt aisée à réaliser.

Or donc…

Ajout d’un lien vers les options sur la page des extensions

On s’appuie cette fois sur le filtre plugin_action_links_(plugin file name) dont la mission consiste très justement à réaliser ce que l’on désire si ardemment, c’est à dire obtenir un truc qui ressemble à ça :

Wordpress-Reglages

Nous nous en retournons donc dans la fonction define_admin_hooks() de la classe includes/class-text-floating-image.php pour y rajouter ces lignes :


Et nous allons derechef insérer la fonction add_plugin_action_links() dans la classe admin/class-text-floating-image-admin.php :


Un petit tour sur la page des extensions pour nous assurer que tout fonctionne et nous continuons valeureusement notre long chemin…

Cahier des charges

Avant que de nous lancer enfin tête baissée dans la réalisation effective de la page des options de notre extension, il nous faut encore lister les paramètres déterminants qui méritent le privilège d’y figurer, leur attribuer une valeur par défaut et trouver le moyen d’en informer WordPress.

Nul besoin de se torturer longuement le peu d’esprit dont nous disposons pour conclure que l’image est déterminée de prime abord par sa largeur, exprimée en pourcentage de la largeur de la page. Voilà donc qui constituera le premier des facteurs à renseigner.

Cependant, il est fréquent, et c’est d’ailleurs le cas pour ce blog, que le thème définisse pour le contenu une largeur relative par rapport au body. Dans cette configuration, cette largeur est couramment limitée par un max-width.

Ainsi, pour notre blog à nous, nous avons assez classiquement :


Jusqu’à il y a peu, nous n’aurions pas franchement eu à nous soucier de ces détails. Mais, WordPress a eu l’excellente idée d’introduire dans sa version 4.4 la gestion responsive des images. Dans ce contexte, ces détails deviennent déterminants pour nous permettre de calculer les valeurs à insérer dans l’attribut sizes et il nous faut donc donner à l’utilisateur la possibilité de nous préciser ces paramètres.

Par ailleurs, il est indispensable de donner à ce même utilisateur l’opportunité de déterminer si, par défaut, l’alignement s’opère à gauche ou bien à droite.

Et dernier point tout au moins pour l’instant : il nous faut songer à donner accès aux marges gauche et droite de l’image et ce en fonction de l’alignement. Classiquement, dans le cas d’un alignement à gauche, on aura tendance à ménager une marge à droite pour que le texte évite de coller au bord de l’image. Et réciproquement…

Pour résumer, nous devrions avoir :

  • Un premier groupe de trois champs permettant de définir :
    • La largeur en pourcentage de l’image (une valeur de 45% par défaut me parait judicieuse).
    • La largeur en pourcentage de la page (la valeur par défaut sera fixée à 100%).
    • La largeur maximale de la page (une valeur de zéro signifiera que cette largeur n’est pas limitée et sera définie comme valeur par défaut).
  • Une case à cocher fixant un alignement à droite (par défaut, l’alignement sera posé à gauche et la case non cochée).
  • Un groupe définissant les marges gauche et droite de l’image dans le cas d’un alignement à gauche (marge gauche fixée à 0 et marge droite à 20px par défaut).
  • Un groupe définissant les marges gauche et droite de l’image dans le cas d’un alignement à droite (marge gauche fixée à 20px et marge droite à 0 par défaut).
Initialisation des valeurs par défaut

Pour informer WordPress des valeurs par défaut affectées aux paramètres de notre extension, nous allons recourir à son API options. Par ce même biais, nous enregistrerons les modifications éventuellement apportées à ces valeurs par l’utilisateur. Il nous faut faire en sorte que WordPress garde une trace de nos valeurs par défaut de façon à ce que l’utilisateur puisse rétablir celles-ci s’il s’aperçoit qu’il a lui-même fait n’importe quoi.

Autrement dit, nous allons travailler avec un tableau de cette forme :


Lors de la première activation de notre plugin, nous enregistrerons ce tableau dans une option portant le nom de notre extension. Cette donnée sera un tableau de la forme :


La façon la plus triviale de passer ces valeurs à WordPress reste de les enregistrer dans une page judicieusement nommée default-settings.php et soigneusement rangée dans le dossier includes de notre extension :


Nous n’avons plus alors qu’à mettre en place la procédure d’activation du plugin dans le fichier class-text-floating-image-activator.php prévu à cet effet :


Après désactivation (si elle était activée) et réactivation de l’extension, vous devriez découvrir en fouillant la table wp_options de la base de donnée de votre installation WordPress une nouvelle ligne text-floating-image dont la valeur remise en forme pour être plus lisible ressemble à ça :

 


 

Du ménage à faire

Nous venons de créer une nouvelle entrée dans la base de WordPress. Le moins que l’on puisse faire en cas de suppression de notre extension est de songer à effacer cette donnée sans plus d’utilité. Une très légère intervention sans douleur dans le fichier uninstall.php logé à la racine du dossier de notre plugin et le tour est joué :

Avant que de vous précipiter vous assurer de la validité de la chose en supprimant l’extension comme ça pour voir, n’oubliez pas de faire un back-up du dossier text-floating-image au risque de perdre tout votre travail : WordPress ne fait pas de détail et détruit sans complexe mais à raison le dossier d’une extension lorsque celle-ci est supprimée !

Construction de la page

Wordpress-TextFloatingImageSettings

Tout semble enfin prêt désormais pour nous attaquer à l’écriture de notre page d’options. Oui, je sais, il serait plus que temps !

Je vous livre ici l’intégralité des codes php, css et js commentés ainsi qu’un aperçu du résultat.

Rendez-vous après tout ça pour un petit debriefing.




Mouais ! Ça fait beaucoup d’un coup !

Reprenons donc calmement et dans l’ordre.

  • La structure html du fichier php est parfaitement classique : un div wrapper encadre un formulaire lequel contient un titre, 4 groupes de champs (des fieldsets, quoi !), un bouton Reset et un bouton submit pour conclure. Coté php, on démarre en récupérant les paramètres enregistrés via la fonction get_options() de WordPress et en appelant la fonction setting_fields() (dont vous constaterez qu’elle est remarquablement documentée). Les petits curieux auront sans doute remarqué l’utilisation répétée de la fonction esc_attr_e qui prépare notre extension à l’internationalisation. Chaque champ est caractérisé par son nom de la forme text-floating-image[nom_option]. Son attribut value reprend la donnée correspondante enregistrée tandis qu’un attribut data-default stocke sa valeur par défaut de manière à faciliter le reset.
  • En ce qui concerne la partie css, rien de particulier à signaler me semble t-il si ce n’est qu’à l’initialisation le div wrapper est positionné en absolute avec un top à -20000px afin de le dissimuler aux regards le temps pour le fichier javascript d’opérer quelques menus calculs.
  • Le volet javascript justement se charge d’assurer le reset, d’établir la largeur maximale pour chaque groupe de labels afin de réaliser un alignement au cordeau et d’afficher le tout en rétablissant la position du div wrapper en static.
Enregistrement des options

Dans l’état actuel, si vous faites mumuse avec cette page et tentez d’enregistrer vos modifications, vous allez au devant d’une cruelle déception. Vous devriez en effet vous retrouver face à une page listant toutes les options de WordPress sans aucun rapport avec vos attentes. Le fait est que nous n’avons encore rien dit au cœur de WordPress quant à ce que nous souhaitions faire de toutes ces valeurs. Pour y remédier, il nous faut recourir à la fonction register_setting() non sans avoir au préalable assurer une validation sans faille des données.

Retour donc dans notre classe admin/class-text-floating-image-admin.php pour y ajouter les lignes qui suivent :


On enchaîne sans traîner en éditant une fois de plus la fonction define_admin_hooks() de notre classe maîtresse includes/class-text-image-floating.php :


Et le tour est joué ! Enfin ! Notre extension dispose d’une page de paramètres parfaitement fonctionnelle !

Je vous invite néanmoins à torturer la chose avec l’application d’un psychopathe zélé afin d’en débusquer les éventuelles failles et/ou limites.

Conclusion provisoire

Récapitulons !

En résumé, nous avons jusqu’ici :

  • affiché une description digne de ce nom pour notre extension;
  • introduit un premier accès à la page d’options dans le menu Réglages;
  • établi un second accès direct à ces mêmes options depuis la page des extensions du tableau de bord;
  • créé une nouvelle entrée dans la base de données de WordPress pour y stocker les valeurs utilisateur ainsi que les valeurs par défaut de nos options;
  • prévu l’élimination de ladite entrée en cas de suppression de l’extension;
  • construit la page d’options;
  • assuré la validation et l’enregistrement des modifications apportées par l’utilisateur.

C’est un bon début mais ce n’est qu’un début…

Si vous avez encore quelque énergie en réserve, la soif de savoir et de solides notions d’anglais, je vous invite à les mettre à profit en picorant ici et là dans la courte bibliographie que voici :

L’API Settings selon le Codex de WordPress.

Un tutorial de Mossieur Otto qui date un peu mais fait toujours référence.

Un tutorial plus récent, rédigé par David hayes.

Et quand vous aurez fini de digérer, je vous invite à poursuivre avec moi notre longue route