Les hooks WordPress sont la chose à apprendre si vous souhaitez vous lancer dans le développement WordPress. Les Hooks vous permettent de faire deux choses : changer les fonctionnalités par défaut dans WordPress et ajouter vos propres fonctionnalités sans modifier du tout les fichiers WordPress de base.
S’assurer de ne jamais modifier les fichiers principaux est extrêmement important, mais la modification et l’ajout de choses semblent impossible sans cela.
Dans cet article, nous allons voir comment vous pouvez le faire assez facilement avec deux types de hooks: les actions et les filtres. Vous aurez besoin d’une compréhension de base de HTML et PHP pour celui-ci, mais pas trop.
Pourquoi utiliser des Hooks?
Les hooks sont intégrés à WordPress et sont utilisés pour modifier ou ajouter des fonctionnalités au système principal. Supposons un instant que WordPress ne fournit aucun hook. Et disons également que vous travaillez avec de nombreux messages programmés et que vous souhaitez vous envoyer un e-mail lorsqu’un message est publié. Comment feriez-vous cela?
Sans hook, vous devrez modifier les fichiers core. Vous recherchiez le code responsable de la publication d’un article et juste après la fonction qui effectue l’action, vous colleriez votre propre code.
Ceci est préjudiciable pour un certain nombre de raisons. Les deux grands sont les mises à jour et le code incontrôlable. Si vous modifiez les fichiers WordPress de base, votre code fonctionnera très bien mais sera effacé lorsque vous mettrez à jour WordPress vers la version suivante. Vous devrez vous souvenir ou suivre toutes vos modifications, puis les réintégrer. Pas vraiment pratique. Alternativement, vous ne pouvez tout simplement pas mettre à jour WordPress, mais ce serait un risque de sécurité énorme à long terme.
Même si vous parvenez à suivre les modifications et à mettre à jour WordPress, vous vous retrouvez avec un environnement non standard avec un code incontrôlable. D’autres développeurs WordPress auront du mal à gérer votre code et la communauté dans son ensemble ne sera pas satisfaite.
Les Hooks
Un hook fait presque exactement ce dont nous avons parlé auparavant (trouver l’endroit où un article est publié, coller votre code), mais remplace l’horrible morceau de collage par un espace réservé. Par défaut, il existe un espace réservé après la fonction de publication, qui vous permet de lier les fonctionnalités à cet endroit. Voici une version abrégée de la fonction wp_publish_post(), que vous pouvez trouver dans wp-includes/post.php.
function wp_publish_post( $post ) {
// Code de traitement de la fonction
do_action( 'wp_insert_post', $post->ID, $post, true );
}
Cette fonction do_action() en bref dit : Vous pouvez me lier votre propre fonction, elles seront toutes exécutées.
Ainsi, chaque fois que WordPress publie un article à l’aide de la fonction wp_publish_post (), il passe par toutes les étapes nécessaires pour y parvenir. Il passe ensuite à la fonction do_action(). Le premier paramètre est wp_insert_post. Toute fonction liée à cette action wp_insert_post sera exécutée.
Prenons un exemple.
Pour créer une “Hooked Function”, vous devez créer un simple plugin, utiliser le fichier functions.php de votre thème, ou créer un thème enfant et utiliser le fichier functions.php qui s’y trouve. Créons maintenant un plugin rapidement.
Créez un nouveau dossier dans le répertoire Plugins et nommez-le «hook-example». Créez un fichier «hook-example.php» dans ce répertoire et collez-y le code suivant :
<?php
/**
* Plugin Name: Hook Test
* Description: Un plugin pour tester les Hooks
*/
Pour plus d’information sur la création de plugins, consulter notre guide de création de plugins sous WordPress.
Votre plugin est maintenant prêt. Rendez-vous dans la section Plugins de l’administration WordPress et activez-la.
Créons maintenant une fonction accrochée. Dans le fichier hook-example.php, collez ce qui suit :
add_action( 'wp_insert_post', 'email_post_author', 10, 3 );
function email_post_author( $post_id, $post, $update ) {
$email = 'mymail@mail.com';
$subject = 'New Post Published';
$message = 'Un nouvel article a été publié, consultez-le maintenant sur : ' . get_permalink( $post->ID );
wp_mail( $email, $subject, $message );
}
Nous utilisons la fonction add_action() pour indiquer à WordPress que nous aimerions accrocher une fonction dans wp_insert_post. Les deuxième et troisième paramètres sont la priorité et les arguments. Nous y reviendrons bientôt.
Dans notre fonction accrochée, nous définissons simplement ce que nous aimerions faire, dans ce cas : envoyer un e-mail. Chaque fois que WordPress publie un article, il recherchera toutes les fonctions liées à wp_insert_post et les exécutera toutes.
Ici, Nous avons ajouté des fonctionnalités à une partie centrale de WordPress sans modifier les fichiers principaux. Tout ce dont nous avions besoin était une ligne de code supplémentaire. C’est très important! Tout ce que vous avez à faire est d’écrire une fonction qui fait ce dont vous avez besoin, puis de la connecter à une partie spécifique de WordPress.
Actions et Filtres
Jusqu’à présent, nous avons vu ce qu’est une action – c’est un morceau de code qui est exécuté à un moment précis. Un filtre peut être utilisé pour modifier le contenu avant que WordPress ne l’utilise. Vous pouvez utiliser un filtre pour modifier le texte «votre mot de passe est incorrect» sur la page de connexion.
Jetons un œil à wp-login.php :
if ( ! empty( $errors ) ) {
/**
* Filter the error messages displayed above the login form.
*
* @since 2.1.0
*
* @param string $errors Login error message.
*/
echo '<div id="login_error">' . apply_filters( 'login_errors', $errors ) . "</div>\n";
}
L’extrait du fichier qui gère les connexions montre que les messages d’erreur de connexion sont affichés à l’aide d’une fonction apply_filters(). Ceci est très similaire en logique à la fonction do-action().
Le deuxième paramètre contient une sorte de données. Si vous utilisez une fonction accrochée basée sur le premier paramètre, vous pouvez modifier ces données, sinon WordPress va les utiliser telles quelles. Par défaut, si vous entrez un nom d’utilisateur correct mais un mot de passe incorrect, vous voyez l’avis suivant :
Si vous pensez que c’est un peu dangereux car cela expose le fait que le nom d’utilisateur est correct, vous pouvez accrocher une fonction à login_errors pour le modifier. Voici comment :
add_filter( 'login_errors', 'modify_login_errors' );
function modify_login_errors() {
return 'Login unsuccessful, try again';
}
En mettant en œuvre ce changement, vous avez ajouté un peu plus de sécurité à votre processus de connexion et vous pouvez également contrôler le texte.
Hooks, Actions, Filters, Hooked Functions et Tags
Il y a une certaine confusion à propos de ces termes ci-dessus car ils sont parfois utilisés de manière interchangeable. Mettons les choses au clair :
Hook est un terme générique pour les actions et les filtres.
Les actions vous permettent d’ajouter votre propre fonctionnalité à côté de la fonctionnalité existante.
Les filtres vous permettent de modifier les fonctionnalités existantes.
Parfois, le mot tag est utilisé pour désigner la chaîne qui indique où vous ajoutez votre hook.
Une fonction accrochée ou Hooked Function est une fonction que vous créez qui ajoute ou modifie des fonctionnalités.
L’anatomie d’un Hook
Lorsque nous utilisons des Hooks, nous nous appuyons généralement sur deux fonctions: add_action() et add_filter(). Ces deux fonctions prennent quatre paramètres :
- Le premier paramètre est le tag. C’est le nom ou texte qui indique à WordPress où accrocher votre fonction, quand elle doit être exécutée.
- Le deuxième paramètre doit être le nom de la fonction accrochée.
- Le troisième paramètre est la priorité du hook. Cela détermine l’ordre dans lequel il est exécuté si plusieurs fonctions sont reliées au même tag.
- Le quatrième paramètre définit le nombre de paramètres passés à cette fonction. Par défaut, c’est 1, mais certains tags (comme le précédent wp_insert_post) peuvent en avoir plus.
Tag
Le premier paramètre des deux fonctions est une simple chaîne de caractères qui indique quand la fonction hookée est exécutée. Il existe de très nombreux tags que vous pouvez utiliser. Il existe des tags d’action qui s’exécutent lorsque les publications sont supprimées, les catégories sont créées, un utilisateur est connecté et plus encore. Les tags de filtre sont exécutées sur les messages pour des taxonomies personnalisées, des affichages de titre de publication, des dates, etc. Le Hooks Reference est un bon point de départ, mais parfois une recherche Google peut être plus efficace !
Notez que certains tags peuvent être appelées hooks variables. Il existe un hook nommé “{old_status} to {new_status}” par exemple. Ce hook signifie simplement qu’un certain nombre de crochets sont définis pour les combinaisons. publish_to_trash s’exécuterait lorsqu’un article de publication est mis dans la corbeille, future_to_draft s’exécuterait lorsqu’un article planifié est défini sur l’état de brouillon.
Hooked Function
Encore une fois, une simple chaîne, qui devrait être le nom exact de la fonction. Comme ce sera un nom de fonction, il ne doit contenir que des lettres, des chiffres et des traits de soulignement.
Faites très attention pour rendre cette fonction unique. Si vous nommez une fonction “send_email”, elle peut entrer en conflit avec la fonction de quelqu’un d’autre du même nom. Il est courant de préfixer les noms de fonctions, quelque chose comme: wpk_send_email ou webpick_send_email.
Je vous conseille également de rendre les noms de vos fonctions lisibles. Vous pouvez nommer votre fonction sae(), abréviation de «Send Author Email», mais c’est une très mauvaise pratique car personne d’autre ne saura ce que cela signifie, et vous l’oublierez probablement dans quelques mois également.
La priorité des Hooks
La troisième fonction définit la priorité du hook. Plus la priorité est basse, plus la fonction est exécutée tôt (la priorité 2 s’exécute avant la priorité 15 par exemple). Dans certains cas, l’ordre n’est pas important, mais dans d’autres cas, il est essentiel. Si vous souhaitez envoyer un e-mail de publication de publication à vous-même et à l’auteur, l’ordre n’a pas beaucoup d’importance. Vous pouvez utiliser la valeur par défaut de 10 pour les deux :
add_action( 'wp_insert_post', 'send_author_email', 10, 3 );
add_action( 'wp_insert_post', 'send_admin_email', 10, 3 );
Cependant, si vous souhaitez mettre à jour certaines statistiques chaque fois qu’un article est mis à jour, puis notifier l’auteur, la commande devient soudainement importante :
add_action( 'save_post', 'send_admin_email', 10, 3 );
add_action( 'save_post', 'update_post_stats', 5, 3 );
Comme vous pouvez le voir, l’ordre dans lequel les appels add_action() sont placés n’est pas important. Le deuxième appel a une priorité inférieure, il sera donc exécuté en premier.
Pour les filtres, vous devez être plus prudent. Étant donné que les filtres modifient les données, ils peuvent se remplacer. Si deux filtres sont accrochés à la même balise, celui avec la priorité la plus basse est exécuté en premier. Ensuite, celui avec la priorité la plus élevée est exécuté, ce qui peut changer complètement les données. Souvent, c’est un comportement souhaitable, c’est juste quelque chose dont il faut être conscient.
Les Paramètres
Le quatrième paramètre définit le nombre de paramètres passés à notre fonction hookée. C’est quelque chose que vous devrez rechercher car cela dépend du contenu du code source.
Si vous revenez voir comment nous avons modifié les erreurs de connexion, vous remarquerez la fonction suivante: apply_filters (‘login_errors’, $errors). Le premier paramètre est le tag, les autres sont des arguments. Il n’y en a qu’un ici, donc un argument est passé à notre fonction hookée.
Dans le cas de wp_insert_post(), vous pouvez voir ce qui suit dans les fichiers de base: do_action(‘wp_insert_post’, $post->ID, $post, true);. Le premier paramètre est le tag, les autres sont des arguments, donc la valeur ici est 3.
Les Hooks Personnalisés
L’avantage du système de Hooks est que nous pouvons créer les nôtres. Tout ce dont nous avons besoin, ce sont les deux fonctions familières que nous avons vues: do_action() et apply_filters().
Créons notre propre filtre pour un plugin qui affiche les produits. Dans le pied de page, nous pourrions écrire: «Merci d’avoir utilisé notre plugin d’affichage de produit», que nous permettons aux développeurs de modifier.
Voici comment cela peut être fait :
<p><?php apply_filters( 'product_display_footer', 'Merci d'avoir utilisé notre plugin d'affichage de produit' ) ?></p>
Les actions peuvent être ajoutées de la même manière. Vous pouvez autoriser les utilisateurs à ajouter du contenu sous la description d’un affichage de produit :
<h1><?php the_title() ?></h1>
<div class="description"><?php the_content() ?></div>
<?php do_action( 'below_product_description', $post ) ?>
J’ai utilisé la fonction do_action() pour permettre à d’autres de modifier ma fonctionnalité. J’ai également ajouté l’objet Post en tant que premier paramètre, juste au cas où les gens souhaiteraient ajouter du contenu spécifique à la publication.
Conclusion
Dans cet article, nous avons examiné les bases des crochets. Nous avons appris la différence entre les actions et les filtres et comment les utiliser pour changer efficacement le fonctionnement de WordPress.
Nous avons également examiné comment nous pouvons ajouter nos propres hooks à nos plugins et thèmes. Ceci est extrêmement utile pour rendre notre travail convivial pour les développeurs.
Les hooks font partie du Plugin API, si vous souhaitez en savoir plus à leur sujet, je vous suggère de lire les pages pertinentes dans le Codex WordPress. Plus vous utiliserez de hooks, plus vous les aimerez et apprécierez la puissance et la flexibilité qu’ils offrent.