Reel 'em In Comprendre les crochets de l'intérieur

La clé de la base flexible de WordPress réside dans son utilisation de crochets. Que ce soit dans les thèmes, les plugins ou dans le noyau, les points d'ancrage permettent une croissance sans précédent tout en assurant la compatibilité avec les futures versions de WordPress. Par conséquent, leur compréhension devrait sans aucun doute faire partie du répertoire de tout développeur. Joignez-vous à nous pour découvrir les subtilités de ce système simple mais sophistiqué de l'intérieur.

En tant que feuille de route pour cet article, nous allons passer en revue le concept derrière les crochets, leur mise en œuvre et, bien sûr, des exemples.


Concept: quoi et pourquoi?

"En termes simples, un crochet est un espace réservé pour une action."

Tout logiciel bien écrit repose sur un concept solide qui répond aux questions de savoir quoi et pourquoi. Les crochets ne font pas exception. En termes simples, un crochet est un espace réservé pour une action. Lorsqu'un événement significatif se produit, tel que la publication d'un article, un hook est activé, permettant ainsi aux réactions pertinentes de se produire. En termes de développement, on peut considérer les points d'ancrage comme la mise en œuvre d'un système piloté par les événements..

Plus qu'une simple définition, un concept nécessite un raisonnement qui explique pourquoi il est utile. Les crochets jouent un rôle essentiel dans WordPress en raison de la nature en constante évolution du projet. Avec des centaines de développeurs mettant à jour constamment le système, il n'est pas possible d'éditer les fichiers de base pour chaque plugin, thème ou personnalisation spéciale, ceux-ci étant susceptibles de changer fréquemment. Au lieu de cela, un cadre est nécessaire pour étendre le système afin de permettre aux fonctionnalités externes d’avoir autant d’effet que les manipulations internes. Les crochets sont la clé de ce cadre.


Mise en oeuvre: comment?

En tant que développeur, son rôle est élargi non seulement pour comprendre ce que fait quelque chose ou pourquoi, mais aussi pour comprendre comment il est créé. En d'autres termes, pour bien comprendre le système de crochets, il faut comprendre comment ils sont mis en œuvre.

Comme dans un test à choix multiples, examiner directement les réponses en premier n’est pas nécessairement la meilleure idée. Comme le suggèrent de nombreuses stratégies de test, il est souvent préférable de lire la question, de formuler ses propres réflexions sur la réponse, puis de choisir le choix qui ressemble le plus à votre raisonnement. Une méthode similaire peut être utilisée pour comprendre les implémentations de développement de logiciels; Plutôt que de regarder le code de quelqu'un d'autre pour comprendre comment une fonctionnalité est réalisée, il est souvent encore plus utile de la mettre en œuvre vous-même, puis de revenir à la façon dont elle est réellement réalisée. C'est exactement ce que nous ferons.

Plutôt que de regarder le code de quelqu'un d'autre pour comprendre comment une fonctionnalité est réalisée, il est souvent encore plus utile de d'abord l'implémenter vous-même, puis de revenir à la façon dont elle est réellement réalisée..

Déduire de la documentation

Pour mieux comprendre comment un système est implémenté, la documentation est souvent un début utile. Examinons les résumés des deux fonctions de raccordement de WordPress selon le Codex:

  • add_action ($ hook, $ function [, $ priority [, $ numArgs]]) - Spécifie un gestionnaire de fonction, $ fonction, être appelé une fois un certain crochet, crochet $, est activé en raison de l'occurrence d'un événement. $ priorité détermine si ce gestionnaire de fonctions est appelé avant ou après d'autres gestionnaires de fonctions et prend la valeur par défaut de 10. Les priorités plus faibles entraînent l'appel d'une fonction plus tôt et inversement.. $ numArgs est le nombre d'arguments pris par le gestionnaire de fonctions. La valeur par défaut est 1..
  • do_action ($ hook [, $ arg1 [, $ arg2 [, $ arg3 [,?]]]]) - Active un certain crochet, crochet $, en appelant toutes les fonctions de traitement avec les arguments optionnels $ arg1, $ arg2, $ arg3, etc.

Avec la documentation en main, il est temps de tirer des conclusions sur ces deux fonctions.. add_action doit simplement associer une fonction, une priorité et un nombre d’arguments à une chaîne. Cela semble être le travail idéal pour un tableau PHP, qui agit également comme une carte de hachage qui stocke les paires clé-valeur. do_action est encore plus trivial, nécessitant une simple recherche dans ce même tableau pour trouver les gestionnaires de fonctions correspondants et les appeler par la suite. Gardant à l’esprit nos idées, il est temps de passer à notre mise en œuvre..

Appliquer nos connaissances

Comme nous le faisons pour mieux comprendre le système de raccordement WordPress, il n’est pas nécessaire d’implémenter ces deux fonctions telles quelles à partir de la documentation. Au lieu de cela, concentrons-nous sur leurs implémentations sans les arguments optionnels pour gagner du temps et en comprendre l'essentiel.

Avant de commencer, établissons un plan:

  • Nous aurons besoin d'un tableau global accessible aux deux fonctions.
  • add_action stockera le nom de hook donné et un ensemble de gestionnaires de fonctions correspondants en tant que paire clé-valeur dans le tableau.
  • do_action récupérera les gestionnaires de fonction correspondants pour un nom de hook donné et appellera chacun d'eux.

Cela donne le code suivant:

$ actions = array (); function add_action ($ hook, $ function) global $ actions; // crée un tableau de gestionnaires de fonctions s'il n'existe pas déjà si (! isset ($ actions [$ hook])) $ actions [$ hook] = array (); // ajoute la fonction actuelle à la liste des gestionnaires de fonctions $ actions [$ hook] [] = $ function;  function do_action ($ hook) global $ actions; if (isset ($ actions [$ hook])) // appelle chaque gestionnaire de fonction associé à ce hook poureach ($ actions [$ hook] en tant que $ fonction) call_user_func ($ fonction); 

C'est pas mal; nous avons implémenté un système de hook polyvalent dans environ 20 lignes de code. Maintenant que nous avons eu une idée du fonctionnement des crochets, passons au code de base de WordPress pour confirmer notre hypothèse..

Un outil pour naviguer rapidement dans ce code est la référence croisée PHP de la source WordPress de Yoast. À la recherche de add_action donne le code suivant:

function add_action ($ tag, $ function_to_add, $ priority = 10, $ supported_args = 1) return add_filter ($ tag, $ function_to_add, $ priority, $ supported_args);  function add_filter ($ tag, $ function_to_add, $ priority = 10, $ supported_args = 1) global $ wp_filter, $ merged_filters; $ idx = _wp_filter_build_unique_id ($ tag, $ function_to_add, $ priority); $ wp_filter [$ tag] [$ priorité] [$ idx] = tableau ('fonction' => $ fonction_à_add, 'accepté_args' => $ accepté_args); unset ($ merged_filters [$ tag]); retourne vrai; 

add_action appels add_filter qui, sans surprise, ajoute la fonction donnée à un tableau indexé par le nom du hook, tag $. Bien qu'il y ait un peu plus impliqué en raison de la $ priorité et $ shared_args paramètres, cette fonction est essentiellement en accord avec la nôtre, confirmant ainsi nos soupçons. do_action, Bien que plus long et un peu plus complexe, cela se résume au code suivant:

function do_action ($ tag, $ arg = ") [Code omis qui enregistre des statistiques, traite des arguments et traite des filtres] do foreach ((array) current ($ wp_filter [$ tag]) sous la forme $ the_) if (! is_null ($ the _ ['function'])) call_user_func_array ($ the _ ['function'], array_slice ($ args, 0, (int) $ the _ ['shared_args'])); while (next ($ wp_filter [$ tag])! == false); [Code omis qui nettoie]

Faire une boucle entre les fonctions associées et appeler chacune d’elles n’est pas étrange pour nous tous; en fait, c'est exactement ce que nous avons supposé dans notre mise en œuvre. Par conséquent, commencer par nos propres réflexions sur le code nous a non seulement aidé à mieux le comprendre, mais a également nécessité une réflexion critique et une résolution de problèmes essentielles au développement de logiciels..


Exemples

Avec notre compréhension de quoi, pourquoi et comment bien en main, il est temps de passer à deux exemples. Le premier est un jeu sur RSS; Plutôt que d'envoyer des notifications par syndication, pourquoi ne pas utiliser le courrier électronique??

Système de notification par courrier électronique

Pour mettre en œuvre notre système, nous devrons rechercher le moment où un article est publié. Mais quel crochet devrions-nous utiliser? La référence d'action d'API fournit une liste de points d'ancrage ainsi que des descriptions des événements associés pouvant nous aider à identifier exactement cela. En effet, le publier_post La description de hook correspond à ce dont nous avons besoin, ajoutons donc un gestionnaire de fonctions:

add_action ('publish_post', 'notify_via_email');

Il ne reste plus qu'à envoyer une notification par courrier électronique à une personne du notify_via_email gestionnaire de fonctions. Notez que la référence d'action d'API spécifie que le publier_post hook transmet l'identifiant de poste en tant qu'argument à notre fonction de traitement. Cela nous permettra d’obtenir des informations sur la poste via le get_post fonction, comme si:

fonction notify_via_email ($ post_id) $ post = get_post ($ post_id); $ to = '[email protected]'; $ subject = 'Post publié sur'. get_bloginfo ('nom'); $ message = $ post-> post_title. 'a été publié sur'. get_bloginfo ('nom'). 'à partir de'. $ post-> post_date. '. Vous pouvez le voir sur '. get_permalink ($ post_id). '.' wp_mail ($ to, $ subject, $ message); 

Après avoir récupéré le message, nous utilisons son titre, sa date et son lien permanent dans notre message électronique. Il est ensuite envoyé via le wp_mail fonction, qui nécessite un destinataire, un sujet et un message comme paramètres. Avec cela, notre système de notification par courrier électronique simple est complet. Notez qu'il n'est pas recommandé d'appeler wp_mail plusieurs fois à la fois, car il est tenu de présenter un retard important dans le temps de chargement de la page lorsque le bouton Publier la publication est enfoncé.

Plugin Google Analytics

Au début, il peut sembler qu'un thème soit un support plus approprié pour un tel code. Bien au contraire, le thème d’un site est sujet à révision et à changement. De ce fait, le code analytique pourrait facilement se perdre lors du passage d’un thème à l’autre..

Bien que légèrement inventé, notre première application était une introduction rapide à l’utilisation des crochets. Ce deuxième exemple, cependant, se prêtera beaucoup plus à une utilisation réelle. Nous allons créer un simple plug-in Google Analytics qui insère automatiquement un code de suivi dans le pied de page d'une page..

Au début, il peut sembler qu'un thème soit un support plus approprié pour un tel code. Bien au contraire, le thème d’un site est sujet à révision et à changement. De ce fait, le code analytique pourrait facilement se perdre lors du passage d’un thème à l’autre. Créer un plugin contourne cet inconvénient; car il restera actif quel que soit le thème utilisé, le code d'analyse sera toujours présent et éliminera la nécessité de la maintenance du thème..

Mais comment pouvons-nous brancher le code dans le pied de page d'un site Web? Cela aussi se fait via des crochets. Si vous avez déjà travaillé sur des thèmes WordPress, vous avez probablement appelé le wp_head et wp_footer fonctions dans la tête et le pied de page de votre site Web, respectivement. Ces deux fonctions sont présentes pour simplement activer les hooks afin que les plugins puissent facilement insérer du code dans ces zones vitales de la page. Par conséquent, nous allons simplement ajouter une action à la wp_footer crochet:

add_action ('wp_footer', 'add_google_analytics_code');

Notre add_google_analytics_code fonction, comme son nom l’indique, affiche le code Google Analytics:

  

N'oubliez pas de changer UA-XXXXX-X à votre identifiant spécifique au site et vous êtes prêt! Ajoutez simplement ce code à un fichier et chargez-le dans votre répertoire de plugins WordPress. Assurez-vous d'insérer un en-tête de plugin, comme ceci:

N'oubliez pas de changer le nom de l'auteur, l'URI de l'auteur et, bien sûr, d'activer le plugin.!


Conclusion

En scindant les points forts en un concept, une implémentation et des exemples, nous les avons efficacement examinés de l'intérieur du noyau WordPress à l'extérieur dans une application réelle. Plutôt que de simplement regarder le code principal de WordPress, nous avons implémenté notre propre version de hooks par inférence, ce qui nous permet d’obtenir une compréhension plus profonde, semblable à celle des développeurs, de ce système puissant. Enfin, avec une application Google Analytics Plugin du monde réel, nous avons obtenu des informations préliminaires sur l’utilité réelle des points d'ancrage. Assurez-vous de nous rejoindre la prochaine fois et n'hésitez pas à partager vos propres utilisations innovantes des crochets dans les commentaires ci-dessous.!