Le Bootcamp des hooks WordPress : Comment utiliser les actions, les filtres et les hooks personnalisés

Source : https://kinsta.com/fr/blog/hooks-wordpress/

Les hooks WordPress sont l’un des outils les plus importants Ă  avoir dans l’arsenal d’un dĂ©veloppeur WordPress. Ils sont la base du dĂ©veloppement des extensions et des thĂšmes WordPress. Vous pouvez utiliser les nombreux hooks intĂ©grĂ©s Ă  WordPress pour vous « accrocher Â» au cƓur de WordPress avec votre code personnalisĂ© et faire ou modifier quelque chose.

Il existe deux types de hooks WordPress : Actions et Filtres. Les hooks sont si courants que mĂȘme le cƓur de WordPress les utilise lui-mĂȘme largement. WordPress inclut Ă©galement un moyen pour vous de dĂ©finir vos propres hooks personnalisĂ©s afin que d’autres dĂ©veloppeurs puissent s’accrocher Ă  votre code.

Apprendre comment fonctionnent les actions, les filtres et les hooks personnalisés est essentiel pour maßtriser le développement de WordPress.

La premiĂšre moitiĂ© de cet article couvre les bases des hooks WordPress et explique leur fonctionnement Ă  l’aide de multiples exemples. Dans la deuxiĂšme moitiĂ©, vous apprendrez comment les utiliser pour personnaliser WordPress, crĂ©er vos propres hooks personnalisĂ©s et les utiliser pour construire vos propres extensions Ă©volutives.

Cela vous semble excitant ? Plongeons dans le vif du sujet !

Table des matiĂšres

  1. Que sont les hooks WordPress ?
  2. Hooks vs Actions vs Filtres
  3. Comment fonctionnent les hooks WordPress ?
  4. OĂč enregistrer les hooks et leurs fonctions ?
  5. Utilisation des hooks WordPress
  6. Liste et ressources de hooks WordPress
  7. Trouver des hooks enregistrés sur une page WordPress
  8. Le hook « all Â»
  9. OĂč sont stockĂ©s les hooks WordPress ?
  10. Comment créer vos hooks WordPress personnalisés
  11. Suppression des fonctions de rappel des hooks WordPress
  12. Tutoriels WordPress Hooks en prime

Que sont les hooks WordPress ?

Une page WordPress est assemblĂ©e par des tonnes de fonctions et d’interrogations de bases de donnĂ©es. Le cƓur de WordPress, les extensions et le thĂšme travaillent ensemble pour produire les Ă©lĂ©ments de la page tels que le texte, les images, les scripts et les styles. Une fois les Ă©lĂ©ments assemblĂ©s, le navigateur les rassemble et affiche la page.

Les hooks de WordPress vous permettent de vous connecter Ă  ce processus de construction Ă  certains moments et d’exĂ©cuter votre code personnalisĂ©. La principale fonction des hooks est de vous permettre de modifier ou d’ajouter des fonctionnalitĂ©s Ă  WordPress sans toucher aux fichiers du cƓur.

Les hooks vous aideront Ă  Ă©tendre WordPress avec votre propre code
Les hooks vous aideront Ă  Ă©tendre WordPress avec votre propre code

L’API d’extension WordPress alimente la fonctionnalitĂ© des hooks WordPress. Vous utilisez les hooks en appelant certaines fonctions de WordPress appelĂ©es Hook Functions Ă  des instances spĂ©cifiques pendant l’exĂ©cution de WordPress.

GrĂące aux fonctions de hook, vous pouvez regrouper votre code personnalisĂ© dans une fonction de rappel et l’enregistrer avec n’importe quel hook. Une fois enregistrĂ©, ce rappel s’exĂ©cutera oĂč que soit le hook, vous permettant d’augmenter ou de remplacer les fonctions par dĂ©faut de WordPress.

La position du crochet dans le processus d’exĂ©cution du code est un facteur important. Vous en apprendrez davantage sur sa signification dans les sections Ă  venir.Devenez accros au #webdev avec ce guide des hooks WordPress. âšĄïžCLICK TO TWEET

Deux types de hooks WordPress : Actions et filtres

WordPress comprend deux types de crochets appelĂ©s Actions et Filtres. Les actions vous permettent de faire quelque chose Ă  certains points prĂ©dĂ©finis du temps d’exĂ©cution de WordPress, tandis que les filtres vous permettent de modifier toute donnĂ©e traitĂ©e par WordPress et de la return.

Les actions sont définies dans le code WordPress comme suit :

do_action( 'action_name', [optional_arguments] );

La chaĂźne action_name est le nom de l’action. Vous pouvez spĂ©cifier la variable [optional_arguments] pour passer des arguments supplĂ©mentaires Ă  la fonction de rappel. Si ce champ n’est pas spĂ©cifiĂ©, alors sa valeur par dĂ©faut sera vide.

Exemple : L’action do_action( 'wp_head' ) peut ĂȘtre accrochĂ©e pour exĂ©cuter un code personnalisĂ© chaque fois que WordPress traite l’en-tĂȘte du site. Cette action n’a pas d’autres arguments.

Les filtres sont définis comme suit dans le code WordPress

apply_filters( 'filter_name', 'value_to_be_filtered', [optional_arguments] );

La chaĂźne filter_name est le nom du filtre, la variable value_to_be_filtered est la valeur qui doit ĂȘtre filtrĂ©e et retournĂ©e, et la variable [optional_arguments] peut passer des arguments supplĂ©mentaires, tout comme pour les actions.

Exemple : Le filtre apply_filters( 'admin_footer_text' , string $text ) peut ĂȘtre accrochĂ©e pour modifier le texte affichĂ© dans le pied de page de l’administration. Depuis WordPress 5.4, sa valeur par dĂ©faut affichera la phrase Merci de faire de WordPress votre outil de crĂ©ation dans le pied de page de la zone d’administration.

Vous apprendrez plus tard Ă  vous accrocher aux actions et aux filtres grĂące Ă  de nombreux exemples tirĂ©s du cƓur de WordPress.

Une fois accrochĂ©, vous pouvez diriger votre code pour faire ou personnaliser quelque chose sur votre site. Par exemple, vous pouvez utiliser des hooks pour envoyer un e-mail automatisĂ© aprĂšs avoir publiĂ© un article, ou charger des feuilles de style personnalisĂ©es pour modifier l’apparence de votre site.

Les hooks WordPress vous aident Ă  interagir avec votre site web ou Ă  le modifier
Les hooks WordPress vous aident Ă  interagir avec votre site web ou Ă  le modifier

La façon la plus simple de comprendre les hook est d’imaginer votre site WordPress comme la construction d’une maison.

Les hooks s’apparentent Ă  l’utilisation d’une grue pour dĂ©placer des Ă©lĂ©ments de construction d’un cĂŽtĂ© Ă  l’autre. Les Ă©lĂ©ments transfĂ©rĂ©s sont les fonctions de rappel qui comprennent votre code personnalisĂ©. Ces Ă©lĂ©ments (ou fonctions) peuvent vous aider Ă  construire ou Ă  modifier la maison.

Exemple de hook dans l'action « wp_head » de WordPress
Exemple de hook dans l’action « wp_head Â» de WordPress

Les fonctions de rappel (callback) peuvent ĂȘtre des fonctions PHP normales, des fonctions WordPress par dĂ©faut ou des fonctions personnalisĂ©es dĂ©finies par vous.

Nous ne pouvons transporter certains articles que sur des supports spĂ©cifiques attachĂ©s Ă  des hooks particuliers. Ainsi, les actions ne peuvent ĂȘtre accrochĂ©es qu’avec des fonctions d’action. De mĂȘme, les filtres ne peuvent ĂȘtre accrochĂ©s qu’avec des fonctions de filtre.

Alors qu’il est fastidieux de changer les hooks et les supports d’une grue, WordPress le rend super facile en incluant plus de 2 200 types de hooks par dĂ©faut.

WordPress 5.1 a plus de 2200 hooks natifs (Source : Adam Brown)
WordPress 5.1 a plus de 2200 hooks natifs (Source : Adam Brown)

Vous pouvez trouver des hooks rĂ©partis dans le cƓur de WordPress, vous permettant de taper Ă  l’endroit exact oĂč vous voulez vous accrocher et d’exĂ©cuter votre code personnalisĂ©.Les hooks WordPress vous permettent de vous « accrocher » au processus de construction de page … et vous donnent plus de contrĂŽle sur ce que vous crĂ©ez. Â»âšĄïžCLICK TO TWEET

Hooks vs Actions vs Filtres

Selon le manuel des extensions de WordPress :

« Les hooks sont un moyen pour un morceau de code d’interagir / modifier un autre morceau de code
 Il existe deux types de hooks : Actions et Filtres. Â»

Il y a une incohĂ©rence gĂ©nĂ©ralisĂ©e dans la façon dont les termes HookAction et Filtre sont utilisĂ©s. Quelques tutoriels et guides les confondent avec les fonctions qui leur sont associĂ©es. Cette confusion est due en grande partie Ă  la nature complexe du fonctionnement des hooks.

MĂȘme si vous regardez attentivement dans le cƓur de WordPress, vous verrez qu’il n’y a pas beaucoup de diffĂ©rence entre l’ajout d’actions et de filtres. Voici le code source de la fonction add_action() du fichier wp-includes/plugin.php :

function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {      
    return add_filter( $tag, $function_to_add, $priority, $accepted_args );
}

La fonction add_action() appelle simplement la fonction add_filter() et retourne sa valeur. Pourquoi ? Parce qu’elles fonctionnent toutes deux fondamentalement de la mĂȘme maniĂšre, Ă  une diffĂ©rence prĂšs.

La fonction apply_filters() retourne une valeur qui peut modifier les types de donnĂ©es existants, tandis que la fonction do_action() ne renvoie rien (valeur NULL en PHP).

Si vous ĂȘtes encore confus, ne vous inquiĂ©tez pas ! Une fois que vous aurez terminĂ© la premiĂšre moitiĂ© de cet article, tout sera clair. Nous nous en tiendrons Ă  la terminologie officielle du Codex WordPress car elle est claire, prĂ©cise et universelle.

Pour l’instant, familiarisez-vous avec la routine du hook prĂ©sentĂ©e ci-dessous.

La routine du hook : Hooks, fonctions de hook et fonctions de rappel
La routine du hook : Hooks, fonctions de hook et fonctions de rappel

Faisons la part des choses entre les actions et les hooks.

WordPress Hooks
ActionsFilters
Les actions sont utilisĂ©es pour exĂ©cuter des fonctions personnalisĂ©es Ă  un moment prĂ©cis de l’exĂ©cution du cƓur de WordPress.Les filtres sont utilisĂ©s pour modifier ou personnaliser les donnĂ©es utilisĂ©es par d’autres fonctions.
Les actions sont dĂ©finies / crĂ©Ă©es par la fonction do_action( 'action_name' ) dans le code de WordPress.Les filtres sont dĂ©finis / crĂ©Ă©s par la fonction apply_filters( 'filter_name', 'value_to_be_filtered' ) dans le code de WordPress.
Les actions sont Ă©galement appelĂ©es Action hooks.Les filtres sont Ă©galement appelĂ©s Filter hooks.
Les actions ne peuvent ĂȘtre connectĂ©es qu’à des fonctions d’action. Par exemple, add_action()remove_action().Les filtres ne peuvent ĂȘtre accrochĂ©s qu’avec des fonctions de filtre. Par exemple, add_filter()remove_filter().
Les fonctions d’action n’ont pas besoin de faire passer d’arguments à leurs fonctions de rappel.Les fonctions de filtre doivent transmettre au moins un argument à leurs fonctions de rappel.
Les fonctions d’action peuvent effectuer tout type de tĂąche, y compris modifier le comportement du fonctionnement de WordPress.Les fonctions de filtre n’existent que pour modifier les donnĂ©es qui leur sont transmises par les filtres.
Les fonctions d’action ne doivent rien return. Cependant, elles peuvent faire echo Ă  la sortie ou interagir avec la base de donnĂ©es.Les fonctions de filtrage doivent return leurs modifications en sortie. MĂȘme si une fonction de filtre ne change rien, elle doit toujours return l’entrĂ©e non modifiĂ©e.
Les actions peuvent exĂ©cuter presque tout, tant que le code est valide.Les filtres doivent fonctionner de maniĂšre isolĂ©e, afin de ne pas avoir d’effets secondaires involontaires.
RĂ©sumĂ© : une action interrompt le processus normal d’exĂ©cution du code pour faire quelque chose avec les informations qu’elle reçoit, mais ne retourne rien en retour, puis sort.RĂ©sumĂ© : un filtre modifie l’information qu’il reçoit, la renvoie Ă  la fonction d’appel, et d’autres fonctions peuvent utiliser la valeur qu’il retourne.

Parfois, vous pouvez utiliser une action ou un filtre pour atteindre le mĂȘme objectif. Par exemple, si vous souhaitez modifier le texte d’un article, vous pouvez enregistrer une fonction de rappel avec l’action publish_post et modifier le contenu de l’article lors de son enregistrement dans la base de donnĂ©es.

// define the callback function to change the text
function change_text_callback() { 
    // add the code to change text here
}

// hook in to the 'publish_post' action with the add_action() function
add_action( 'publish_post', 'change_text_callback' );

Vous pouvez Ă©galement enregistrer une autre fonction de rappel avec le filtre the_content pour modifier le contenu de l’article avant qu’il ne soit affichĂ© dans le navigateur.

// define the callback function to modify the text
function change_text_another_callback( $content ) { 
    // add the code to change text here and then return it 
    return $filtered_content;
}

// hook in to 'the_content' filter with the add_filter() function
add_filter( 'the_content', 'change_text_another_callback');

Deux approches diffĂ©rentes avec le mĂȘme rĂ©sultat. Savoir quand utiliser l’une plutĂŽt que l’autre est la clĂ© pour ĂȘtre un bon dĂ©veloppeur WordPress.

Comment fonctionnent les hooks WordPress ?

L’exemple de la maison Ă©tait assez simple pour comprendre le fonctionnement de base des hooks, mais il ne rend pas compte de la complexitĂ© de leur fonctionnement. Il s’agit surtout des concepts de position et de spĂ©cificitĂ© des hooks.

Un meilleur exemple serait d’imaginer le traitement d’une page web WordPress comme l’assemblage d’une voiture. Contrairement Ă  la fabrication d’une voiture, qui prend du temps, l’assemblage d’une page web est presque instantanĂ©.

Assembler une page web, c'est comme assembler une voiture
Assembler une page web, c’est comme assembler une voiture

Tout comme une voiture est assemblée piÚce par piÚce dans une chaßne de montage moderne, une page web WordPress est assemblée élément par élément par le serveur et le client.

Le cƓur de WordPress est comme le moteur de la voiture, le chĂąssis et d’autres Ă©lĂ©ments essentiels, qui alimentent la fonctionnalitĂ© du « cƓur Â» du site web.

Vous pouvez avoir un site web fonctionnel avec seulement le cƓur de WordPress, mais oĂč est le plaisir dans tout cela ? Vous devez ajouter des fonctionnalitĂ©s intĂ©ressantes au site. C’est lĂ  qu’interviennent les extensions et les thĂšmes WordPress, qui font tous deux largement appel aux hooks.

Dans l’exemple ci-dessus, chaque station numĂ©rotĂ©e est comme un hook Ă  l’intĂ©rieur du cƓur de WordPress. Il existe deux types de stations, comme les actions et les filtres. Chaque station comprend un type de crĂ©neau spĂ©cifique qui n’accepte que certains outils, comme les fonctions d’action et les fonctions de filtre.

Toutes les stations sont placĂ©es Ă  intervalles frĂ©quents pour des raisons de modularitĂ© et d’efficacitĂ©.

Selon les exigences d’un poste particulier, nous pouvons attacher (ou accrocher) l’outil le plus appropriĂ© pour le travail Ă  ce poste spĂ©cifique. Ces outils sont comme les fonctions de rappel utilisĂ©es pour interagir avec ou modifier WordPress.

Certains outils peuvent modifier considĂ©rablement le fonctionnement de la voiture, un peu comme les rappels enregistrĂ©s pour les actions. D’autres outils ne sont utilisĂ©s que pour personnaliser l’apparence de la voiture, comme les rappels enregistrĂ©s pour les filtres.

Il est essentiel d’utiliser les bons outils dans les bonnes stations pour construire une voiture de premier ordre. De la mĂȘme maniĂšre, les hooks nous aident Ă  personnaliser WordPress en fonction de nos besoins particuliers.

Si vous Ă©tendez cette analogie, les extensions sont comme l’ajout de fonctions automobiles utiles telles que les airbags, la console de divertissement, le systĂšme de tĂ©lĂ©commande sans clĂ©, etc. Les thĂšmes sont analogues Ă  la personnalisation de la partie visuelle de la voiture, comme la conception gĂ©nĂ©rale, la peinture, les jantes, etc. (voici comment personnaliser votre thĂšme WordPress).

OĂč enregistrer les hooks et leurs fonctions ?

Il y a deux façons recommandĂ©es d’ajouter des hooks dans WordPress :

Pour ce tutoriel, commençons par crĂ©er une extension. Pour ce faire, crĂ©ez un nouveau dossier dans votre rĂ©pertoire /wp-content/plugins/.

Je vais nommer mon extension salhooks, mais vous pouvez lui donner le nom que vous voulez. ConformĂ©ment aux directives de WordPress, vous devez crĂ©er un fichier PHP portant le mĂȘme nom (salhooks.php) dans le rĂ©pertoire de votre extension.

Ajoutez les champs d’en-tĂȘte suivants dans le fichier de votre extension pour l’enregistrer avec WordPress. Vous pouvez en savoir plus sur les exigences relatives aux en-tĂȘtes d’extension dans le Codex de WordPress.

<?php

/*
Plugin Name:  Salhooks
Version    :  1.0
Description:  Demonstrating WordPress Hooks (Actions and Filters) with multiple examples.
Author     :  Salman Ravoof
Author URI :  https://www.salmanravoof.com/
License    :  GPLv2 or later
License URI:  https://www.gnu.org/licenses/gpl-2.0.html
Text Domain:  salhooks
*/

//=================================================
// Security: Abort if this file is called directly
//=================================================
if ( !defined('ABSPATH') ) { 
    die;
}

Enregistrez ce fichier, puis activez l’extension dans votre tableau de bord WordPress. Je vais utiliser cette extension dans une installation locale de WordPress pour dĂ©montrer comment fonctionnent les hooks.

Vous pouvez Ă©galement modifier directement les fichiers du cƓur de WordPress pour enregistrer les hooks. Cependant, ce n’est pas recommandĂ© car tout votre code personnalisĂ© sera Ă©crasĂ© chaque fois que vous mettrez Ă  jour WordPress. Vous ne devriez pas ajouter de hooks dans votre thĂšme parent pour la mĂȘme raison.

Utilisation des hooks WordPress

Un hook WordPress ne fait rien en soi. Il se contente de rester dans le code, en attendant qu’une fonction de hook l’active. Pour utiliser un hook, vous devez appeler au moins 2 autres fonctions.

Tout d’abord, vous devez enregistrer le hook avec une fonction de hook et y faire rĂ©fĂ©rence Ă  une fonction de rappel. Ensuite, vous devez dĂ©finir la fonction de rappel que vous avez mentionnĂ©e prĂ©cĂ©demment dans la fonction de hook. WordPress exĂ©cutera cette fonction de rappel Ă  chaque fois que le hook est dĂ©clenchĂ©.

L’ordre dans lequel vous dĂ©finissez ces fonctions n’a pas d’importance, mais il est bon de les placer Ă  proximitĂ© les unes des autres.

Les actions et les filtres ont des fonctions d’accrochage distinctes. DorĂ©navant, nous les appellerons fonctions d’action et fonctions de filtre. Comme vous le verrez, elles ont leur propre syntaxe et leurs propres exigences en matiĂšre de paramĂštres.

  1. Accrocher une action
  2. Accrocher un filtre
  3. Personnaliser la page de connexion WordPress avec des hooks

Accrocher une action

Les actions permettent d’exĂ©cuter votre code personnalisĂ© Ă  un moment particulier de l’exĂ©cution du cƓur, des extensions ou des thĂšmes WordPress.

La fonction d’action add_action()

Vous pouvez enregistrer une fonction de rappel avec une action en suivant ces Ă©tapes :

  1. DĂ©finissez une fonction de rappel avec votre code personnalisĂ© Ă  l’intĂ©rieur. Cette fonction de rappel sera exĂ©cutĂ©e lorsque toute action Ă  laquelle elle est enregistrĂ©e est dĂ©clenchĂ©e pendant l’exĂ©cution du code de WordPress.
  2. Accrochez votre fonction de rappel Ă  l’action que vous voulez avec la fonction add_action(). Comme le prĂ©voit le Codex WordPress, la fonction add_action() doit passer au moins deux paramĂštres :
    • Nom de l’action Ă  laquelle s’accrocher.
    • Nom de la fonction de rappel qui sera exĂ©cutĂ©e lorsque l’action est dĂ©clenchĂ©e.
  3. La fonction add_action() accepte Ă©galement deux paramĂštres optionnels pour fixer la priority et le number of arguments. Nous discuterons de ces deux paramĂštres plus tard.

Il est bon de nommer vos paramÚtres de fonction de rappel aussi prÚs que possible des paramÚtres passés par la fonction du hook.

Voyons un exemple d’utilisation de la fonction add_action().

// define the callback function, the arguments are optional
function example_callback( $arg1, $arg2 ) {
    // make your code do something with the arguments
}

// hook the callback function to the 'example_action'
add_action( 'example_action', 'example_callback', [priority], [no_of_args] );

// 'priority' and 'number of arguments' are optional parameters

Exemple d’accrochage d’une action

WordPress comprend une action intĂ©grĂ©e appelĂ©e init qui se dĂ©clenche aprĂšs que WordPress a fini de charger et d’authentifier l’utilisateur, mais avant que les en-tĂȘtes ne soient envoyĂ©s. De nombreuses extensions utilisent ce hook comme point de dĂ©part pour instancier leur code car presque toutes les principales fonctionnalitĂ©s de WordPress ont fini de se charger au moment oĂč WordPress exĂ©cute cette action.

WordPress a une action similaire appelĂ©e admin_init. Elle se dĂ©clenche pendant que l’écran d’administration est en cours d’initialisation, tandis que l’action init ne se dĂ©clenche qu’une fois que WordPress a fini de se charger.

Lançons un code personnalisĂ© pour faire echo Ă  un simple message pendant l’exĂ©cution d’une action init. Voici comment faire :

function custom_callback_function(){
    // add your custom code here to do something
    echo 'I will be fired on WordPress initialization';
}
add_action( 'init', 'custom_callback_function' );

Vous pouvez voir l’écho du message dans le coin supĂ©rieur gauche de mon installation WordPress locale.

Pas trÚs joli, mais c'est un bon début !
Pas trĂšs joli, mais c’est un bon dĂ©but !

Trouver des actions prises en charge par WordPress

WordPress inclut des actions Ă  chaque fois qu’il fait quelque chose, comme un utilisateur qui se connecte ou qui publie un nouvel article. Vous pouvez trouver une liste complĂšte de toutes les actions exĂ©cutĂ©es par WordPress sur la page Plugin API/Action Reference.

Il y a une action pour presque chaque utilisation
Il y a une action pour presque chaque utilisation

Le Codex a divisĂ© toutes les actions qui y sont Ă©numĂ©rĂ©es en diffĂ©rentes catĂ©gories et les a classĂ©es de la premiĂšre Ă  la derniĂšre dans l’ordre d’exĂ©cution de WordPress.

Dans la plupart des cas, beaucoup de ces actions ne feront rien car rien n’y est accrochĂ©. Mais si vous en avez besoin, elles sont lĂ  pour que vous vous y accrochiez.

Vous vous sentez un peu dĂ©passĂ© par toutes ces actions ? C’est naturel. Au fur et Ă  mesure que vous gagnerez en expĂ©rience et que vous parcourrez le code source du cƓur de WordPress, il vous sera plus facile de trouver le hook parfait pour vos besoins. Il vous suffit de faire une recherche sur le terme « do_action Â» et vous trouverez de nombreuses actions auxquelles vous pourrez vous accrocher.

ParamÚtres supplémentaires pour add_action()

La fonction add_action() peut accepter deux autres paramĂštres : l’un pour fixer la priority et l’autre pour fixer le number of arguments. Bien qu’ils soient optionnels, s’ils sont utilisĂ©s correctement, ils peuvent ĂȘtre trĂšs utiles.

Priority

Le premier paramĂštre supplĂ©mentaire pris en charge par la fonction add_action() fixe la priority. Ce paramĂštre ne peut ĂȘtre qu’un entier positif. Plus le numĂ©ro de prioritĂ© est bas, plus la fonction sera exĂ©cutĂ©e tĂŽt. Sa valeur par dĂ©faut est 10 si vous ne le spĂ©cifiez pas.

Pour voir comment cela fonctionne, enregistrons trois fonctions de rappel Ă  l’action init, mais chacune avec des prioritĂ©s diffĂ©rentes.

// priority is set to 9, which is lower than 10, hence it ranks higher
add_action( 'init', 'i_am_high_priority', 9 );

// if no priority is set, the default value of 10 will be used
add_action( 'init', 'i_am_default_priority');

// priority is set to 11, which is higher than 11, hence it ranks lower
add_action( 'init', 'i_am_low_priority', 11 );

Dans les exemples ci-dessus, la fonction de rappel ayant le numĂ©ro de prioritĂ© le plus bas sera exĂ©cutĂ©e en premier et celle ayant le numĂ©ro le plus Ă©levĂ© sera exĂ©cutĂ©e en dernier. Si leurs prioritĂ©s sont les mĂȘmes, elles seront exĂ©cutĂ©es dans l’ordre dans lequel vous les avez enregistrĂ©es.

La prioritĂ© joue un rĂŽle important lorsqu’un mĂȘme hook peut avoir plusieurs fonctions de rappel enregistrĂ©es avec lui. Pour Ă©viter les rĂ©sultats inattendus, vous pouvez dĂ©finir une prioritĂ© pour chaque fonction de rappel, afin qu’elles se dĂ©clenchent dans l’ordre que vous souhaitez.

Number of arguments

Par dĂ©faut, toute fonction de rappel enregistrĂ©e par la fonction add_action() ne recevra qu’un seul argument. Cependant, il peut arriver que vous deviez transmettre des donnĂ©es supplĂ©mentaires Ă  la fonction de rappel.

C’est pourquoi la fonction add_action() accepte un paramĂštre optionnel pour fixer le nombre d’arguments.

L’action comment_postt en est un bon exemple. Cette action s’exĂ©cute immĂ©diatement aprĂšs que WordPress a ajoutĂ© un commentaire Ă  la base de donnĂ©es. Si vous ne dĂ©finissez pas le paramĂštre du number of arguments, il ne transmettra qu’une seule valeur Ă  la fonction de rappel, qui dans ce cas sera comment_ID.

// register the hook with 'priority' and 'number of arguments' parameters
add_action( 'comment_post', 'show_message_function', 10, 3 );

// define the callback function
function show_message_function( $comment_ID, $comment_approved, $commentdata ) {
    // check whether a comment is approved with the second parameter
    if( 1 === $comment_approved ){
        // runs the code only if the comment is approved
    }
}

Si vous fixez le paramĂštre number of arguments Ă  3 comme dans l’exemple ci-dessus, la fonction d’action passera trois valeurs : comment_IDcomment_approved, et commentdata.

WordPress dĂ©finit la valeur de comment_approved Ă  1 pour les commentaires approuvĂ©s, Ă  0 si non approuvĂ©s, et Ă  « spam Â» si le commentaire est marquĂ© comme indĂ©sirable.

La variable commentdata est un tableau qui comprend toutes les donnĂ©es du commentaire, comme le nom de l’auteur du commentaire, son adresse de messagerie, son site web et le contenu du commentaire lui-mĂȘme. Vous pouvez consulter le Codex WordPress pour trouver toutes les paires de valeurs clĂ©s incluses dans le tableau « commentdata Â».

Vous pouvez avoir autant d’arguments que vous le souhaitez, mais la fonction de rappel et la fonction add_action() doivent spĂ©cifier le mĂȘme nombre d’arguments.

En passant des paramĂštres supplĂ©mentaires Ă  la fonction de rappel, vous pouvez faire plus avec votre code. Par exemple, vous pouvez vĂ©rifier si un commentaire est approuvĂ© ou non et envoyer automatiquement le texte du commentaire Ă  l’administrateur s’il est approuvĂ©. Il n’est pas possible de faire cela sans spĂ©cifier les arguments supplĂ©mentaires car votre fonction de rappel n’aura pas accĂšs aux donnĂ©es de comment_content.

Si vous ne voulez pas fixer la prioritĂ©, mais seulement changer le nombre d’arguments, vous devez quand mĂȘme fixer une prioritĂ©. Il suffit d’utiliser sa valeur par dĂ©faut (c’est-Ă -dire 10).

Comment le cƓur de WordPress utilise les actions

Le cƓur de WordPress lui-mĂȘme utilise un grand nombre de ses actions intĂ©grĂ©es pour exĂ©cuter diverses fonctions.

Prenez l’action wp_head par exemple. Elle est dĂ©clenchĂ©e lorsque WordPress affiche la section d’en-tĂȘte des pages web (le code qui va de <head> Ă  </head>).

Vous pouvez trouver la plupart des fonctions d’action du cƓur de WordPress Core liĂ©es au hook wp_head dans le fichier wp-includes/default-filters.php. J’ai parcouru le code et compilĂ© une liste de toutes les fonctions add_action() qui invoquent l’action wp_head.

add_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );
add_action( 'wp_head', '_wp_render_title_tag', 1 );
add_action( 'wp_head', 'wp_enqueue_scripts', 1 );
add_action( 'wp_head', 'wp_resource_hints', 2 );
add_action( 'wp_head', 'feed_links', 2 );
add_action( 'wp_head', 'feed_links_extra', 3 );
add_action( 'wp_head', 'rsd_link' );
add_action( 'wp_head', 'wlwmanifest_link' );
add_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
add_action( 'wp_head', 'locale_stylesheet' );
add_action( 'wp_head', 'noindex', 1 );
add_action( 'wp_head', 'print_emoji_detection_script', 7 );
add_action( 'wp_head', 'wp_print_styles', 8 );
add_action( 'wp_head', 'wp_print_head_scripts', 9 );
add_action( 'wp_head', 'wp_generator' );
add_action( 'wp_head', 'rel_canonical' );
add_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
add_action( 'wp_head', 'wp_custom_css_cb', 101 );
add_action( 'wp_head', 'wp_site_icon', 99 );
add_action( 'wp_head', 'wp_no_robots' );

Cela fait beaucoup de fonctions de rappel accrochĂ©es Ă  une seule action. Il est essentiel de fixer la priority pour s’assurer que les fonctions de rappel les plus importantes se lancent en premier.

Dans l’exemple ci-dessus, le chargement des scripts avec la fonction de rappel wp_enqueue_scripts() est plus important (priority = 1) que le chargement des balises mĂ©ta de l’icĂŽne du site avec la fonction de rappel wp_site_icon() (priority = 99).

Info

Toutes les fonctions de rappel utilisĂ©es dans l’exemple ci-dessus sont des fonctions de WordPress. Vous pouvez Ă©galement les utiliser dans n’importe quel code. Visitez la page de rĂ©fĂ©rence des fonctions sur le Codex WordPress pour plus d’informations.

Autres fonctions d’action

Bien que add_action() soit la fonction d’action la plus utilisĂ©e, il en existe beaucoup d’autres qui sont tout aussi utiles. Voyons comment elles fonctionnent toutes.

Cette fonction d’action vĂ©rifie si une action a Ă©tĂ© accrochĂ©e. Elle accepte deux paramĂštres. Le premier est le nom de l’action. Le second paramĂštre est facultatif et est le nom de la fonction de rappel.

has_action( 'action_name', 'function_to_check' );

Si vous ne spĂ©cifiez que le premier paramĂštre, cela renvoie true si une fonction est accrochĂ©e au paramĂštre action_name.

Mais si vous spĂ©cifiez Ă©galement le second paramĂštre, cela retournera false si la fonction de rappel spĂ©cifiĂ©e n’est pas enregistrĂ©e pour l’action mentionnĂ©e.

S’il trouve la fonction de rappel attachĂ©e Ă  l’action du hook, cela renvoie la priority (un entier) fixĂ©e pour cette fonction sur cette action de hook.

Nous avons dĂ©jĂ  rencontrĂ© cette fonction d’action. WordPress l’utilise pour dĂ©finir toutes ses actions par dĂ©faut, ce qui permet Ă  d’autres fonctions de s’y raccrocher. Tout comme WordPress, vous pouvez Ă©galement utiliser la fonction do_action() pour crĂ©er une nouvelle action personnalisĂ©e en spĂ©cifiant un nouveau nom d’action comme paramĂštre.

do_action( 'action_name', [argument1], [argument2] );

Le simple fait de dĂ©clarer cette fonction ne fera rien en soi. Mais elle restera dans le code, en attendant que d’autres fonctions d’action l’activent. La transmission d’arguments supplĂ©mentaires est facultative, mais elle est importante si vous voulez que vos fonctions de rappel les utilisent.

Cette fonction d’action est identique Ă  do_action(), Ă  une diffĂ©rence prĂšs. Tout argument qui lui est passĂ© doit ĂȘtre un tableau. Lorsque vous avez beaucoup d’arguments Ă  passer ou que vos arguments sont dĂ©jĂ  dans un tableau, cette fonction est trĂšs utile.

// here's an example array
$arguments_array = array( 'arg_1', 'foo', true, 'arg_4' );

do_action_ref_array( 'example_action', $arguments_array );

Comme les tableaux PHP sont une carte ordonnée, assurez-vous que les arguments que vous passez sont dans le bon ordre.

L’action admin_bar_menu est un exemple de l’utilisation de cette fonction d’action. Elle peut ĂȘtre accrochĂ©e pour ajouter, manipuler ou supprimer les diffĂ©rents Ă©lĂ©ments de la barre d’administration. Tous les Ă©lĂ©ments de la barre d’administration sont dĂ©finis comme des Ă©lĂ©ments d’un tableau.

Si vous voulez compter le nombre de fois qu’une action est dĂ©clenchĂ©e, vous pouvez invoquer cette fonction d’action.

did_action( 'action_name' );

Cette fonction retourne une valeur entiĂšre.

La fonction did_action() est extrĂȘmement pratique lorsque vous souhaitez exĂ©cuter une fonction de rappel uniquement la premiĂšre fois qu’une action est exĂ©cutĂ©e et jamais plus ensuite.

function example_callback_function() {
    if( did_action( 'example_action' ) === 1 ) {
    // checks if the 'example_action' hook is fired once, and only runs then, and never again!
    }
}
add_action('example_action', 'example_callback_function');

Cette fonction d’action supprime une fonction de rappel liĂ©e Ă  l’action spĂ©cifiĂ©e. Par exemple, vous pouvez utiliser cette fonction pour supprimer les fonctions de WordPress par dĂ©faut accrochĂ©es aux actions intĂ©grĂ©es et les remplacer par les vĂŽtres.

remove_action( 'action_name', 'function_to_be_removed', [priority] );

Il y a quelques conditions prĂ©alables Ă  l’appel de la fonction remove_action() :

  1. Les paramĂštres function_to_be_removed et priority doivent ĂȘtre les mĂȘmes que ceux utilisĂ©s Ă  l’origine dans la fonction add_action().
  2. Vous ne pouvez pas appeler la fonction remove_action() directement. Vous devez l’appeler depuis une autre fonction.
  3. Si la fonction de rappel est enregistrĂ©e depuis une classe, sa suppression a d’autres exigences. Vous pouvez consulter la documentation du Codex WordPress pour plus de dĂ©tails.
  4. Vous ne pouvez pas supprimer la fonction de rappel avant qu’elle ne soit enregistrĂ©e ou aprĂšs qu’elle ait Ă©tĂ© exĂ©cutĂ©e.

Voici un exemple de la façon dont WooCommerce utilise cette fonction d’action pour supprimer la miniature par dĂ©faut du produit sur la page principale de la boutique.

remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );

Cette fonction d’action supprime tout ce qui est liĂ© Ă  une action. Le paramĂštre de prioritĂ© est facultatif.

remove_all_actions( 'action_name', [priority] );

N’oubliez pas que cette fonction ne peut pas ĂȘtre appelĂ©e Ă  partir de l’action dont vous souhaitez annuler les fonctions de rappel. Cela provoquerait une boucle infinie. Vous pouvez vous connecter Ă  une action qui a Ă©tĂ© lancĂ©e plus tĂŽt pour exĂ©cuter cette fonction sans aucune erreur.

Cette fonction d’action vĂ©rifie si l’action spĂ©cifiĂ©e est en cours d’exĂ©cution ou non. Elle renvoie une valeur boolĂ©enne (true ou false).

// check whether the 'action_name' action is being executed
if ( doing_action( 'action_name' ) ) {
    // execute your code here
}

Vous pouvez laisser le paramĂštre action_name vide pour vĂ©rifier si une action est en cours d’exĂ©cution. Cela retournera true Ă  chaque fois qu’une action est exĂ©cutĂ©e.

// check if any action is running and do something
if ( doing_action() ) {
    // the code here is run when any action is fired
}

Exemple d’actions 1 : Afficher un message de maintenance aux visiteurs de votre site

Parfois, il est prĂ©fĂ©rable de mettre votre site hors ligne et de crĂ©er une page de maintenance. Heureusement, WordPress offre un moyen facile de le faire.

// show a maintenance message for all your site visitors
add_action( 'get_header', 'maintenance_message' );
function maintenance_message() {
    if (current_user_can( 'edit_posts' )) return;
    wp_die( '<h1>Stay Pawsitive!</h1><br>Sorry, we\'re temporarily down for maintenance right meow.' );
}

DĂ©composons le code et passons en revue chaque Ă©tape :

  • get_header est une action qui se dĂ©clenche avant le chargement du fichier de modĂšle d’en-tĂȘte du site. C’est une action parfaite Ă  laquelle se raccorder si vous voulez interrompre le chargement du site principal.
  • Accrochez-vous Ă  l’action get_header en utilisant la fonction add_action() avec la fonction de rappel maintenance_message().
  • DĂ©finissez la fonction de rappel maintenance_message().
  • current_user_can( 'edit_posts' ) est une fonction de test de capacitĂ© de l’utilisateur qui vĂ©rifie si l’utilisateur actuel est connectĂ© et peut modifier des articlesChaque utilisateur enregistrĂ© sur un site WordPress, Ă  l’exception de ceux qui ont un rĂŽle d’abonnĂ©, a la possibilitĂ© de modifier des articles. Il existe d’autres moyens robustes d’effectuer ce contrĂŽle, mais nous nous en tiendrons Ă  cette mĂ©thode simple ici.
  • Utilisez la fonction par dĂ©faut wp_die() pour stopper l’exĂ©cution de WordPress avec grĂące et afficher une page HTML avec un message d’erreur. Vous pouvez utiliser la syntaxe HTML dans le paramĂštre du message d’erreur pour le formater.

AprĂšs avoir enregistrĂ© le code dans mon extension personnalisĂ©e, j’ai chargĂ© mon installation locale de WordPress en mode de navigation privĂ©e. La page Â« En maintenance Â» est un succĂšs !

Afficher un message d'erreur aux visiteurs du site
Afficher un message d’erreur aux visiteurs du site

Le site se charge correctement si je suis connectĂ© car il passe le test de capacitĂ© de l’utilisateur. Vous pouvez maintenant continuer Ă  travailler Ă  la rĂ©paration de votre site pendant qu’il affiche cette page pour les visiteurs normaux.

Exemple d’actions 2 : Masquer les Ă©lĂ©ments de menu du tableau de bord aux utilisateurs non administrateurs

Si vous gĂ©rez un blog avec plusieurs auteurs ou un site pour vos clients, vous devrez peut-ĂȘtre masquer certains menus d’administration du tableau de bord de WordPress pour les utilisateurs non administrateurs. Vous pouvez le faire en vous accrochant Ă  l’action admin_menu.

// remove specific dashboard menus for non-admin users
add_action( 'admin_menu', 'hide_admin_menus' );
function hide_admin_menus() {
    if (current_user_can( 'create_users' )) return;
    if (wp_get_current_user()->display_name == "Salman") return; 
    remove_menu_page( 'plugins.php' ); 
    remove_menu_page( 'themes.php' ); 
    remove_menu_page( 'tools.php' ); 
    remove_menu_page( 'users.php' ); 
    remove_menu_page( 'edit.php?post_type=page' ); 
    remove_menu_page( 'options-general.php' );
}

Voici un aperçu Ă©tape par Ă©tape de l’extrait de code ci-dessus :

  • admin_menu est une action qui se dĂ©clenche avant le chargement du menu d’administration dans la zone du tableau de bord de WordPress.
  • Accrochez-vous Ă  l’action admin_menu Ă  l’aide de la fonction add_action() en utilisant la fonction de rappel hide_admin_menus().
  • La fonction de rappel hide_admin_menus() dĂ©finit la logique du code. Elle est exĂ©cutĂ©e Ă  chaque fois que se dĂ©clenche l’action admin_menu.
  • Dans la fonction de rappel, la fonction current_user_can( 'create_users' ) vĂ©rifie si l’utilisateur connectĂ© est un administrateur. Étant donnĂ© que seuls les administrateurs de site ont la capacitĂ© create_user, la fonction se termine par une dĂ©claration return si l’utilisateur est un administrateur.
  • La fonction WordPress wp_get_current_user() rĂ©cupĂšre l’objet current user. Avec cette fonction, nous pouvons vĂ©rifier si l’utilisateur connectĂ© a un display_name particulier. Cette ligne est facultative, au cas oĂč vous souhaiteriez Ă©viter que certains utilisateurs non administrateurs soient bloquĂ©s en raison de cette fonction de rappel.
  • La fonction remove_menu_page() de WordPress supprime les menus d’administration de haut niveau. Dans l’exemple de code ci-dessus, je supprime les menus d’administration suivants : Extensions, ThĂšmes, Outils, Utilisateurs, Pages et Options.

AprĂšs avoir enregistrĂ© le fichier de l’extension, voici un aperçu du tableau de bord de WordPress avec un administrateur connectĂ©.

Le tableau de bord par défaut de l'administrateur de WordPress
Le tableau de bord par dĂ©faut de l’administrateur de WordPress

Et voici une capture d’écran du tableau de bord de WordPress avec un utilisateur non administrateur connectĂ©.

Masquer les éléments sensibles du menu d'administration aux utilisateurs non-administrateurs
Masquer les Ă©lĂ©ments sensibles du menu d’administration aux utilisateurs non-administrateurs

Cette solution ne fait que masquer les Ă©lĂ©ments du menu d’administration spĂ©cifiĂ©s pour qu’ils n’apparaissent pas dans le tableau de bord de WordPress. Tous les utilisateurs peuvent toujours y accĂ©der en saisissant les URL des menus dans leur navigateur.

Pour dĂ©sactiver l’accĂšs de certains rĂŽles d’utilisateur Ă  des menus spĂ©cifiques, vous devez modifier leurs capacitĂ©s.

Accrocher un filtre

Les filtres permettent Ă  votre code personnalisĂ© de modifier les donnĂ©es utilisĂ©es par d’autres fonctions de WordPress. Contrairement aux actions, les fonctions liĂ©es aux filtres doivent retourner une valeur.

La fonction de filtre add_filter()

Vous pouvez accrocher une fonction de rappel Ă  un filtre en suivant les Ă©tapes suivantes :

  1. DĂ©finissez une fonction de rappel qui sera exĂ©cutĂ©e lorsque WordPress lancera le filtre. Les fonctions de rappel pour les filtres doivent avoir au moins un argument spĂ©cifiĂ©, car tous les filtres transmettent au moins une valeur Ă  leurs fonctions de rappel.
  2. Enregistrez la fonction de rappel à un filtre avec la fonction add_filter(). Le filtre se chargera d’appeler la fonction de rappel. Selon le Codex WordPress, la fonction add_filter() doit passer au moins deux paramùtres :
    • Le nom du filtre auquel s’accrocher.
    • Le nom de la fonction de rappel qui sera exĂ©cutĂ©e lorsque le filtre se dĂ©clenchera.
  3. La fonction add_filter() accepte Ă©galement deux paramĂštres optionnels supplĂ©mentaires pour fixer la priority et le number of arguments. Ces paramĂštres fonctionnent de la mĂȘme maniĂšre que la fonction add_action().

Voici un exemple de la façon dont vous pouvez utiliser la fonction add_filter() pour accrocher une fonction de rappel Ă  un filtre.

// define the filter callback function with at least one argument passed
// the number of arguments that you can pass depends on how the filter is defined
function filter_callback_function( $arg1, $arg2 ) {
    // make your code do something with the arguments and return something
    return $something;
}

// now hook the callback function to the 'example_filter'
add_filter( 'example_filter', 'filter_callback_function', [priority], [no_of_args] );

// '10' is the default priority set for the callback function
// and '1' is the default number of arguments passed

Exemple d’accrochage d’un filtre

WordPress fournit un filtre appelĂ© login_message pour filtrer le message affichĂ© sur la page de connexion au-dessus du formulaire de connexion. La valeur renvoyĂ©e par ce filtre peut avoir un balisage HTML.

Accrochez-vous au filtre « login_message Â» et modifiez le message affichĂ© sur l’écran de connexion.

// show a custom login message above the login form
function custom_login_message( $message ) {
    if ( empty( $message ) ) {
        return "<h2>Welcome to Let's Develop by Salman Ravoof! Please log in to start learning.</h2>";
    } 
    else {
        return $message;
    }
}
add_filter( 'login_message', 'custom_login_message' );

La dĂ©claration if-else de la fonction de rappel vĂ©rifie si le message de connexion est dĂ©jĂ  dĂ©fini, le plus souvent par une autre extension ou un autre thĂšme. Dans ce cas, la fonction de rappel renvoie la valeur originale sans la modifier. C’est une façon d’éviter les conflits avec d’autres extensions ou thĂšmes.

Vous pouvez voir le message s’afficher au-dessus du formulaire de connexion dans la page de connexion de WordPress.

Affichage d'un message de connexion personnalisé au-dessus du formulaire de connexion
Affichage d’un message de connexion personnalisĂ© au-dessus du formulaire de connexion

Vous pouvez styliser tous les éléments de la page de connexion en appelant des feuilles de style personnalisées. Cela vous permettra de personnaliser entiÚrement votre page de connexion WordPress par défaut.

Vous apprendrez comment charger des feuilles de style personnalisĂ©es Ă  l’aide d’actions dans la section « Personnaliser la page de connexion Ă  WordPress avec des hooks Â».

Trouver les filtres pris en charge par WordPress

Partout oĂč WordPress traite ou modifie des donnĂ©es, vous pouvez presque certainement trouver un filtre auquel vous accrocher et le modifier. ConsidĂ©rez les filtres comme une interface entre la base de donnĂ©es WordPress et le navigateur.

Vous pouvez trouver une liste exhaustive de tous les filtres supportĂ©s par WordPress dans la page Plugin API/Filter Reference.

WordPress offre une variĂ©tĂ© de filtres auxquels il est possible de s’accrocher
WordPress offre une variĂ©tĂ© de filtres auxquels il est possible de s’accrocher

Tous les filtres qui y sont listĂ©s sont divisĂ©s en plusieurs catĂ©gories et classĂ©s de haut en bas dans l’ordre d’exĂ©cution de WordPress.

Si vous souhaitez trouver des filtres Ă  intĂ©grer dans le code source de WordPress, faites une recherche avec le terme « apply_filters Â» et vous obtiendrez des tonnes de rĂ©sultats. La rĂ©fĂ©rence du code WordPress est Ă©galement un excellent endroit pour rechercher tout ce qui est inclus dans WordPress, y compris les actions et les filtres.

Comment le cƓur de WordPress utilise les filtres

Le cƓur de WordPress lui-mĂȘme utilise beaucoup de ses filtres intĂ©grĂ©s pour modifier les donnĂ©es utilisĂ©es par ses diffĂ©rentes fonctions.

Prenons par exemple le filtre the_content. Il filtre le contenu des articles aprĂšs qu’il ait Ă©tĂ© extrait de la base de donnĂ©es et avant qu’il ne soit affichĂ© sur le navigateur.

Tout comme pour les actions, vous pouvez trouver la plupart des fonctions de filtrage de WordPress Core liĂ©es au hook the_content dans le fichier wp-includes/default-filters.php.

Voici une liste de toutes les fonctions add_filter() du cƓur base qui s’accrochent au filtre the_content :

add_filter( 'the_content', 'do_blocks', 9 );
add_filter( 'the_content', 'wptexturize' );
add_filter( 'the_content', 'convert_smilies', 20 );
add_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'shortcode_unautop' );
add_filter( 'the_content', 'prepend_attachment' );
add_filter( 'the_content', 'wp_make_content_images_responsive' );
add_filter( 'the_content', 'do_shortcode', 11 ); // AFTER wpautop(). 

Notez la priorité spécifiée pour certaines fonctions de rappel.

Par exemple, la fonction do_blocks() analyse tous les blocs dynamiques du contenu de l’article et les rend compatibles avec le nouvel Ă©diteur de blocs de WordPress. Elle a une prioritĂ© plus Ă©levĂ©e que la valeur par dĂ©faut (10) afin de s’assurer que le contenu est prĂȘt Ă  recevoir des blocs avant que les autres fonctions ne soient exĂ©cutĂ©es.

La fonction convert_smilies() est configurĂ©e pour fonctionner avec une prioritĂ© infĂ©rieure, car sa tĂąche consiste Ă  convertir les smileys de texte en sprites d’image. Il est logique de l’exĂ©cuter Ă  la fin aprĂšs avoir filtrĂ© tout le contenu de l’article.

Fait amusant : les codes courts sont un sous-ensemble de filtres. Ils reçoivent les donnĂ©es d’entrĂ©e du code court, les traitent, puis lui renvoient les donnĂ©es de sortie. Pour en savoir plus sur les codes courts, consultez ce guide des codes courts WordPress.

Autres fonctions de filtre

Bien que add_filter() soit la fonction de filtre la plus utilisĂ©e, il existe de nombreuses autres fonctions de filtre utiles. Examinons-les toutes en dĂ©tail.

Cette fonction vérifie si le filtre spécifié est accroché par une fonction quelconque. Elle accepte deux paramÚtres. Le premier paramÚtre sert à saisir le nom du filtre. Le second paramÚtre est facultatif et sert à saisir le nom de la fonction de rappel.

has_filter( 'filter_name', 'function_to_check' );

Si vous ne spĂ©cifiez que le premier paramĂštre, il retournera true si le filter_name est accrochĂ© par une fonction quelconque.

Cependant, si vous spĂ©cifiez les deux paramĂštres, il retournera false si la fonction de rappel mentionnĂ©e n’est pas enregistrĂ©e avec le filtre donnĂ©. S’il trouve la fonction de rappel enregistrĂ©e avec le filtre, il renvoie alors la priority (un entier) dĂ©finie pour cette fonction sur ce filtre.

Une application possible de la fonction has_filter() est de vĂ©rifier si un filtre a dĂ©jĂ  Ă©tĂ© accrochĂ© et, sur cette base, de procĂ©der Ă  l’exĂ©cution du code.

// check to see if 'the_content' filter has been hooked
if ( ! has_filter( 'the_content' ) {
    // hook the filter if and only if it hasn't been hooked before
    add_filter( 'the_content', 'modify_the_content' );
}

Cette fonction de filtre est comme la fonction d’action do_action(). Toute fonction de rappel liĂ©e Ă  ce filtre sera exĂ©cutĂ©e lĂ  oĂč cette fonction se trouve dans le code WordPress.

Vous pouvez également utiliser cette fonction pour créer un nouveau filtre personnalisé en spécifiant le nom du filtre et la valeur du filtre comme paramÚtres.

apply_filters( 'filter_name', 'value_to_filter', [argument1], [argument2] );

N’oubliez pas de prĂ©ciser les arguments supplĂ©mentaires si vous souhaitez les transmettre Ă  vos fonctions de rappel. La plupart des filtres n’utilisent qu’un seul argument, il est donc facile de ne pas dĂ©finir les arguments supplĂ©mentaires.

Cette fonction est semblable Ă  la fonction apply_filters(), sauf que tous les arguments qu’elle accepte sont regroupĂ©s dans un tableau.

// an example array
$arguments_array = array( 'some_value', 'foo', false, 'another_value' );

apply_filters_ref_array( 'example_filter', $arguments_array );

Cette fonction de filtre peut ĂȘtre pratique lorsque vous avez de nombreux arguments Ă  faire valoir ou si tous sont dĂ©jĂ  dans un tableau. Assurez-vous que les arguments Ă  l’intĂ©rieur du tableau sont dans le bon ordre.

Cette fonction de filtre rĂ©cupĂšre le nom du filtre ou de l’action en cours d’exĂ©cution. Vous n’avez pas besoin de spĂ©cifier de paramĂštres car elle s’exĂ©cute dans le cadre de la fonction de rappel.

Voici un exemple de son utilisation :

function example_callback() {
    echo current_filter(); // 'the_title' will be echoed
    return
}
add_filter( 'the_title', 'example_callback' );

Malgré son nom, cette fonction peut récupérer le nom des actions et des filtres.

Cette fonction de filtre supprime la fonction de rappel attachĂ©e au filtre spĂ©cifiĂ©. Elle fonctionne exactement comme la fonction remove_action(). Vous pouvez l’utiliser pour supprimer les fonctions WordPress par dĂ©faut enregistrĂ©es avec un filtre spĂ©cifique, et si nĂ©cessaire les remplacer par vos propres fonctions.

remove_filter( 'filter_name', 'function_to_be_removed', [priority] );

Pour libĂ©rer une fonction de rappel accrochĂ©e Ă  un filtre, les paramĂštres function_to_be_removed et priority doivent ĂȘtre identiques aux arguments utilisĂ©s lors de l’accrochage de la fonction de rappel.

Si le filtre a Ă©tĂ© ajoutĂ© Ă  partir d’une classe, ce qui est gĂ©nĂ©ralement le cas lorsqu’ils sont ajoutĂ©s par des extensions, vous devez alors accĂ©der Ă  la variable de classe pour supprimer le filtre.

// access the class variable first, and then remove the filter through it
global $some_class;

remove_filter( 'the_content', array($some_class, 'class_filter_callback') );

Voici un excellent exemple d’utilisation de remove_filter().

L’extension WooCommerce utilise la fonction d’appel wc_lostpassword_url() reliĂ©e Ă  son filtre lostpassword_url pour rediriger « Mot de passe perdu ? Â» des utilisateurs.

Tout utilisateur qui clique sur ce lien est dirigĂ© vers une page personnalisĂ©e avec l’URL /my-account/lost-password. Sans ce filtre, ils seraient dirigĂ©s vers l’URL de connexion standard de WordPress, Ă  l’adresse /wp-login.php.

Si vous voulez rĂ©initialiser cette fonctionnalitĂ© et envoyer vos utilisateurs Ă  la page de rĂ©cupĂ©ration de mot de passe par dĂ©faut ou Ă  une page sĂ©parĂ©e. Vous pouvez supprimer cette fonction de rappel comme ceci :

remove_filter( 'lostpassword_url', 'wc_lostpassword_url', 10 ); 

Cette fonction de filtre supprime toutes les fonctions de rappel enregistrées sur un filtre.

remove_all_filters( 'filter_name', [priority] );

Elle est similaire Ă  la fonction remove_all_actions().

L’extension populaire Advanced Excerpts utilise cette fonction pour supprimer toutes les fonctions par dĂ©faut liĂ©es aux filtres the_excerpt et get_the_excerpt. AprĂšs avoir fait cela, elle accroche ensuite sa propre fonction de rappel au filtre.

// Ensure our filter is hooked, regardless of the page type 
if ( ! has_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) ) ) {
    remove_all_filters( 'get_the_excerpt' ); 
    remove_all_filters( 'the_excerpt' ); 
    add_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) );
}

Cette fonction de filtre vĂ©rifie si le filtre spĂ©cifiĂ© est en cours d’exĂ©cution Ă  ce moment.

if ( doing_filter( 'save_post' ) ) {
    // run your code here
}

Cela retourne une valeur boolĂ©enne (true ou false).

Vous devez noter la diffĂ©rence entre cette fonction et la fonction current_filter(), qui renvoie le nom du filtre ou de l’action en cours d’exĂ©cution (une chaĂźne de caractĂšres).

Exemple de filtres 1 : ajout d’un filtre de blasphùmes pour les commentaires

La gestion de tous les commentaires sur votre site WordPress peut ĂȘtre un processus lourd. Le filtre comment_text vous permet de dĂ©finir des rĂšgles pour modifier les commentaires avant qu’ils ne soient affichĂ©s Ă  l’écran.

Commentaires non filtrés avec des blasphÚmes factices marqués
Commentaires non filtrés avec des blasphÚmes factices marqués

Vous pouvez demander Ă  WordPress de supprimer automatiquement les jurons avant qu’ils ne soient affichĂ©s aux visiteurs de votre site. Allons-y.

// hook into the 'comment_text' filter with the callback function
add_filter( 'comment_text', 'the_profanity_filter' );

// define a callback function to filter profanities in comments 
function the_profanity_filter( $comment_text ) {
    // define an array of profane words and count how many are there 
    $profaneWords = array('fudge', 'darn', 'pickles', 'blows', 'dangit');
    $profaneWordsCount = sizeof($profaneWords);
    
    // loop through the profanities in $comment_text and replace them with '*'
    for($i=0; $i < $profaneWordsCount; $i++) {
        $comment_text = str_ireplace( $profaneWords[$i], str_repeat('*', strlen( $profaneWords[$i]) ), $comment_text );
    } 
    
    return $comment_text;
}

Voici une explication ligne par ligne du code :

  • comment_text est un filtre qui vous permet de modifier le texte d’un commentaire avant que le navigateur ne l’affiche. Vous pouvez enregistrer votre fonction de rappel avec lui pour filtrer sa sortie.
  • La fonction add_filter() vous permet de vous connecter au filtre comment_text et de lui associer une fonction de rappel.
  • the_profanity_filter() est le nom de la fonction de rappel. Elle n’accepte qu’un seul paramĂštre, qui est une chaĂźne de caractĂšres contenant le texte du commentaire. DĂ©finissez cette fonction personnalisĂ©e avec la logique de code appropriĂ©e.
  • Stockez tous les mots profanes dans un tableau PHP appelĂ© profaneWords. Vous pouvez ajouter autant de mots que vous le souhaitez Ă  ce tableau. Je stocke la taille de ce tableau dans la variable profaneWordsCount Ă  l’aide de la fonction PHP sizeof().
  • Passez en boucle tous les mots profanes et utilisez la fonction str_ireplace() par dĂ©faut de PHP pour remplacer tous les jurons correspondants par des symboles *. Comme il s’agit d’une fonction de remplacement de chaĂźne insensible Ă  la casse, vous n’avez pas Ă  vous soucier des majuscules.
  • Utilisez return pour afficher le texte de commentaire filtrĂ©.

Enregistrez les changements dans votre fichier d’extension personnalisĂ©e et rechargez tout message avec des commentaires. Tous les mots que vous avez inclus dans le tableau profaneWords doivent maintenant ĂȘtre remplacĂ©s par des symboles « * Â».

Remplacement des jurons dans les commentaires par des symboles « * ».
Remplacement des jurons dans les commentaires par des symboles « * Â».

Les commentaires originaux seront toujours disponibles tels quels dans la base de donnĂ©es. Ce filtre ne modifie que le texte du commentaire avant qu’il ne soit transmis Ă  l’interface publique.

Le commentaire original sur l’administration du site
Le commentaire original sur l’administration du site

Une fois que vous ĂȘtes accrochĂ© au bon filtre, vous pouvez faire beaucoup de choses sympas avec lui.

Par exemple, vous pouvez Ă©galement utiliser le filtre comment_text pour supprimer les URLs de tous les commentaires (assurez-vous de lire ce guide dĂ©taillĂ© sur la maniĂšre de bloquer les commentaires indĂ©sirables dans WordPress).

Vous pouvez Ă©galement vous accrocher au filtre pre_comment_approved et marquer les commentaires comme approuvĂ©s, indĂ©sirables ou dans la corbeille en fonction de critĂšres prĂ©dĂ©finis.

Exemple de filtres 2 : Insérer un contenu aprÚs un article

Vous avez dĂ©jĂ  vu comment WordPress utilise le filtre the_content pour modifier le contenu d’un article ou d’une page. Utilisons le mĂȘme filtre pour ajouter quelque chose Ă  la fin de chaque article.

// hook into 'the_content' filter with a callback function
add_filter( 'the_content', 'insert_content_below' );

// define the callback function to insert something below the post
function insert_content_below( $content ) {
    // check to see if we're inside the main loop in a single post
    if ( is_single() && in_the_loop() && is_main_query() ) {
        return $content . "<h3 style=\"text-align: center;\">Let me insert myself here</h3><p style=\"text-align: center;border: 3px solid #5333ed;\">I'll appear after the post. You can insert anything here. Even HTML. Headers, links, images, scripts, I'll take them all and append it to the end of the post content. You can also give me a class, so you can style me easily with CSS style sheets.</p>" ;
    } 
    
    return $content;
}

Comprennons la logique du code dans l’exemple ci-dessus :

  • Le filtre de hook the_content vous aide Ă  rĂ©cupĂ©rer le contenu de l’article en cours et Ă  le personnaliser.
  • Utilisez la fonction add_filter() pour vous connecter au filtre the_content avec la fonction de rappel insert_content_below().
  • DĂ©finissez la fonction de rappel en passant le contenu de l’article en cours comme paramĂštre ($content).
  • Dans la fonction de rappel, vĂ©rifiez que vous ne filtrez que le contenu de la requĂȘte principale, qui dans ce cas est le contenu de l’article. Si vous ne le vĂ©rifiez pas, le code filtrera parfois involontairement le contenu d’autres endroits, comme les colonnes latĂ©rales et les pieds de page.
  • is_main_query() et in_the_loop() dĂ©terminent si la requĂȘte est une requĂȘte principale et se produit dans la boucle principale de WordPress.
  • is_single() vĂ©rifie sous condition si la requĂȘte porte sur un article individuel.
  • Utilisez l’opĂ©rateur de concatĂ©nation de chaĂźnes de PHP ($content . "your additions") pour ajouter des Ă©lĂ©ments supplĂ©mentaires au contenu de la page.
  • return le commentaire filtrĂ© si toutes les conditions ci-dessus sont remplies. Si ce n’est pas le cas, retournez simplement le contenu sans le modifier.

Enregistrez votre fichier d’extension, chargez n’importe quel article sur votre site et faites le dĂ©filer jusqu’à la fin.

InsĂ©rer quelque chose Ă  la fin du contenu de l’article
InsĂ©rer quelque chose Ă  la fin du contenu de l’article

Vous pouvez utiliser la mĂȘme logique pour ajouter n’importe quoi au dĂ©but de tous vos articles en inversant la position des paramĂštres de concatĂ©nation des chaĂźnes ("your additions" . $content).

Personnaliser la page de connexion WordPress avec des hooks

Utilisons Ă  la fois des actions et des filtres pour personnaliser la page de connexion par dĂ©faut de WordPress. Pour ce faire, je vais crĂ©er une nouvelle extension appelĂ©e Sal Custom Login Page. Vous pouvez trouver le code source complet de cette extension Ă  la fin de cette section.

L'écran final de connexion WordPress personnalisé
L’écran final de connexion WordPress personnalisĂ©

Commençons par ajouter les champs d’en-tĂȘte standard de l’extension et l’enregistrer dans WordPress.

<?php

/*
Plugin Name:  Sal Custom Login Page
Version:  1.0
Description:  Demonstrating WordPress Hooks (Actions and Filters) by customizing the WordPress login page.
Author:  Salman Ravoof
Author URI:  https://www.salmanravoof.com/License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain:  sal-custom-login-page
*/

// enqueueing the custom style sheet on WordPress login page
add_action( 'login_enqueue_scripts', 'salhooks_login_stylesheet');
function salhooks_login_stylesheet() {
    // Load the style sheet from the plugin folder
    wp_enqueue_style( 'sal-custom-login-page', plugin_dir_url( __FILE__ ).'sal-custom-login-page-styles.css' );
}

Tout d’abord, accrochez-vous Ă  l’action login_enque_scripts pour obtenir votre feuille de style personnalisĂ©e. Tous les scripts ou styles que vous mettez en file d’attente ici sont inclus dans la section d’en-tĂȘte de votre page de connexion.

Si vous souhaitez charger des scripts et des feuilles de style personnalisĂ©s sur l’interface publique de votre site (plutĂŽt que sur la zone d’administration ou la zone de connexion de l’administration), vous devez vous accrocher Ă  l’action wp_enqueue_scripts. Vous pouvez en savoir plus Ă  ce sujet dans le Codex WordPress et dans l’article de Kinsta sur l’utilisation de wp_enqueue_scripts.

À l’intĂ©rieur de la fonction de rappel salhooks_login_stylesheet(), utilisez la fonction wp_enqueue_style() pour charger la feuille de style personnalisĂ©e (sal-custom-login-page-styles.css) placĂ©e dans le mĂȘme rĂ©pertoire de l’extension. La fonction plugin_dir_url( __FILE__ ) intĂ©grĂ©e Ă  WordPress permet d’obtenir facilement le chemin de l’URL (avec une barre oblique Ă  la fin) du rĂ©pertoire de l’extension.

Je ne vais pas expliquer les styles CSS appliqués ici, mais vous pouvez les trouver tous dans le code source lié à la fin de cette section.

// Custom login ERROR message to keep the site more secure
add_filter( 'login_errors', 'salhooks_remove_login_errors', 10 );
function salhooks_remove_login_errors() {
    return 'Incorrect credentials. Please try again!';
}

Ensuite, accrochez-vous au filtre login_errors pour modifier le message d’erreur affichĂ© lorsque quelqu’un saisit des informations d’identification incorrectes. Le filtre du message d’erreur empĂȘchera les attaquants de deviner facilement votre nom d’utilisateur.

// Remove the login form box shake animation for incorrect credentials
add_action( 'login_head', 'remove_login_error_shake' );
function remove_login_error_shake() {
    remove_action( 'login_head', 'wp_shake_js', 12 );
}

Chaque fois qu’une personne saisit des donnĂ©es de connexion incorrectes, la boĂźte du formulaire de connexion tremble agressivement. Cette Ă©tape est facultative, mais je l’ai incluse pour montrer que vous pouvez Ă©galement supprimer certaines fonctionnalitĂ©s de la page de connexion.

Vous en apprendrez plus sur les fonctions remove_action() et remove_filter() dans la derniĂšre section de cet article.

// Change the logo and header link above the login form
add_filter( 'login_headerurl', 'salhooks_login_headerurl');
function salhooks_login_headerurl( $url ) {
    $url = 'https://salmanravoof.com';
    return $url;
}

add_filter( 'login_headertext', 'salhooks_login_headertext');
function salhooks_login_headertext( $text ) {
    $text = 'Salman Ravoof';
    return $text;
}

L’étape finale consiste Ă  modifier l’URL et le texte de l’en-tĂȘte de connexion. Vous pouvez vous connecter aux filtres login_headerurl et login_headertext pour les modifier tous les deux.

Si vous souhaitez vous appuyer sur cette extension et poursuivre vos expĂ©riences, vous pouvez tĂ©lĂ©charger le code source de l’extension et vous lancer.

Liste et ressources de hooks WordPress

Il est difficile de mĂ©moriser tous les diffĂ©rents hooks de WordPress. Il y a des milliers d’actions et de filtres intĂ©grĂ©s auxquels il est possible de s’accrocher. Par consĂ©quent, trouver un hook appropriĂ© peut parfois ressembler Ă  une chasse au trĂ©sor.

Heureusement, il existe diverses ressources que vous pouvez utiliser pour trouver le hook parfait pour vos besoins.

Le premier endroit pour se familiariser avec les hooks est le Codex WordPress, en particulier sa section sur les hooks dans le manuel des extensions. Vous y trouverez des informations essentielles sur les hooks et des liens pour compléter la documentation sur toutes les actions et les filtres.

Commencez Ă  apprendre les hooks avec le manuel des extensions WordPress
Commencez Ă  apprendre les hooks avec le manuel des extensions WordPress

Ajoutez ces liens utiles du manuel des extensions à vos favoris pour accélérer votre recherche :

Les pages de rĂ©fĂ©rence des actions et des filtres vous donneront une liste de tous les hooks qui s’exĂ©cutent gĂ©nĂ©ralement lors d’une requĂȘte WordPress spĂ©cifique.

Par exemple, vous pouvez trouver tous les hooks dĂ©clenchĂ©s lorsque vous accĂ©dez Ă  une page d’administration, lorsque vous traitez des fichiers joints de pages d’articles ou des catĂ©gories.

Le Codex WordPress comprend Ă©galement un outil de recherche pratique pour trouver toutes ses fonctions, ses crochets, ses mĂ©thodes et ses classes. Cette page rĂ©pertorie Ă©galement les nouveaux composants et les mises Ă  jour de la derniĂšre version de WordPress. Dirigez-vous d’abord ici si vous voulez trouver ce qui se passe dans WordPress.

Recherchez ici tout ce qui se trouve dans WordPress
Recherchez ici tout ce qui se trouve dans WordPress

Cet index des hooks WordPress classe tous les hooks par type, par version de WordPress oĂč ils ont Ă©tĂ© lancĂ©s, et s’ils sont obsolĂštes.

Index des hooks WordPress d'Adam R Brown
Index des hooks WordPress d’Adam R Brown

En triant les hooks par ordre d’apparition, vous verrez que les hooks les plus anciens de WordPress sont toujours les plus utilisĂ©s. Si vous ĂȘtes nouveau dans le dĂ©veloppement de WordPress, vous familiariser avec ces actions et filtres populaires est le moyen le plus rapide de vous rattraper.

Bien que cet index n’ait pas Ă©tĂ© mis Ă  jour depuis WordPress 5.1, il est toujours utile de parcourir tous les principaux hooks.

Vous avez toujours du mal à trouver le hook que vous voulez ? Une recherche en ligne avec le bon mot-clé est toujours un bon moyen de commencer. Si tout le reste échoue, vous pouvez toujours creuser dans le code de WordPress.

Trouver des hooks enregistrés sur une page WordPress

Comme nous l’avons vu, WordPress a des tonnes de hooks disponibles, mais tous les hooks ne se dĂ©clenchent pas sur chaque page. Si vous pouvez trouver quelles actions et quels filtres vous pouvez utiliser sur une page particuliĂšre, alors vous avez gagnĂ© la moitiĂ© de la bataille.

Bien que vous puissiez utiliser des outils de dĂ©bogage PHP avancĂ©s comme xdebug et PHPCS pour vous aider, il existe des outils de dĂ©veloppement plus simples comme Debug Bar et Query Monitor que vous pouvez exĂ©cuter dans WordPress.

Barre de débogage avec des actions et des modules de filtre

Debug Bar est une extension officielle de WordPress qui ajoute un menu Debug Ă  votre barre d’administration. Elle affiche les avertissements et les notices de PHP, les requĂȘtes de cache, les requĂȘtes MySQL et d’autres informations utiles pour le dĂ©bogage.

Info

Cette extension n’a pas Ă©tĂ© rĂ©cemment mise Ă  jour, ni testĂ©e avec les derniĂšres versions majeures de WordPress. Nous la mentionnons comme une extension pratique pour en savoir plus sur les hooks de WordPress. Utilisez-la dans un environnement de staging.

L’extension WordPress Debug Bar
L’extension WordPress Debug Bar

AprĂšs avoir installĂ© l’extension, vous devez ajouter le code ci-dessous au fichier wp-config.php de votre site pour activer ses fonctions de dĂ©bogage.

define( 'WP_DEBUG', true ); // tracks PHP Warnings and Notices
define( 'SAVEQUERIES', true ); // tracks and displays MySQL queries

Vous devriez maintenant voir l’option de menu Debug s’afficher dans votre barre d’administration. En cliquant sur cette option, vous accĂ©derez Ă  son tableau de bord oĂč vous pourrez voir les diffĂ©rentes requĂȘtes et caches attachĂ©es Ă  la page Ă  partir de laquelle vous y avez accĂ©dĂ©.

Le menu « Debug » dans la barre d'administration de WordPress
Le menu « Debug Â» dans la barre d’administration de WordPress

Ensuite, vous devez installer l’extension Debug Bar Actions ans Filters Addon. Il s’agit d’une extension pratique qui ajoutera deux onglets supplĂ©mentaires Ă  votre tableau de bord de la barre de dĂ©bogage pour afficher les actions et les filtres dĂ©clenchĂ©s sur la requĂȘte en cours.

Actions énumérées dans leur ordre de chargement pour la page en cours
Actions énumérées dans leur ordre de chargement pour la page en cours

Elle listera également toutes les fonctions qui leur sont rattachées avec leur priorité.

Filtres listés avec leur priorité et leurs fonctions de rappel enregistrées
Filtres listés avec leur priorité et leurs fonctions de rappel enregistrées

Vous pouvez cliquer sur le menu Debug depuis n’importe quelle page de votre site pour connaĂźtre toutes les actions et les filtres auxquels vous pouvez accĂ©der sur cette page.

Query Monitor

Query Monitor est un puissant panneau d’outils de dĂ©veloppement pour WordPress. Vous pouvez l’utiliser pour creuser dans les hooks disponibles sur une page et leur ordre de chargement.

Extension WordPress Query Monitor
Extension WordPress Query Monitor

Contrairement Ă  Debug Bar, vous n’avez pas besoin d’installer de modules pour voir les actions et les filtres dĂ©clenchĂ©s sur une certaine page.

Vous pouvez accéder à Query Monitor depuis la barre d'administration
Vous pouvez accĂ©der Ă  Query Monitor depuis la barre d’administration

Query Monitor vous donne Ă©galement plus d’informations sur l’endroit exact d’oĂč un hook est tirĂ©.

Le panneau Hooks & Actions dans Query Monitor
Le panneau Hooks & Actions dans Query Monitor

Dans la colonne des composants, vous pouvez voir que la plupart des hooks sont enregistrĂ©s Ă  partir du cƓur. Mais certains hooks sont enregistrĂ©s Ă  partir d’un thĂšme ou d’une extension. Quelques hooks peuvent ĂȘtre enregistrĂ©s Ă  partir de plus d’un composant.

Vous pouvez utiliser les menus dĂ©roulants de hook et de composant pour ne voir que les hooks dont vous avez besoin.

Note : Query Monitor utilise le terme « Hooks Â» pour dĂ©signer Ă  la fois les actions et les filtres, mais il appelle les fonctions de rappel enregistrĂ©es « Actions Â». Il s’agit d’une mauvaise dĂ©finition technique qui peut prĂȘter Ă  confusion, alors gardez bien cela Ă  l’esprit.

Vous pouvez faire plus que simplement vĂ©rifier toutes les requĂȘtes et demandes avec Query Monitor. Il comprend Ă©galement des fonctionnalitĂ©s avancĂ©es telles que la liste des styles, des scripts, des langages, des appels Ajax, des contrĂŽles de capacitĂ© utilisateur et des appels API REST.

Le hook « all Â»

WordPress possĂšde un hook spĂ©cial appelĂ© « all Â» que vous pouvez utiliser pour lancer une fonction de rappel pour chaque hook, qu’il soit ou non enregistrĂ© avec tous les autres. Il est utile pour dĂ©boguer les plantages de pages ou si vous voulez savoir quand un Ă©vĂ©nement particulier se produit.

Par exemple, vous pouvez utiliser le crochet all comme dans l’exemple ci-dessous pour faire un echo Ă  toutes les actions en cours.

// echo all the actions being run
function debug_helper_function(){
    echo '<p>' . current_action() . '</p>';
}
add_action( 'all', 'debug_helper_function' );

function debug_helper_function() dĂ©finie ci-dessus sera exĂ©cutĂ©e lorsqu’une action se dĂ©clenchera. Savoir quelle Ă©tait la derniĂšre action exĂ©cutĂ©e vous donnera une meilleure idĂ©e de ce que vous devez examiner.

OĂč sont stockĂ©s les hooks WordPress ?

WordPress utilise la classe WP_Hook pour implĂ©menter le fonctionnement des hooks. Cette classe de base est utilisĂ©e pour gĂ©rer toutes les actions et les filtres intĂ©grĂ©s Ă  WordPress. Vous pouvez trouver presque tout le code relatif Ă  cette classe dans le fichier wp-includes/class-wp-hook.php.

Techniquement, la classe WP_Hook est un tableau d’objets comprenant des propriĂ©tĂ©s telles que les appels, les itĂ©rations, current_priority, nesting_level et doing_action. Elle dĂ©finit Ă©galement un grand nombre de fonctions de hook utiles qui peuvent ĂȘtre appelĂ©es Ă  l’aide des mĂ©thodes WP_Hook.

La plupart des dĂ©veloppeurs de WordPress n’ont pas Ă  se soucier de l’emplacement des hooks des boutiques WordPress tant qu’ils respectent les directives de l’API des extensions.Il existe deux types de hooks WordPress : les actions et les filtres, et ce guide explique exactement quand (et comment !) utiliser chacun d’entre eux đŸ’„CLICK TO TWEET

Comment créer vos hooks WordPress personnalisés

Vous avez vu les diffĂ©rents hooks que WordPress fournit grĂące Ă  son API d’extension. Vous avez Ă©galement regardĂ© comment vous pouvez utiliser les hooks par dĂ©faut pour injecter votre propre code dans le WordPress.

Si vous ĂȘtes un dĂ©veloppeur d’extensions ou de thĂšmes, il est bon de fournir aux autres dĂ©veloppeurs un moyen d’interagir avec votre code de la mĂȘme maniĂšre. C’est exactement ce que vous permettent de faire les hooks personnalisĂ©s. Ils permettent aux autres dĂ©veloppeurs d’étendre et de modifier les fonctionnalitĂ©s de vos extensions et thĂšmes.

Il est assez simple de crĂ©er ses propres actions et filtres. Vous utilisez les mĂȘmes fonctions que celles que le cƓur de WordPress utilise pour crĂ©er des hooks. Voyons quelques exemples.

  1. How to Create Custom Actions in WordPress
  2. Comment créer un filtre personnalisé dans WordPress
  3. Convention de dénomination des hooks personnalisés
  4. Démonstration de hooks personnalisés avec une extension évolutive
  5. Travailler avec des hooks personnalisés de développeurs tiers
  6. Quand utiliser les hooks personnalisés ?

How to Create Custom Actions in WordPress

Utilisez la fonction do_action() pour crĂ©er un hook d’action personnalisĂ©. Voici comment faire :

// the position where you insert your action is where it'll run when called
do_action( ' my_unique_custom_action' );
// continue with the rest of your code

Maintenant, d’autres dĂ©veloppeurs peuvent se connecter Ă  votre extension ou Ă  votre thĂšme sans modifier le code source. Il leur suffit d’enregistrer leurs fonctions de rappel Ă  l’action personnalisĂ©e de votre extension en utilisant la fonction add_action().

add_action( 'my_unique_custom_action', 'some_callback_function' );

// define the callback function you mentioned in the above action function
some_callback_function() {
     // this code will run wherever your custom action hook is 
}

Veillez Ă  bien documenter vos hooks personnalisĂ©s, en expliquant en dĂ©tail ce qu’ils font. AprĂšs tout, la crĂ©ation de hooks personnalisĂ©s sert principalement Ă  aider d’autres dĂ©veloppeurs Ă  interagir avec votre code.

Comment créer un filtre personnalisé dans WordPress

Utilisez la fonction apply_filters() pour crĂ©er un filtre personnalisĂ©. Voici comment vous pouvez le faire :

$value_to_filter = "I'm a string, but this can be any PHP data type";

// filters modify a value and are typically tied to a predefined variable
apply_filters( 'my_custom_filter', $value_to_filter );

Les paramĂštres de votre filtre personnalisĂ© doivent inclure un identifiant unique et une valeur Ă  filtrer. D’autres dĂ©veloppeurs peuvent se connecter Ă  votre filtre personnalisĂ© avec la fonction add_filter() et modifier la valeur passĂ©e.

add_filter( 'my_custom_filter', 'some_callback_function' );

// define the callback function you mentioned in the above filter function
function some_callback_function( $value_to_filter ) {
    // modify the passed value (or not) 
    return $value_to_filter; // returning a value is a must for filters
}

Lorsque vous dĂ©finissez votre filtre personnalisĂ©, assurez-vous qu’il n’est pas positionnĂ© avant que la valeur qu’il est censĂ© filtrer ne soit dĂ©finie. Si vous ne positionnez pas le filtre correctement, la valeur filtrĂ©e sera ensuite Ă©crasĂ©e par la valeur par dĂ©faut.

Convention de dénomination des hooks personnalisés

Il est important de choisir un nom unique pour tous vos hooks personnalisĂ©s. Comme chaque extension ou thĂšme peut avoir ses propres hooks personnalisĂ©s, le fait d’avoir des noms de hook identiques peut entraĂźner des collisions de codes avec des rĂ©sultats inattendus.

Par exemple, si vous nommez votre action send_email, il est fort probable que d’autres dĂ©veloppeurs d’extensions choisissent le mĂȘme terme car il n’est pas assez unique. Si un site web installe Ă  la fois votre extension et celui de l’autre dĂ©veloppeur, cela peut provoquer des erreurs qui seront difficiles Ă  repĂ©rer.

Vous pouvez faire prĂ©cĂ©der tous vos hooks personnalisĂ©s d’un identifiant commun pour qu’ils restent Ă  la fois simples et uniques. Ainsi, au lieu de send_email, vous pouvez le nommer plugin_name_send_email (plugin_name_ est ici le prĂ©fixe unique).

Démonstration de hooks personnalisés avec une extension évolutive

CrĂ©ons une extension Ă©volutive qui permettra Ă  d’autres dĂ©veloppeurs d’interagir avec elle en utilisant ses hooks personnalisĂ©s.

Je vais nommer cette extension Custom Hooks DemoSa fonction principale est de produire une boĂźte de citation Ă  chaque fois que vous insĂ©rez un code court. Elle comprendra des actions et des filtres personnalisĂ©s aux bons endroits pour permettre Ă  d’autres dĂ©veloppeurs de modifier ou d’étendre ses fonctionnalitĂ©s.

Vous pouvez vous rĂ©fĂ©rer Ă  mon guide des codes courts WordPress pour en savoir plus sur le fonctionnement des codes courts.

Commençons par l’extension Ă©volutive.

<?php

/*
Plugin Name :  Custom Hooks Demo
Description :  Demonstrating how to create an extensible WordPress plugin using custom hooks.
Author      :  Salman Ravoof
Author URI  :  https://salmanravoof.com/
License     :  GPLv2 or later
License URI :  https://www.gnu.org/licenses/gpl-2.0.html
Text Domain :  custom-hooks-demo
*/

/** 
 * the [custom_hooks_demo] shortcode returns the HTML code for a quote box.
 * @return string HTML code for a quote box
*/
add_shortcode( 'custom_hooks_demo', 'my_shortcode_callback' );

function my_shortcode_callback ( $arguments ) {
    ob_start(); // start object buffering to collect all output before sending it to the browser
    
    // set an action hook to run before you output anything
    do_action( 'the_topmost_custom_action' );
    
    // define your variables which you want to allow to be filtered
    $quote_content = "Z.E.R.O. That's the number of people who'd like to have any website autoplay music on their browsers.";
    $quote_author = "John Doenuts";
    
    // create your custom filters after you've set the variables
    $quote_content = apply_filters( 'custom_quote_content', $quote_content );
    $quote_author = apply_filters( 'custom_quote_author', $quote_author );
    
    // build the shortcode output template
    echo "<div style=\"border:3px solid #5333ed;\"><blockquote style=\"margin:20px;border-color:#5333ed;\">";
    echo $quote_content;
    echo "<br><br>";
    echo "― <strong>" . $quote_author . "</strong>";
    echo "</blockquote></div>";
    
    // set an action hook to run after you output everything
    do_action( 'the_ending_custom_action' );
    
    return ob_get_clean(); // get buffer contents, delete the buffer, and then stop buffering
}
  • La fonction add_shortcode() est utilisĂ©e pour crĂ©er le code court personnalisĂ©. Ensuite, vous dĂ©finissez la fonction de rappel du code court avec toutes les fonctionnalitĂ©s de cette extension.
  • ob_start() est une fonction PHP qui permet de mettre en mĂ©moire tampon l’affichage. C’est une fonction trĂšs pratique qui indique Ă  PHP de conserver toute sortie dans la mĂ©moire tampon du serveur plutĂŽt que de l’afficher immĂ©diatement. Vous pouvez l’utiliser pour construire du code HTML complexe et lisible en PHP.
  • do_action("the_topmost_custom_action") dĂ©finit votre premiĂšre action personnalisĂ©e. Pour la rendre utile, vous devez la dĂ©finir avant que l’extension ne produise quoi que ce soit. Les autres dĂ©veloppeurs peuvent se connecter Ă  cette action personnalisĂ©e pour exĂ©cuter leur code avant que ce code court personnalisĂ© n’affiche quoi que ce soit.
  • CrĂ©ez les variables que vous voulez filtrer. Dans cette extension, ces variables sont $quote_content et $quote_author. Ce sont toutes deux des chaĂźnes de caractĂšres dans cet exemple, mais vous pouvez les dĂ©finir comme n’importe quel type de donnĂ©es PHP (par exemple, entier, boolĂ©en, tableau).
  • Utilisez la fonction apply_filters() pour crĂ©er vos filtres personnalisĂ©s. Comme tous les filtres retournent une valeur, vous pouvez affecter les variables prĂ©cĂ©demment dĂ©finies Ă  la valeur renvoyĂ©e par ce filtre. D’autres dĂ©veloppeurs peuvent maintenant se connecter Ă  ce filtre pour modifier les valeurs par dĂ©faut des variables prĂ©dĂ©finies.
  • Utilisez les dĂ©clarations echo pour construire ligne par ligne l’affichage de votre code court. Comme nous avons activĂ© la mise en mĂ©moire tampon, aucun affichage sortie n’atteindra le navigateur immĂ©diatement.
  • do_action( 'the_ending_custom_action' ) dĂ©finit votre derniĂšre action personnalisĂ©e. Vous devez la dĂ©finir Ă  la toute fin, mais avant de retourner tout le contenu du tampon.
  • ob_get_clean() est une fonction PHP 3-en-1 par dĂ©faut. Elle rĂ©cupĂšre le contenu de la mĂ©moire tampon, Ă©limine toutes les donnĂ©es de la mĂ©moire tampon, puis arrĂȘte la mise en mĂ©moire tampon. Elle return le contenu de la mĂ©moire tampon collectĂ© sous forme de chaĂźne concatĂ©nĂ©e unique.

Une fois enregistrĂ© et activĂ©, l’ajout du code [custom_hooks_demo] au contenu de votre article et produira une boĂźte de citation avec les valeurs par dĂ©faut.

La boüte de citation originale utilisant l’extension Custom Hooks Demo
La boüte de citation originale utilisant l’extension Custom Hooks Demo

Maintenant, crĂ©ons une autre extension appelĂ©e Custom Hooks Demo Extension. Elle se connectera Ă  tous les hooks personnalisĂ©s crĂ©Ă©s par l’extension prĂ©cĂ©dente et fera ou modifiera quelque chose.

<?php

/*
Plugin Name :  Custom Hooks Demo Extension
Description :  Demonstrating how you can extend WordPress plugin functionality with its custom hooks.
Author      :  Salman Ravoof
Author URI  :  https://salmanravoof.com/
License     :  GPLv2 or later
License URI :  https://www.gnu.org/licenses/gpl-2.0.html
Text Domain :  custom-hooks-demo-extension
*/

/**
 * replace the quote content by hooking into the 'custom_quote_content' filter
*/
add_filter( 'custom_quote_content', 'new_quote_content_callback' );
function new_quote_content_callback( $content ) {
    $content = "There are no bugs in programming. Only unexpected features.";
    return $content;
}

/**
 * replace the quote author by hooking into the 'custom_quote_author'
*/
add_filter( 'custom_quote_author', 'new_quote_author_callback' );
function new_quote_author_callback( $author ) {
    $author = "Jane Doodle";
    return $author;
}

/**
 * add an image to the top of the shortcode output by hooking into the 'the_topmost_custom_action'
*/
add_action( 'the_topmost_custom_action', 'quote_image_callback' );
function quote_image_callback() {
    $url = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Quote-right-cs.svg/75px-Quote-right-cs.svg.png";
    echo '<div><img class="aligncenter" src="'.$url.'"></div>';
}

/**
 * add a button below the shortcut output by hooking into the 'the_ending_custom_action'
*/
add_action( 'the_ending_custom_action', 'add_button_callback' );
function add_button_callback() {
    echo '<div style="text-align:center;"><button name="nice">Nice Quote!</button></div>';
}

Comme vous pouvez le voir, cette extension ne contient rien d’autre que des fonctions d’action et de filtrage qui s’accrochent à l’extension originale aux bons endroits pour y apporter des modifications.

Elle utilise les fonctions add_action() et add_filter() pour enregistrer ses fonctions de rappel avec les actions et les filtres personnalisĂ©s crĂ©Ă©s par l’extension originale (par exemple, the_topmost_custom_actioncustom_quote_author).

L'extension modifie la boĂźte de citation originale
L’extension modifie la boüte de citation originale

Des hooks d’action personnalisĂ©s vous permettent d’intercaler votre code aux bons endroits dans l’extension originale et d’exĂ©cuter vos propres scripts. Ici, nous ajoutons une image en haut et un bouton en bas.

De mĂȘme, des filtres personnalisĂ©s vous permettent de modifier les valeurs du contenu de la citation et son nom d’auteur. Le rĂ©sultat final est une extension qui est entiĂšrement Ă©volutive par n’importe qui sans modifier son code source.

Travailler avec des hooks personnalisés de développeurs tiers

Les hooks personnalisĂ©s permettent aux extensions et aux thĂšmes WordPress d’avoir un riche Ă©cosystĂšme d’extensions Ă©volutives. Prenons l’exemple de l’extension WooCommerce. Elle ajoute une fonctionnalitĂ© de commerce Ă©lectronique Ă  WordPress, mais il inclut Ă©galement des tonnes de hooks dans son code.

Hooks d’actions et de filtres WooCommerce
Hooks d’actions et de filtres WooCommerce

WooCommerce dispose de centaines d’extensions et de plugins qui utilisent ses hooks pour dĂ©velopper ses fonctionnalitĂ©s de base et les amĂ©liorer.

Vous pouvez utiliser ces extensions pour intégrer WooCommerce avec Stripe, MailChimp, Salesforce, Zapier, et bien plus encore.

Des extensions étendent les fonctionnalités de WooCommerce
Des extensions étendent les fonctionnalités de WooCommerce

Une bonne pratique consiste Ă  consulter la section de documentation des extensions WordPress les plus populaires pour voir comment elles mettent en Ɠuvre des hooks personnalisĂ©s. Quelques-unes de mes principales suggestions sont Easy Digital Downloads, BuddyPress, Quiz and Survey Master et Gravity Forms.

Quand utiliser les hooks personnalisés ?

En fonction du thĂšme ou de l’extension que vous crĂ©ez, et de la personne Ă  qui cela est destinĂ©, vous pouvez vous demander s’il est nĂ©cessaire d’ajouter des hooks personnalisĂ©s.

Une bonne rĂšgle de base pour dĂ©cider d’ajouter ou non des hooks personnalisĂ©s est de vĂ©rifier s’ils offrent des avantages d’extensibilitĂ© aux autres dĂ©veloppeurs. Si ce n’est pas le cas, il vaut mieux attendre que d’autres dĂ©veloppeurs vous demandent de les ajouter.

Vous devez ĂȘtre trĂšs sĂ»r d’ajouter des hooks personnalisĂ©s Ă  votre extension ou Ă  votre thĂšme. Une fois qu’il est publiĂ©, et si d’autres dĂ©veloppeurs l’ont dĂ©jĂ  utilisĂ©, vous ne pouvez pas le modifier sans rompre la rĂ©trocompatibilitĂ©.

Suppression des fonctions de rappel des hooks WordPress

Vous avez dĂ©jĂ  vu des exemples de suppression des fonctions de rappel enregistrĂ©es pour certains hooks. Ces rappels peuvent ĂȘtre enregistrĂ©s par des extensions, des thĂšmes, ou mĂȘme par le cƓur de WordPress lui-mĂȘme. Examinons la suppression des fonctions de rappel accrochĂ©es avec plus d’exemples.

Pour supprimer une fonction de rappel d’un hook, selon qu’elle est enregistrĂ©e dans une action ou un filtre, vous devez utiliser les fonctions remove_action() ou remove_filter().

Une mise en garde s’impose : vous devez appeler ces fonctions avec les mĂȘmes paramĂštres que ceux utilisĂ©s pour enregistrer la fonction de rappel. Fondamentalement, il faut copier-coller les paramĂštres depuis leurs fonctions add_action() ou add_filter().

En outre, vous ne pouvez supprimer les fonctions de rappel qu’aprĂšs leur enregistrement. Si vous essayez de les supprimer avant qu’elles ne soient enregistrĂ©es, la procĂ©dure de suppression Ă©chouera. Vous devez obtenir l’ordre d’exĂ©cution des hooks correctement.

Supposons que vous vouliez supprimer une fonction de rappel enregistrĂ©e par un thĂšme ralentit votre site (vous voulez un site rapide, n’est-ce pas ?).

function wp_bloated_callback_function() {    
// some code that adds a lot of bloat to the site
}
add_action( 'template_redirect', 'wp_bloated_callback_function', 5 );

Par exemple, la fonction de rappel ci-dessus pourrait charger de nombreux scripts et feuilles de style inutiles. Sa suppression donnera Ă  votre site un Ă©norme coup de pouce en termes de performances.

Cependant, vous devez vous assurer que la fonction remove_action() ne s’exĂ©cute qu’aprĂšs l’action template_redirect. Une façon de le faire est de s’accrocher Ă  l’action after_setup_theme telle qu’elle est dĂ©clenchĂ©e aprĂšs l’action template_redirect.

function wp_remove_bloat() {
    // ensure all parameters are identical to the original add_action() function
    remove_action( 'template_redirect', 'wp_bloated_callback_function', 5 );
}

// ensure that remove_action() is called only after add_action()
add_action( 'after_setup_theme', 'wp_remove_bloat' );

La fonction wp_bloated_callback_function() va maintenant se dĂ©tacher de l’action template_redirect.

Cas particuliers pour la suppression des fonctions de rappel

La suppression des fonctions de rappel ne se limite pas à leur désactivation. Parfois, vous devez les supprimer temporairement, exécuter votre code, puis les ajouter à nouveau.

Par exemple, l’action save_post Ă  se dĂ©clenche Ă  chaque fois que les fonctions wp_insert_post() et wp_publish_post() sont appelĂ©es. Vous pouvez les trouver toutes les deux dĂ©finies dans le fichier wp-includes/post.php.

Ainsi, si vous avez une fonction de rappel liĂ©e Ă  l’action save_post, et si vous appelez les fonctions wp_insert_post() ou wp_publish_post() dans votre fonction de rappel, l’action save_post se dĂ©clenchera plusieurs fois.

function some_callback_function( $post_id, $post ) {
    // do something here
    wp_insert_post( [some_array] ); // this function also calls the 'save_post' action
    // maybe do something more
}
add_action( 'save_post', 'some_callback_function', 10, 2 );

Une fonction qui appelle l’action qui l’appelle aussi peut crĂ©er des rĂ©sultats inattendus. Une façon de contourner ce problĂšme est d’utiliser la fonction remove_action() Ă  l’intĂ©rieur de votre fonction de rappel avant d’appeler wp_insert_post().

function some_callback_function( $post_id, $post ) {
    // do something here
    
    // remove the callback function from the ‘save_post’ action
    remove_action( 'save_post', 'some_callback_function', 10, 2 );
    
    // now run the wp_insert_post() function
    wp_insert_post( [some_array] );
    
    // add the callback function back to the ‘save_post’ action
    add_action( 'save_post', 'some_callback_function', 10, 2 );
    
    // maybe do something more
}
add_action( 'save_post', 'some_callback_function', 10, 2 );

C’est une autre utilisation pratique des fonctions remove_action() ou remove_filter(). En approfondissant le cƓur de WordPress, vous comprendrez comment mieux Ă©viter ces situations.

Tutoriels WordPress Hooks en prime

Les hooks WordPress sont l’un des outils les plus importants Ă  avoir dans l’arsenal d’un dĂ©veloppeur WordPress. đŸ’Ș DĂ©couvrez la diffĂ©rence entre les actions et les filtres (et comment les utiliser) dans ce guide !CLICK TO TWEET

Résumé

L’utilisation des hooks WordPress prĂ©sente de multiples avantages si vous ĂȘtes un dĂ©veloppeur WordPress.

Non seulement les hooks vous permettent de modifier ou d’étendre les fonctionnalitĂ©s de base de WordPress, mais vous pouvez Ă©galement les utiliser pour modifier des extensions, des thĂšmes, et laisser d’autres dĂ©veloppeurs interagir avec vos extensions ou thĂšmes.

Il est temps de s’accrocher à WordPress !

Divers hooks WordPress

Automatiser le remplissage de l’attribut ALT dans les images des publications

Conçu pour amĂ©liorer l’accessibilitĂ© au rĂ©fĂ©rencement, ce script ajoute le titre du message et l’attribue Ă  l’attribut ALT de l’image lorsque ce champ est vide

wp-config exemple

Nettoyage du header

Ajouter du contenu à des données sérialisées

Fonctions et définitions pour un theme

Effacez le tableau de bord d’administration WordPress et remplacez-le par votre propre modĂšle personnalisĂ©