WordPress-åtgärder och filter Vad är skillnaden?

Åtgärds- och filterhakar är en grundläggande del av de olika WordPress-API: erna. Utan dem är du begränsad till vad du kan göra i dina teman och (särskilt) dina plugins.

Men ibland kan det vara lätt att förvirra de två, speciellt i de fall då WordPress har både en handkrok och en filterkrok med samma namn.

I den här artikeln definierar jag åtgärd och filterhakar och beskriver skillnaden mellan dem, och jag ska demonstrera hur man använder dem i dina teman och plugins. Jag ska också ge några exempel på när du kan använda var och en.

När du lägger till åtgärden och filtrerar krokar till din kod (eller du kopplar funktioner till dem), hjälper det att förstå hur åtgärder och filter kallas av WordPress och vad som händer i vilken ordning. Jag kommer inte att täcka det i detalj här eftersom vi har en annan handledning som gör det jobbet.

Definitioner och skillnader

Låt oss börja med några definitioner. Jag ska definiera åtgärd och filtrera krokar och funktioner, så att du kan se skillnaden mellan dem alla.

funktioner

Funktioner är det första som de flesta arbetar med när de lär sig WordPress-utveckling. om du har lagt till kod till ditt tema functions.php fil, då har du skrivit en funktion.

Funktioner anger hur något kommer att hända. Du kodar en funktion för att söka data, för att skriva ut innehåll eller för att utföra många andra uppgifter. Du kan ringa (exekvera) funktioner direkt i tematets mallfiler, eller du kan koppla dem till åtgärd eller filterhakar. Funktioner kan också innehålla malltaggar som villkorliga taggar, för att ange när funktionen ska tillämpas.

Jag visar dig olika sätt att utföra funktioner senare i den här artikeln.

Åtgärd Krokar

Åtgärdshooks (eller åtgärder) utlöses när något äger rum, till exempel att ladda en sida, en användare loggar in eller en anpassad åtgärd som du definierar i ditt tema eller plugin.

Du kan lägga till egna handtag med hjälp av do_action () funktion, som jag ska demonstrera inom kort. Alla funktioner du kopplar till den åtgärden kommer då att köras i koden.

Filter krokar

Filtrera krokar eller filter, kontrollera hur något händer eller ändra något som redan utmatas. Du kan använda ett filter för att mata ut metadata i ett visst format, för att åsidosätta textutmatningen med ditt plugin, eller för att förhindra att något visas alls.

Du lägger till filter i din kod med hjälp av apply_filters () funktion, som jag ska demonstrera inom kort. När ordet "apply" indikerar, tillämpar du filter på befintlig kod, medan en åtgärd du skapar använder do_action () är tom tills du kopplar funktioner till den.

Använda funktioner, åtgärder och filter

Låt oss ta en titt på några exempel som visar hur du använder alla funktioner, åtgärder och filter. Först tittar vi på att använda funktioner direkt i din kod utan att fästa dem i en krok.

Ringa funktioner direkt

Här är ett exempel på en funktion som kallas direkt i en mallfil. På mina klientwebbplatser lägger jag till en kolofon i sidfoten, som innehåller upphovsrättsinformation. Här är funktionen:

om (! function_exists ('compass_colophon')) function compass_colophon () ?> 
"title =""rel =" home "> Drivs av WordPress och designad av Compass Design.

Denna funktion kan plugga som jag använder den i ett föräldertema; om jag sedan skapar en ny funktion med samma namn i mitt barntema, kommer det att överstyra denna funktion. Observera att funktionen innehåller en annan funktion, compass_colophon (), ringer det direkt i koden.

Den här funktionen finns i functions.php fil av mitt föräldertema. Jag kan ringa det direkt i footer.php fil av mitt tema, som så:

compass_colophon ();

Detta matar ut koden i funktionen vid den punkten i mitt tema där jag kallar det. Du kan också skicka parametrar till dina funktioner, vilka sedan används inom funktionen.

Som jag kommer att demonstrera inom kort, kan denna funktion också vara ansluten till en åtgärd eller ett filter.

Hooking Funktioner till åtgärder

Snarare än att ringa den kolofonfunktionen direkt, får jag större flexibilitet om jag fäster den i en krok.

Skapa åtgärdshooks

I stället för att ringa compass_colophon () funktion i min footer-fil kan jag lägga till en åtgärdskrok vid den punkten i footer.php fil genom att lägga till följande:

do_action ('compass_in_footer');

De do_action () funktionen har en obligatorisk parameter, vilket är namnet på åtgärden. Du kan också valfritt lägga till argument till det.

Hooking Funktioner till åtgärder

Så nu istället för att ringa min kolofonfunktion, måste jag koppla den till min nya actionshake. I min functions.php fil, lägger jag till detta med min funktion:

add_action ('compass_in_footer', 'compass_colophon');

Detta hakar min funktion till compass_in_footer åtgärd, vilket innebär att koden i min funktion kommer att springa vid den punkten i koden där åtgärden har placerats. Den första parametern är namnet på åtgärdskroken, och den andra är namnet på min funktion.

En fördel med att göra det på så sätt är att du kan koppla mer än en funktion till samma åtgärd, och du kan ställa in prioriteten så att de brinner i den ordning du vill att de ska.

Så låt oss säga att jag har en annan funktion som jag vill koppla till mina compass_in_footer krok, kallad compass_smallprint (), som innehåller lite mer litet tryck:

om (! function_exists (compass_smallprint ())) funktion compass_smallprint () // innehåll av funktionen här add_action ('compass_in_footer', 'compass_smallprint', 20);

Du kan se här att jag har lagt till en tredje parameter till min add_action () funktion, vilket är prioriterat. Standardprioriteten är 10, vilket kommer att tillämpas om du lämnar det här tomma. Så för att jag inte har prioriterat min compass_colophon () funktion, inställning 20 för compass_smallprint () funktionen gör att funktionen körs efter de compass_colophon () fungera.

Unhooking funktioner från åtgärder

Ibland vill du stoppa en funktion från att köra, och du kan inte åsidosätta den eftersom den inte kan pluggas. Om funktionen har kopplats till en handtagskrok kan du göra det med hjälp av remove_action () fungera.

Så om jag vill förhindra min compass_smallprint () funktion från att springa, jag hakar den från compass_in_footer åtgärd som så:

remove_action ('compass_in_footer', 'compass_smallprint', 20);

De remove_action () funktionen har tre parametrar: namnet på handlingskroken, namnet på funktionen och den prioritet som funktionen ursprungligen var ansluten till åtgärden. Du måste inkludera prioriteringen för att detta ska fungera.

Du kan också avaktivera alla funktioner från en åtgärd om du vill hindra dem från att köras. Var försiktig när du gör det, eftersom det kan vara funktioner du inte är medveten om att du är kopplad till din åtgärd.

För att göra detta, använd remove_all_actions () fungera:

remove_all_actions ('compass_in_footer');

Lägga till ett prioritetsnummer eftersom den andra parametern bara tar bort de funktioner som är anslutna till den här åtgärdskroken med den prioritet du har angett vilket ger dig mer kontroll.

Hooking funktioner till filter

Du har också möjlighet att koppla dina funktioner för att filtrera krokar. Du gör det här när du vill ändra eller åsidosätta någon befintlig kod. När du skapar filterkroken (med hjälp av apply_filters () funktionen), sätter du det runt koden i ditt tema eller plugin, vilket sedan ändras av alla filter som är fästa vid kroken.

Det här kan vara användbart om du har tema- eller pluginalternativ som du vill åsidosätta en standardinställning, eller om du skapar ett föräldertema som kan ha föremål översteg av ett barntema.

Skapa filterhakar

De apply_filters () funktionen har tre parametrar: namnet på filterkroken, det värde som du vill filtrera (dvs standardvärdet) och valfria variabler som du sedan skickar till de funktioner som är anslutna till filtret.

Du kan lägga till ett filter i dina temalmallfiler eller inne i en funktion som är ansluten via en åtgärdskrok. Låt oss ta en titt på båda alternativen.

Återvänder till min compass_colophon () funktion konverterar jag detta till ett filter genom att lägga till innehållet till mina footer.php filen inuti apply_filters () funktion som så:

echo apply_filters ('compass_colophon', ' 
"title =""rel =" home "> Drivs av WordPress och designad av Compass Design.
');

Detta matar ut koden som jag har satt som min andra parameter apply_filters () fungera.

Jag föredrar emellertid inte att lägga till det här direkt i min temmallfil, så jag lägger till filtret i den funktion som jag redan bifogar via en åtgärdskrok.

Så lägger jag till compass_in_footer åtgärd till min footer.php fil med hjälp av do_action () funktion som visas ovan, och då skapar jag en funktion i min functions.php fil som är ansluten till den åtgärden och innehåller ett filter:

om (! function_exists ('compass_colophon')) function compass_colophon () echo apply_filters ('compass_colophon_filter', ' 
"title =""rel =" home "> Drivs av WordPress och designad av Compass Design.
'); add_action ('compass_in_footer', 'compass_colophon');

Det betyder att jag nu kan åsidosätta standardinnehållet på ett av tre sätt:

  • genom att skapa en ny funktion som heter compass_colophon () i mitt barntema, vilket överstyrar funktionen i mitt föräldertema som det är pluggbart
  • genom att unhooking compass_colophon () funktion från compass_in_footer action hook och skriva en ny funktion som jag bifogar den på sin plats
  • genom att skapa en ny funktion som jag sedan hakar till compass_colophon_filter filterkrok, vilket överstiger värdet i mina apply_filters () fungera

I det verkliga livet skulle du inte behöva ha så många alternativ, så det är mer troligt att du skulle tillämpa filter på en del av innehållet i din funktion snarare än det hela.

Så jag kunde skapa två filter, en för upphovsrättsdelen och en annan för krediterna:

om (! function_exists ('compass_colophon')) funktion kompass_colophon () echo '
'; echo apply_filters ('compass_copyright_filter', ' "title =""rel =" home "> '); echo apply_filters ('compass_copyright_filter', ' Drivs av WordPress och designad av Compass Design. '); eko "
'; add_action ('compass_in_footer', 'compass_colophon');

Då kunde jag antingen åsidosätta hela min kompass_kolofonfunktion genom att haka på den eller skriva en ny i mitt barntema, eller jag kunde skapa en funktion som var ansluten till compass_copyright_filter eller compass_credits_filter filterkrok, för att åsidosätta varje element individuellt.

Hooking funktioner till filter

För att koppla en funktion till en filterkrok använder du add_filter () funktion, som har två parametrar: krokens namn och namnet på funktionen.

Så för att ändra krediterna skulle jag skriva den här funktionen:

funktion new_credits () ?>  Drivs av WordPress och designad av Rachel McCollin.   

Detta åsidosätter värdet i mitt original compass_credits_filter filterkrok med innehållet i mina new_credits () funktion, men håller allt annat i compass_colophon () fungerar på samma sätt.

Du kan också ange prioriteringar när du kopplar funktioner till filter på exakt samma sätt som med handtag. Funktioner med lägre prioritet körs först.

Unhooking funktioner från filter

Som med handtag kan du också ta bort funktioner från filterhakar. Du gör detta med funktionen remove_filter (), som har tre parametrar: namnet på filterkroken, namnet på funktionen och prioriteten, vilket är obligatoriskt om en prioritet ställdes in när funktionen ursprungligen var ansluten till filtret.

Så att ta bort mina new_credits () funktion, använder jag detta:

remove_filter ('compass_credits_filter', 'new_credits');

Kodutmatningen skulle då återgå till det värde jag specificerade i mitt original apply_filters () fungera. Så om jag ville ta bort new_credits () funktionen och har ingenting att se i dess plats, skulle jag behöva lägga till en ny funktion. Jag avhakar sedan den första funktionen och hakar min nya funktion så här:

funktion no_credits () return;  remove_filter ('compass_credits_filter', 'new_credits'); add_filter ('compass_credits_filter', 'no_credits');

Sammanfattning

Att förstå skillnaden mellan åtgärds- och filterhakar och att kunna använda dem båda effektivt kommer att ge ditt tema och plugin-utveckling ett steg. Faktum är att du inte kan skriva pluggar alls utan att använda krokar av minst en typ, eftersom det enda sättet koden i pluginerna är aktiverad är via åtgärden och filterhakarna den är fäst vid.

Denna guide visade dig hur man lägger till samma funktion med hjälp av en funktion, en handtagskrok och ett eller flera filterhakar, tillsammans med tekniker för att ta bort funktioner från krokar och råd om när varje teknik är mer användbar.

Förutom att koppla funktioner till egna åtgärds- och filterhakar som du skapar kan du koppla dem till de åtgärder och filter som tillhandahålls av WordPress, som t.ex. wp_head åtgärd eller body_class filtrera.