De sleutel tot de flexibele basis van WordPress is het gebruik van haken. Of het nu gaat om thema's, plug-ins of de kern, haken laten een ongeëvenaarde groei toe en zorgen tegelijkertijd voor compatibiliteit met toekomstige versies van WordPress. Als gevolg daarvan zou het begrijpen ervan ongetwijfeld een deel moeten zijn van het repertoire van elke ontwikkelaar. Doe mee en ontdek de fijne kneepjes van dit eenvoudige maar geavanceerde systeem van binnenuit.
Als een routekaart voor dit artikel zullen we het concept achter de haken, hun implementatie en, uiteraard, voorbeelden bespreken.
"Simpel gezegd, een haak is een tijdelijke aanduiding voor een actie."
Achter elke goed geschreven software staat een solide concept dat de vragen van wat en waarom beantwoordt. Haken zijn geen uitzondering. Simpel gezegd, een haak is een tijdelijke aanduiding voor een actie. Wanneer zich een belangrijke gebeurtenis voordoet, zoals het publiceren van een bericht, wordt een haak geactiveerd, zodat relevante reacties kunnen plaatsvinden. In termen van ontwikkelaars kan men haakjes zien als de implementatie van een gebeurtenisgestuurd systeem.
Meer dan alleen een definitie, een concept vereist redeneren-steun die verklaart waarom het nuttig is. Haken spelen een integrale rol in WordPress vanwege de steeds evoluerende aard van het project. Met honderden ontwikkelaars die het systeem voortdurend bijwerken, is het niet mogelijk om de kernbestanden te bewerken voor elke plug-in, thema of speciale aanpassing, omdat deze vaak zullen veranderen. In plaats daarvan is een raamwerk nodig om het systeem uit te breiden, zodat externe functionaliteit net zoveel effect heeft als interne manipulaties. Haken zijn de sleutel tot dit kader.
Als ontwikkelaar wordt iemands rol uitgebreid om niet alleen te begrijpen wat iets doet of waarom het wordt gedaan, maar ook om te beseffen hoe het is gemaakt. Met andere woorden, om het systeem van haken volledig te begrijpen, moet men begrijpen hoe ze worden geïmplementeerd.
Net als bij een meerkeuzetest is het echter niet per se het beste idee om rechtstreeks naar de antwoorden te kijken. Zoals veel teststrategieën suggereren, is het vaak beter om de vraag te lezen, uw eigen gedachten over het antwoord te formuleren en vervolgens de keuze te kiezen die het meest lijkt op uw redenering. Een vergelijkbare methode kan worden toegepast bij het begrijpen van software-ontwikkelingimplementaties; in plaats van te kijken naar de code van iemand anders om te begrijpen hoe een functie wordt gerealiseerd, is het vaak nog nuttiger om deze eerst zelf te implementeren en dan terug te komen om te onderzoeken hoe deze functie feitelijk is gerealiseerd. Dit is precies wat we zullen doen.
In plaats van te kijken naar de code van iemand anders om te begrijpen hoe een functie wordt gerealiseerd, is het vaak nog nuttiger om deze eerst zelf te implementeren en dan terug te komen om te onderzoeken hoe deze daadwerkelijk wordt uitgevoerd.
Om inzicht te krijgen in hoe een systeem wordt geïmplementeerd, is documentatie vaak een nuttige start. Laten we de samenvattingen van de twee belangrijkste WordPress hook-functies bekijken volgens de Codex:
add_action ($ hook, $ function [, $ priority [, $ numArgs]])
- Geeft een functiehandler aan, $ functie
, om eenmaal een bepaalde haak te worden genoemd, $ haak
, wordt geactiveerd vanwege het optreden van een gebeurtenis. $ prioriteit
bepaalt of deze functiebehandelaar vóór of na andere functiebehandelaars wordt aangeroepen en standaard op 10. Lagere prioriteiten resulteren in een functie die eerder wordt aangeroepen en omgekeerd. $ numArgs
is het aantal argumenten dat de functie-afhandeling zal aannemen en staat standaard op 1.do_action ($ hook [, $ arg1 [, $ arg2 [, $ arg3 [,?]]]])
- Activeert een bepaalde haak, $ haak
, door alle afhandelingsfuncties te bellen met de optionele argumenten $ arg1
, $ arg2
, $ arg3
, enz.Met de documentatie in de hand is het tijd om wat conclusies te trekken over deze twee functies. add_action
hoeft slechts een functie, prioriteit en aantal argumenten te associëren met een string. Dit lijkt de perfecte taak voor een PHP-array, die dubbel fungeert als een hash-kaart met sleutel / waarde-paren. do_action
is nog meer triviaal, vereist een eenvoudige opzoeking in deze zelfde array om de overeenkomstige functie-afhandelaars te vinden en ze vervolgens te bellen. Met onze inzichten in gedachten is het tijd om over te gaan tot onze implementatie.
Omdat we dit doen om inzicht te krijgen in het WordPress-haaksysteem, is het niet nodig om deze twee functies letterlijk uit de documentatie te implementeren. Laten we ons in plaats daarvan concentreren op hun implementaties zonder de optionele argumenten om tijd te besparen en toch de kern ervan te achterhalen.
Voordat we beginnen, laten we een overzicht maken:
add_action
zal de gegeven hook-naam en een set corresponderende functie-afhandelaars opslaan als sleutel / waarde-paar in de array.do_action
zal de corresponderende functie-afhandelaars ophalen voor een gegeven haaknaam en ze allemaal bellen.Dit levert de volgende code op:
$ actions = array (); functie add_action ($ hook, $ function) global $ actions; // maak een array van functiehandlers als deze nog niet bestaat als (! isset ($ acties [$ hook])) $ acties [$ hook] = array (); // voeg de huidige functie toe aan de lijst met functiehandlers $ actions [$ hook] [] = $ function; function do_action ($ hook) global $ actions; if (isset ($ actions [$ hook])) // noem elke functiehandler geassocieerd met deze hook foreach ($ acties [$ hook] als $ functie) call_user_func ($ function);
Dat is niet slecht; we implementeerden een veelzijdig haaksysteem in ongeveer 20 regels code. Nu we een idee hebben gekregen van hoe hooks werken, laten we ons verdiepen in de kerncode van WordPress om onze hypothese te bevestigen.
Een hulpmiddel om snel door deze code te navigeren is Yoast's PHP-kruisverwijzing van de WordPress-bron. Op zoek naar add_action
levert de volgende code op:
functie add_action ($ tag, $ function_to_add, $ priority = 10, $ accepted_args = 1) return add_filter ($ tag, $ function_to_add, $ priority, $ accepted_args); function add_filter ($ tag, $ function_to_add, $ priority = 10, $ accepted_args = 1) global $ wp_filter, $ merged_filters; $ idx = _wp_filter_build_unique_id ($ tag, $ function_to_add, $ priority); $ wp_filter [$ tag] [$ priority] [$ idx] = array ('function' => $ function_to_add, 'accepted_args' => $ accepted_args); niet ingesteld ($ merged_filters [$ tag]); geef waar terug;
add_action
calls add_filter
wat, niet verrassend, de gegeven functie toevoegt aan een array die is ingetoetst door de haaknaam, $ tag
. Hoewel er iets meer aan de hand is vanwege de $ prioriteit
en $ accepted_args
parameters, deze functie komt in wezen overeen met die van ons en bevestigt onze vermoedens. do_action
, zij het langer en een beetje complexer, komt neer op de volgende code:
functie do_action ($ tag, $ arg = ") [Weggelaten code die statistieken registreert, argumenten verwerkt en deals heeft met filters] do foreach ((array) current ($ wp_filter [$ tag]) als $ the_) if (! is_null ($ the _ ['function'])) call_user_func_array ($ the _ ['function'], array_slice ($ args, 0, (int) $ the _ ['accepted_args'])); while (volgende ($ wp_filter [$ tag])! == false); [Weggelaten code die opruimt]
Het doorlopen van de bijbehorende functies en het aanroepen van een ieder is ons niet vreemd; in feite is het precies wat we hebben verondersteld bij onze implementatie. Daarom heeft ons begin met onze eigen gedachten over de code niet alleen ons geholpen om het beter te begrijpen, maar ook vereist kritisch denken en problemen oplossen die essentieel is voor softwareontwikkeling.
Met ons begrip van wat, waarom en hoe goed in de hand, is het tijd om verder te gaan naar twee voorbeelden. De eerste is een spel op RSS; in plaats van meldingen via syndicatie, waarom geen e-mail gebruiken in plaats daarvan?
Om ons systeem te implementeren, moeten we zoeken naar wanneer een bericht is gepubliceerd. Maar welke haak moeten we gebruiken? De API-actiereferentie biedt een lijst met haken en beschrijvingen van de bijbehorende gebeurtenissen die ons kunnen helpen om dit te identificeren. Inderdaad, de publish_post
De beschrijving van hook komt overeen met wat we nodig hebben, dus laten we er een functiehandler aan toevoegen:
add_action ('publish_post', 'notify_via_email');
Het enige dat overblijft, is een e-mailbericht sturen naar iemand in de notify_via_email
functiebehandelaar. Merk op dat de API-actiereferentie aangeeft dat de publish_post
hook geeft het bericht-ID door als argument voor onze afhandelingsfunctie. Dit zal ons in staat stellen informatie te krijgen over de post via de get_post
functie, zoals zo:
function notify_via_email ($ post_id) $ post = get_post ($ post_id); $ to = '[email protected]'; $ subject = 'Post gepubliceerd op'. get_bloginfo ('naam'); $ message = $ post-> post_title. 'is gepubliceerd op'. get_bloginfo ('naam'). ' vanaf ' . $ post-> post_date. '. Je kunt het bekijken op '. get_permalink ($ post_id). ''; wp_mail ($ to, $ subject, $ message);
Na het ophalen van het bericht gebruiken we de titel, de datum en de permalink in ons e-mailbericht. Het wordt vervolgens verzonden via de wp_mail
functie, waarvoor een ontvanger, onderwerp en bericht als parameters nodig zijn. Daarmee is ons eenvoudige systeem voor e-mailmeldingen voltooid. Merk op dat het niet wordt aangeraden om te bellen wp_mail
meerdere keren tegelijk, omdat het een aanzienlijke vertraging in de laadtijd van de pagina zal opleveren zodra de knop Publiceren wordt ingedrukt.
In eerste instantie lijkt het erop dat een thema een geschikter medium is voor dergelijke code. Integendeel, via, omdat het thema van een site vatbaar is voor herziening en verandering. Als gevolg hiervan kan de analysecode gemakkelijk verloren gaan in een overgang van het ene thema naar het andere.
Hoewel een beetje gekunsteld, was onze eerste toepassing een korte inleiding tot het gebruik van haken. Dit tweede voorbeeld leent zich echter veel meer voor gebruik in de echte wereld. We maken een eenvoudige Google Analytics-plug-in die automatisch trackingcode invoegt in de voettekst van een pagina.
In eerste instantie lijkt het erop dat een thema een geschikter medium is voor dergelijke code. Integendeel, via, omdat het thema van een site vatbaar is voor herziening en verandering. Als gevolg hiervan kan de analysecode gemakkelijk verloren gaan in een overgang van het ene thema naar het andere. Het maken van een plug-in omzeilt dit nadeel; omdat het actief blijft ongeacht welk thema wordt gebruikt, blijft de analysecode aanwezig en wordt de noodzaak voor thema-onderhoud verwijderd.
Maar hoe pluggen we code in de footer van een website? Dit gebeurt ook via haken. Als je eerder hebt gewerkt aan WordPress-thema's, heb je waarschijnlijk het wp_head
en wp_footer
functies in de hoofd- en voettekst van uw website. Beide functies zijn aanwezig om haken eenvoudig te activeren, zodat plugins eenvoudig code in deze vitale delen van de pagina kunnen invoegen. Daarom voegen we gewoon een actie toe aan de wp_footer
haak:
add_action ('wp_footer', 'add_google_analytics_code');
Onze add_google_analytics_code
functie, zoals de naam al doet vermoeden, drukt de Google Analytics-code af:
Vergeet niet om te veranderen UA-XXXXX-X
naar uw site-specifieke ID en u bent klaar! Voeg deze code toe aan een bestand en upload het naar uw WordPress-directory voor plug-ins. Zorg ervoor dat u een plug-in-header invoegt, zoals:
Vergeet niet om de naam van de auteur, de auteur URI, te wijzigen en, uiteraard, de plug-in te activeren!
Door haken op te splitsen in een concept, een implementatie en voorbeelden, hebben we ze effectief onderzocht van binnenuit de WordPress-kern naar buiten in een real-world applicatie. In plaats van alleen te kijken naar de kerncode van WordPress, implementeerden we onze eigen versie van haken volgens conclusie, waardoor we een dieper, ontwikkelaar-achtig begrip van dit krachtige systeem konden verkrijgen. Ten slotte hebben we met een real-world plugin-app voor Google Analytics voorlopige inzichten verkregen over hoe nuttig hooks eigenlijk kunnen zijn. Zorg ervoor dat je de volgende keer meedoet en deel gerust je eigen, innovatieve gebruik van hooks in de onderstaande opmerkingen!