11
Jan
09

Les hooks WordPress


Comme dans tout système, le plugin fonctionne grâce aux hooks qui lui permettent de s’accrocher au coeur du système et d’ajouter ou modifier des fonctionnalités.

Il en existe des centaines dans WordPress, très exactement 800 dans la version 2.7.

Ce site fournit une base de données des hooks avec leur fonctionnalité exacte. C’est donc une mine d’or pour le développeur de plugins wordpress.

On distingue principalement deux types de hooks : les hooks d’action et les hooks de filtrage. Pour faire simple, prenons un exemple de chaque cas. Lorsque le plugin se charge, on va utiliser un hook d’action pour appeler la fonction d’initialisation. Le hook d’action est un simple appel de fonction qui va avoir lieu lorsqu’un événement système précis a lieu. En revanche, lorsque l’on souhaite modifier le contenu d’une note, on va utiliser un hook de filtrage. Les hooks de filtrage s’appliquent plus à des flux de données que le système va analyser et modifier selon vos directives.

Pour ajouter un hook d’action, voici la syntaxe :
add_action('plugins_loaded', 'my_init_function');

Ici my_init_function sera appellée à chaque fois que le plugin sera chargé.

Pour ajouter un hook de filtrage, voici la syntaxe :
add_filter('the_content', 'my_filtering_function');

Ici my_filtering_function sera appellée à chaque fois que le contenu d’une note sera généré (lu dans la database puis passé à travers le filtre pour ensuite être affiché suivant le theme).

Voici un bout de code montrant ce que pourrait être le contenu de my_filtering_function :

define("MYFILTER_REGEXP", "/\[myfilter\]/");
function my_filtering_function($content)
{
return (preg_replace_callback(MYFILTER_REGEXP, 'my_plugin_write_content', $content));
}

Dans cet exemple, à chaque fois que WordPress va générer le contenu, il va appeler my_filtering_function en lui passant en paramètre le contenu. Dans ma fonction, je dois retourner à WordPress le contenu filtré. Je mets donc en place un filtrage grâce à la fonction php preg_replace_callback qui va faire un match sur le pattern défini plus haut (MYFILTER_REGEXP). A chaque fois que le contenu d’une note ou d’une page contiendra mon pattern, la fonction my_plugin_write_content sera appelée. Je pourrais alors modifier et manipuler le contenu selon mes souhaits et le retourner modifié à WordPress. Voilà comment fonctionnent les filtres.

Comme il y a 800 hooks, je ne vais pas tous les détailler ici, cela serait un travail de romain. Aussi, je vous recommande d’aller voir dans la base de données pour y trouver celui qui répond à votre besoin.

wordpress-plugin-button Retour au sommaire du dossier sur l’écriture d’un plugin wordpress





16 commentaires pour “Les hooks WordPress”
  1. Malko dit :

    J’ai remarqué un detail qui m’a choque sur l’appel de cette fonction preg_replace_callback.

    C’est que le contenu modifié s’affiche avant le contenu du billet qui n’est pas filtré (le texte quoi ^^ )…

    La fonction preg_replace modifie le texte sans le déplacer … mais si je met un callback, y’a rien a faire, la fonction appelée écrit son texte avant tout le reste…

    Cela peut-il venir de ma version de wordpress ? ( 2.7 )

  2. Olivier dit :

    Je ne sais pas te répondre. L’utilisation que j’en fait dans un plugin est conforme à mes attentes (remplacement d’un pattern par un texte) et ce en 2.7…

  3. Malko dit :

    En effet, apres maintes recherches sur mon code, l’erreur venait bel et bien de moi…et non de la fonction.(comme tjs )
    Ma fonction de callback, au lieux de renvoyer à la fonction appelant le resultat, il ecrivait directement sur le blog ( fonction echo .. au lieu de l’ajouter dans la variable à retourner …).

    ça m’apprendra à faire du code passé 2h du mat :D.

  4. Olivier dit :

    Cela arrive souvent ce genre de choses malheureusement…

  5. Jnuk dit :

    salut à toi.

    Je bloque sur un truc avec wordpress et tu m’as l’air bien calé sur ce sujet. Ce serait sympa si tu pouvais prendre 5 min pour me répondre 🙂

    Il y a bp de plugin qui se déclenchent de la manière suivante [nomduplugin] paramètre [/nomduplugin]. Cette méthode ne fonctionne que lorsqu’elle est insérée dans un post. En dehors (dans la sidebar par ex) elle ne donne rien.

    Aurais-tu un petit hack pour remplacer par une fonction php le déclenchement de ce type de plugin?
    Un truc du style

    Merci par avance.
    Jnuk

  6. Jnuk dit :

    ça a sauté…

    un truc du style

  7. malko dit :

    mm je ne suis pas sur d’avoir saisi ta demande…
    En gros, de ce que j’ai compris de wordpress, le pluggin fonctionne avec ce type de commande [myPlug myParams /] car au moment ou wordpress lit ton post il filtre la commande et la remplace par la serie de commande indiquée dans le plugin correspondant…
    Pour que ta commande puisse marcher en dehors, il faudrait que tu te debrouilles pour editer tes sidebar PAR wordpress de la meme maniere que l’edition d’un post …

    A dire vrai j’ai fait ce pluggin sans connaitre wordpress ^^ non non faut pas rire … j’ai decouvert WP en bidouillant mon plugin pour un pote…
    Je n’ai donc pas une connaissance poussée du truc, sinon que de la logique generale…

    Peut-etre qu’en detaillant plus ce que tu souhaite obtenir je pourrais t’aider… mais ma connaissance de WP est assez limitée en realite.

    Madicalement.

  8. Olivier dit :

    Merci Malko pour ton support, je vais pouvoir aller me reposer, c’est très sympa de ta part 🙂

    @Jnuk : il « suffit » de sélectionner le bon hook tout simplement. Dans mon exemple, j’ai fait un hook sur the_content qui correspond au contenu de la note. Mais il existe aussi des hooks pour la sidebar. En fait, c’est plutôt pour les widgets (que tu places ensuite dans la sidebar). Je crois d’après ce que j’ai trouvé dans la database que c’est sidebar_widgets le filtre qui va bien dans ton cas.

  9. Mobi dit :

    Merci pour le lien de cette base de hook
    ca va beaucoup m’aider 🙂

  10. Mobi dit :

    ben pk ta viré mon lien ? pas sympa ça , tanpis je posterais plus chez toi vilain :p

  11. Olivier dit :

    Parce que ton commentaire n’était fait que pour récupérer un lien 😉

  12. Mobi dit :

    non non du tout 🙂 je trouve ce post intéressant c’est ici que j’ai appris ce qu’était un hook , mais bon peu importe en fait , juste en revenant lire ton blog j’avais remarqué sa disparition , quand mon blog sera pret n’hésite pas a venir poster moi je me fiche que tu affiche ton lien 😉

  13. Olivier dit :

    Le pb n’est pas que tu affiches ton lien mais que tu laisses un commentaire de deux lignes avec un lien vers un site sur Joomla alors que mon article parle des hooks WP…

    C’est un peu comme si j’écrivais un article sur Windows et qu’un gars d’Apple vienne laisser un commentaire du style « super post » avec un lien vers le site d’Apple… Au pire, c’est du spam, au mieux, de la pub déguisée voire de la provoc 😉

    Enfin bon, c’est pas bien grave hein 😉

  14. Mobi dit :

    Tout a fait 🙂 en tout cas quoi qu’il en soit je garde ton blog dans mes favoris car il m’aide bien merci 🙂

  15. skull dit :

    Bonjour à tous,

    Est il possible de créer son propre hook ?
    L’exemple que tu donnes est celui du the_content… présent effectivement dans la liste http://adambrown.info/p/wp_hooks/hook

    Mais est il possible de s’attaquer à une fonction de WP qui n’est pas présente dans la liste ci-dessous. En l’occurence, je recherche à modifier le contenu du selectbox des modèles de page.

    Merci d’avance pour vos réponses

  16. Olivier dit :

    Bonjour Skull,

    Oui c’est possible, tu fais un do_action ou apply_filters. Ca, c’est si tu veux créer un hook dans ton theme ou ton plugin.

    Après, tu peux aussi modifier en dur les fichiers du core mais je te le déconseille car tu seras forcé de refaire tes modifs à chaque mise à jour.

    Certaines fonctions sont redéfinissables sinon.


L'autre monde | Thème liquide par Olivier