I den forrige del af vores serie Vi har skabt basen til et WordPress-plugin, der kan genkendes af kernen. I dag skal vi lære at rent faktisk ændre standardfunktionen i kernen.

Konceptet kroge, handlinger og filtre er ansvarlig for det; at være det virkelige hjerte af hele WordPress pluginsystemet.

Alt starter fra de "kroge", der leveres af kernen selv.

Hvad er en "krog"? Det er et specielt markeret sted i koden (af et script), hvor nogle bevidst registreres - "hooked in" - funktioner kan udføres i den rækkefølge, der er defineret ved registrering.

WordPress har to typer kroge, der adskiller sig i deres formål:

  • Handlingskrog: Markerer stedet for at udføre en handling, for eksempel procesindgang og gem resultater i en database
  • Filterkrog: markerer stedet for at anvende en ændring til en værdi (normalt angivet som variabel), så følgende kode vil bruge den justerede værdi

Lad os dykke ind i detaljerne ...

Arbejder med handlinger

Den fælles logik af WordPress-handlinger er meget enkel:

  1. Marker stedet, hvor den brugerdefinerede kode skal gå, med en "action hook" og dens parametre
  2. Opret handlingsfunktionen, der udfører den nye kode ved hjælp af (hvis nødvendigt) parametre fra krogen
  3. Registrer handlingen (# 2), der skal udføres, når krogen (# 1) fyres med en vis prioritet
  4. Når WordPress indlæser den ønskede side og finder krogen, vil den se efter alle funktioner "hooked in" den og udføre dem en efter en i overensstemmelse med deres prioritet

For at udføre opgave nr. 1 har vi funktionen 'do_action':

do_action($tag, $arg_1, $arg_2, ... , $arg_n);

Det accepterer følgende parametre: $ tag - krogen "navn", der hjælper med at identificere den bestemte krog og skelne den blandt andre; $ arg_1, $ arg_2, ..., $ arg_n - værdier for handlinger, der skal accepteres som parametre. Der kunne være så mange argumenter som nødvendigt - fra nul op til et rimeligt beløb.

WordPress selv har mange foruddefinerede kroge til brug:

do_action( 'init' );

Dette er meget ligetilfælde uden yderligere parametre. Denne krog er fyret, når det meste af WordPress er oprettet, og der er kommet tid til at registrere brugerdefinerede objekter, som f.eks. Brugerdefineret posttype.

do_action('save_post', $post_id, $post);

I dette eksempel bliver krogen fyret, når posten er gemt og giver to yderligere parametre til at fungere med - post_id og postobjekt indeholdende alle dataene fra det gemte indlæg.

Men at skabe kroge er ikke kun et privilegium af kerneholdet; hver udvikler kan lave en brugerdefineret krog til plugin (eller tema). Takket være dette har vi stor magt, for eksempel giver temastrukturer barnetemaer at ændre ikke kun stilarter, men også opmåling af forældre uden at overskrive hele filer.

do_action( 'my_truly_custom_hook' );

Når vi har fundet (eller skabt) en ordentlig krog og skabt en brugerdefineret funktion til det, skal vi registrere det seneste til udførelsen med 'add_action'.

add_action($tag, $function_to_add, $priority, $accepted_args_number);

Som det kunne forventes, accepterer 'add_action'-metoden to obligatoriske parametre: $ tag: navnet på den relevante krok og $ function_to_add: navnet på den funktion, der skal udføres. De andre to parametre er valgfrie: $ prioritet: et helt tal for at angive rækkefølgen, hvor de registrerede funktioner udføres (som standard 10), $ accepted_args_number: antal argumenter, som den registrerede funktion vil acceptere (som standard 1) .

Lad os se på et eksempel for at illustrere hele processen. Antag, at vi gerne vil tilføje en lille meddelelse nederst på vores hjemmeside. Vi kunne bruge 'wp_footer'-krogen til dette, fordi det er en del af obligatorisk footer-kode, at hvert tema bør omfatte.

function msp_helloworld_footer_notice(){echo "
Hello, I'm your custom notice
";}add_action('wp_footer', 'msp_helloworld_footer_notice');

I dette eksempel opretter vi en præfikset funktion, der blot udsender meddelelsens markering (betydningen af ​​de præfikser, vi har diskuteret i den forrige artikel , så venligst henvis til det for detaljer) og derefter tilsluttet det til 'wp_footer'. Når vi har inkluderet denne kode i vores plugin-fil (også diskuteret i den forrige artikel), vil vi se resultatet på webstedet.

cnotice

Arbejder med filtre

Filtre arbejder med samme logik som handlinger. Den eneste forskel er, at de ikke blot udfører et stykke kode på et bestemt sted. De udfører denne kode TIL ÆNDRING af en vis værdi givet til dem ved krogen. Dette betyder, at hver filterkrog har den tilhørende værdi (i de fleste tilfælde båret af en variabel).

Funktionen, der udfører filtrering, skal tage denne værdi, ændre den på en eller anden måde og derefter returnere den til yderligere brug. Således at syntaxen af ​​funktioner, der er ansvarlige for kroge og filtre, er lidt anderledes.

apply_filters($tag, $value_to_filter, $arg_1, $arg_2, ... , $arg_n);

Funktionen 'apply_filter' opretter en filterkrog med $ tag navn og den obligatoriske parameter $ value_to_filter (den kan være tom, men skal være til stede for bedste praksis). Andre argumenter er valgfrie og fungerer på samme måde som for handlinger.

filter_function($value_to_filter, $arg_1, $arg_2, ... , $arg_n){//filtering code goes herereturn $value_to_filter; //value has to be returned back}

Dette er et skelet af filterfunktion, der demonstrerer, at der skal a) acceptere mindst ét ​​argument, værdien for modifikation; og b) returnere værdien i slutningen.

add_filter($tag, $function_to_add, $priority, $accepted_args);

Funktionen 'add_filter' registrerer en funktion med et navn angivet som $ function_to_add argumentet for $ tag filter krog. De valgfrie argumenter - $ prioritet og $ accepted_args - fungerer på samme måde som for handlingskrog.

Lad os demonstrere hele processen i aktion: En fælles plugin-opgave er at tilføje noget indhold i slutningen af ​​et indlæg. Hvis vi ser nærmere på 'the_content' -skabelonen ( queryposts.com/function/the_content ), som normalt bruges til at udgive et indlægs indhold i et tema, vil vi opdage, at den indeholder følgende filterkrog:

$content = apply_filters('the_content', $content);

Ved hjælp af denne krog kan vi nemt tilføje noget til slutningen af ​​posten på følgende måde:

function msp_helloworld_post_footer($content) {$content .= "";return $content;}  add_filter ('the_content', 'msp_helloworld_post_footer', 100); 

Vær opmærksom på, at vi bruger ganske stort antal til prioritet her for at sikre, at alle standardfiltre er blevet anvendt før vores 'msp_helloworld_post_footer'. Efter at have inkluderet koden i plugins fil, skal vi se resultatet på webstedet:

pfooter

Sådan finder du kroge

Det skal nu være indlysende, at for at implementere handling og filter funktionalitet skal vi vide, hvilke kroge der er til rådighed.

WordPress Codex giver en Handlingsreference med de fleste handlingskroge fyret på typisk sidelast og a Filter Reference med en liste over almindeligt anvendte filtre. Disse referencer er nyttige til at forstå ordens rækkefølge og filtre, så du kan vælge, hvor og hvornår funktionaliteten kan og skal injiceres.

Derefter er du klar til rejsen i kildekoden. Du kan bare udføre en søgning gennem WordPress-filerne til søgeordene 'do_action' og 'apply_filters' for at finde den kroge, du har brug for.

forståelse WordPress forespørgselslogik kan også hjælpe dig med at finde ud af, hvor nogle kroge kan søges.

Endelig kan du henvise til WordPress Hooks Database der indeholder fuldstændig information om kroge i kernefilerne.

Avancerede operationer med kroge

Ud over at blive tilføjet til dit plugin kan handlinger og filtre også fjernes med en lignende syntaks.

Handlinger kan fjernes på følgende måde:

remove_action($tag, $function_to_remove, $priority, $accepted_args);remove_all_actions($tag, $priority);

Som du sikkert har gættet 'remove_action' fjernes en bestemt handling, der er registreret for en bestemt krog (du skal angive korrekt prioritet og antal argumenter, som de blev brugt ved registrering), og 'remove_all_actions' hjælper med at fjerne alle handlinger registreret med en bestemt Krog med en given prioritet (hvis det prioriterede argument udelades, fjerner funktionen alle handlinger).

Du har sikkert hørt om en populær sikkerhedsanbefaling for at skjule WordPress-versionen fra hovedafsnittet på webstedet. Dette er et job for 'remove_action'.

Først og fremmest lad os finde koden, der hakker funktionen 'wp_generator' for at udskrive versionsoplysningerne ved at bladre /wp-includes/default-filters.php . Koden der gør dette ser ud som følger:

add_action('wp_head', 'wp_generator');

For at eliminere effekten af ​​denne kode skal vi et eller andet sted i vores plugin indeholde den modsatte funktion:

remove_action('wp_head', 'wp_generator');

Filtre kan fjernes på samme måde:

remove_filter($tag, $function_to_remove, $priority, $accepted_args);remove_all_filters($tag, $priority);

Det Plugin API giver også udviklere mulighed for at opdage, om den pågældende kroge har registreret funktioner til at udføre:

has_action($tag, $function_to_check);has_filter($tag, $function_to_check);

Begge funktioner kontrollerer, om en bestemt handling eller et filter er registreret til en krog og vender tilbage: sandt til succes, falsk ved fejl. Inde i den hooked funktion har vi evnen til at kontrollere, hvilken krog har udløst dens udførelse på følgende måde:

if('hook_to_check_name' === current_filter()){//do stuff related to 'hook_to_check_name' hook}

På trods af navnet fungerer 'current_filter' ikke kun med filtre, men også med handlinger. For det fulde sæt af plugin API funktioner henvises til Codex .

Real-world sag

Lad os grave op på det pluginskelet, som vi forberedte os på den forrige del af serien , og ånde noget liv ind i det.

Vi skal udfylde filen 'core.php' (den centrale del af vores plugin er beregnet til at udnytte funktionaliteten) med koden, der løser en virkelig opgave ved hjælp af handlinger og filtre.

Hvad skal vi gøre? Antag, at dit WordPress-websted accepterer gæsteposter fra forskellige forfattere, men giver dem ikke tilladelse til at oprette deres egne konti til udstationering. Det betyder, at brugeren, som har udgivet artiklen, og den reelle forfatter af den (gæsten) er forskellige mennesker. Du skal sørge for, at den faktiske forfatter får kredit. Dette kan gøres med brugerdefineret taksonomi.

Lad os oprette en brugerdefineret taksonomi at håndtere gæstens forfatters navn (som et udtryk) og kort forfatters bio (som en beskrivelse). Vi ville være i stand til at tildele forfatterens navne som enhver anden taksonomiets vilkår (som tags) til indlæg. Herefter bliver det muligt at udsende en forfatters boks lige efter postens tekst. Her er koden:

/** Hook plugin's action and filters **/function msp_helloworld_init(){add_action('init', 'msp_helloworld_taxonomies');add_filter('the_content', 'msp_helloworld_author_block_filter');add_filter('post_class', 'msp_helloworld_post_class');}add_action('plugins_loaded', 'msp_helloworld_init');/** Register custom taxonomy **/function msp_helloworld_taxonomies(){$args = array('labels' => array('name'          => 'Guest authors','singular_name' => 'Guest author'),'show_in_nav_menus' => false);register_taxonomy('gauthor', array('post'), $args);}  / ** Opret forfatterens box markup ** / funktion msp_helloworld_author_block () {global $ post; $ author_terms = wp_get_object_terms ($ post-> ID, 'gauthor'); hvis (tom ($ author_terms)) returneres; $ name = stripslashes $ author_terms [0] -> navn); $ url = esc_url (get_term_link ($ author_terms [0]); $ desc = wp_filter_post_kses ($ author_terms [0] -> beskrivelse); $ out = " 
"; $ out. ="
Dette er et gæsteblad af {$name}
"; $ out. ="
{$desc}
"; return $ out;} / ** Tilføj forfatterens boks til slutningen af ​​posten ** / funktion msp_helloworld_author_block_filter ($ indhold) {hvis (er_single ()) $ indhold. = msp_helloworld_author_block (); returner $ content;} / * * Tilføj tilpasset CSS klasse til postens container ** / funktion msp_helloworld_post_class ($ post_class) {global $ post; $ author_terms = wp_get_object_terms ($ post-> ID, 'gauthor'); hvis (! Tom ($ author_terms)) {$post_class[] = 'gauthor';} returnere $ post_class;}

Som du kan se, har vi oprettet en handling for at registrere en brugerdefineret taksonomi og anvendt den til 'init'-krogen - dette er en anbefalet praksis. Derefter har vi oprettet skabelonen, der er ansvarlig for forfatterboksens markering ved hjælp af native WordPress-funktioner som 'wp_get_object_terms'. Derefter vedhæftede vi denne boks til slutningen af ​​postindhold ved hjælp af filterkrogen "the_content". Og endelig har vi tilføjet den brugerdefinerede CSS klasse til gæstens indlægsbeholder til styling fleksibilitet i temaet. Efter at have brugt nogle stilarter kan vi se resultatet:

gauthor

Konklusion

Handlinger og filtre er den vigtigste del af enhver WordPress-udvikling. Nu hvor du forstår deres logik og adfærd, er du klar til dine egne eksperimenter.

Klik her for at downloade vores udvidede "Hello World" plugin eksempel til at bruge som skelet til din egen udvikling.

Hvilke anvendelser har du fundet for WordPress-handlinger og -filtre? Hvad vil du se dækket i næste del af denne serie? Lad os vide i kommentarerne.

Udvalgte billede, Modul billede via Shutterstock