Gjør-det-selv WordPress Planlegging Mastering WP-Cron

Som en av de mindre brukte WordPress-funksjonene, blir WP-Cron ofte oversett av utviklere. Dens applikasjoner er imidlertid ingen latter. Fra caching til varsler for å rydde opp, kan planlegging av cron-jobber jobbe for å skape en klar fordel i selv den mest enkle WordPress-bloggen. Bli med når vi undersøker viktige anvendelser av dette systemet.


Bare en gjennomsnittlig Cron jobb? Tenk igjen.

WP-Cron er ikke det samme som Unix cron planleggeren?

Umiddelbart ved å se ordet cron, Jeg er sikker på at du har tatt en stab på hvor vi er på vei: planlegger perfekt timed events å løpe med bestemte intervaller. Tvert imot er WP-Cron ikke det samme som Unix cron planleggeren. Hovedforskjellen ligger i hvordan den drives; I motsetning til en bakgrunnsprosess, sparker WP-Cron i hver gang en besøkende åpner ditt WordPress-drevne nettsted. Som sådan beholder den det vitale karakteristiske ved upresistent tidspunkt.

Ja, du leser riktig: upresent timing. Selv om ordene cron og nøyaktighet er som to erter i en pod, harmoniserer de ikke i WordPress 'system. Men er dette virkelig et problem? Hvis det vurderes i sammenheng med brukeren, blir dette faktisk en ressurs.

La oss ta eksemplet på en vanlig cron-jobb som kjører hvert femte minutt for å oppdatere noen databaseinformasjon som brukes på et nettsted. Hvis ingen besøkende besøker nettstedet i 40 minutter, hva er da poenget med å kjøre denne jobben åtte ganger? Alle mellomverdier ville både være foreldet og ubrukte. Hvis det omvendt skulle sparke inn på det første brukerbesøket etter minst fem minutter, ville det ikke bare utføre den samme jobben, men også forhindre unødvendige oppdateringer. Med andre ord, fordi WP-Cron er basert på brukeren, har den fordelen at bare kjører når besøkende er til stede.


Ikke slå rundt Bush. Vis meg!

For å bruke WP-Cron, la oss vurdere det ofte brukte RSS-administrasjonsprogrammet, FeedBurner. Langt en av de mest populære funksjonene i denne applikasjonen er dets evne til å telle RSS-abonnenter. Når det er indeksert, kan et nettsteds abonnenttall nås via et enkelt API-anrop. Det følger da at denne API-anropet kan gjøres en gang per sidevisning for å levere abonnenttellingen til seere. Dette fører imidlertid til et problem.


Skriv inn World of Caching

Hvis FeedBurner API er tilgjengelig én gang per sidevisning, fører det uunngåelig til en ekstra HTTP-forespørsel - for ikke å nevne en fra et annet domene - for hver besøkende. Dette øker sidenes lastetid for brukere.

For å motvirke dette problemet er det viktig å gjøre en nøkkelrealisering om denne leveringsmetoden: Det er usannsynlig at en RSS-abonnenttelling oppdateres på hver enkelt visning av siden. Faktisk oppdaterer FeedBurner bare sin telle en gang per dag. Selv om det skulle skifte seg raskt, er det virkelig nødvendig å vise de siste teller for hver besøkende? Betyr det at tellingen er litt utdatert, men senere oppdatert innen en dag?

For vårt formål er det helt ubrukelig å hente RSS-abonnenttellingen for hver sidevisning. I stedet, hvis det hentes for en besøkende, kan det bare gjenbrukes for fremtidige. Så, etter at en dag er gått, kan en oppdatering til denne tellingen gjøres. En slik prosess er kjent som caching. Etter å ha blitt oppdatert, blir RSS-abonnenttellingen lagret i cache-lagret for fremtidig bruk i stedet for å bli beregnet tilbake til en dag er gått. Og med det går vi inn i WP-Crons verden.


Trinn 1 Utforsk dokumentasjonen

For å forstå WP-Cron er det viktig å vite hvor dokumentasjon er tilgjengelig. WordPress.org gir oppsummeringer av hver cron-funksjon i sin Codex. For å fullføre vår tidligere definerte oppgave, må vi se på wp_schedule_event funksjon, som krever fire parametere:

  • Tid: en UNIX tidsstempel som angir når hendelsen skal utløse
  • Tilbakevending: Hvor ofte hendelsen skal tilbakestilles etter den planlagte tiden
  • Hook: En krok brukes til å legge til funksjonalitet når hendelsen utløses
  • Args: En rekke argumenter som skal overføres til alle tilkoblede funksjoner (valgfritt)

Vårt arrangement vil utløse når nåværende tid møtes eller overskrider tiden som er gått til denne funksjonen, som foreskrevet av en fremtidig besøkende på nettstedet. Det vil da retrigger basert på tilbakevendingsparameteren, som kan settes til time, twicedaily, daglig eller ingen. Tilpassede gjentakelsesplaner kan også defineres.

For å håndtere arrangementet benyttes en krok. Kort sagt, en WordPress-krok kan betraktes som en plassholder for en handling. Handlinger kan tilordnes kroker via WordPress ' ADD_ACTION funksjon. Nærmere bestemt, for å legge til en funksjonshåndterer til den angitte kroken, kan man ringe:

add_action ('hook_name', 'function_name');

hvor kroknavn og funksjonsnavn er henholdsvis navn på krok og håndteringsfunksjon.


Trinn 2 Kaller funksjonen

Fordi FeedBurner oppdateres en gang per dag, vil vi spesifisere en daglig tidsplan, som per koden under:

wp_schedule_event (tid (), 'daglig', 'feedburner_refresh');

Noter det tid() er dagens UNIX tidsstempel i sekunder. Hvis kjøringen starter, vil "FeedBurner Update" -kroken utløse umiddelbart og deretter en gang per dag etterpå. Merk at hvis vi skulle bare sette dette i vår WordPress functions.php-fil, ville det planlegge en ny hendelse på hver enkelt sidebelastning. Dette er ikke vår ønskede funksjonalitet; heller, vi vil bare planlegge denne hendelsen en gang. Den enkleste måten å gjøre dette på er å bare sjekke om hendelsen allerede er planlagt. Dette kan gjøres gjennom wp_next_scheduled funksjon, som vil returnere falsk hvis hendelsen ikke er satt til å utløse i fremtiden eller tidspunktet for sin neste utløser ellers:

hvis (! wp_next_scheduled ('feedburner_refresh')) wp_schedule_event (tid (), 'daglig', 'feedburner_refresh'); 

Hvis vi noen gang trenger å planlegge denne hendelsen, er det like enkelt som å ringe wp_unschedule_event funksjon, som tar de samme parametrene-lagre for gjentakelsen som wp_schedule_event. Vær oppmerksom på at tiden som er gått må være tidspunktet for neste utløser, som kan hentes via wp_next_scheduled:

hvis (false! == ($ time = wp_next_scheduled ('feedburner_refresh'))) wp_unschedule_event ($ time, 'feedburner_refresh'); 

Vi kan også planlegge denne hendelsen gjennom navnet på kaken ved hjelp av wp_clear_scheduled_hook funksjon. Vær oppmerksom på at dette alternativet også fjerner alle andre hendelser som bruker samme krok.

wp_clear_scheduled_hook ('feedburner_refresh');

Trinn 3 Distribuere kroken

Nå som arrangementet vårt er planlagt, må vi legge til en handler for det:

add_action ('feedburner_refresh', 'update_rss_subscriber_count');

Dette setter funksjonen oppkalt update_rss_subscriber_count å bli kalt en gang feedburner_refresh krok utløses. Det er nå på tide å skrive denne funksjonen.


Trinn 4 Henter FeedBurner Subscriber Count

For å hente abonnenttellingen i update_rss_subscriber_count funksjon, kan vi ringe til FeedBurners API via URL , der [NAME] er navnet på vår feed.

Dette vil returnere XML-data i følgende form:

     

Informasjonen vi leter etter er i sirkulasjonsattributtet. Følgende regulære uttrykk kan lett analysere dataene for denne verdien: sirkulasjon = "(. *?)".

Sett på engelsk, vårt vanlige uttrykk samsvarer med følgende:

  • sirkulasjon = - Ordet sirkulasjon etterfulgt av et like tegn
  • "(. *?)" - Sitater og alt inni

Kjører dette ved hjelp av preg_match funksjonen vil hente en rekke matcher som vil inneholde antall abonnenter i den første indeksposisjonen. Når du legger sammen denne informasjonen, får du følgende kode:

// finn FeedBurner url og hent dataene fra den // endre [NAME] til navnet på FeedBurner-feedet ditt $ url = 'https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri= [ NAVN]'; $ data = @file_get_contents ($ url); // @ vil surpress feil // bruk et vanlig uttrykk for å analysere data $ regex = '% circulation = "(. *?)"%'; preg_match ($ regex, $ data, $ matches); // få den resulterende tellingen hvis tilgjengelig $ count = false; hvis ($ matches && $ matches [1]) $ count = (int) $ matches [1];

Trinn 5 Lagre abonnentantallet

Nå som vi har hentet abonnenttellingen, må vi lagre den for tilgjengelighet. I stedet for å revidere API XML-dataene, vil besøkende bare få tilgang til denne lagrede verdien.

I stedet for å lage en database eller en fil for lagringsformål, kan vi ansette enda en WordPress-funksjon: alternativer. WordPress-alternativer er enkle måter å lagre biter av data sammen med å identifisere navn. Legge til, slette og få tilgang til alternativer er like enkle som følgende funksjoner:

  • update_option ($ navn, $ verdi) - Legger til eller oppdaterer et alternativ med navn $ name og verdi $ verdi.
  • delete_option ($ navn) - Slett et alternativ med navn $ name.
  • get_option ($ navn) - Få opsjonsverdien knyttet til navnet $ name.

Selv om vårt antall abonnenter ikke er teknisk sett en konfigurasjonsverdi, er det en av de mest praktiske måtene å bruke WordPress-alternativer - om ikke det mest praktiske - for å lagre slike enkle data. Derfor, for å lagre vår abonnent telling, bruker vi update_option metode som ikke bare vil overstyre tidligere verdier, men også opprette alternativet i utgangspunktet:

// Hvis en telle ikke ble funnet, ikke oppdater // i stedet, hold deg til forrige telle hvis ($ teller! == false) update_option ('subscriber_count', $ count);

Vår funksjon er fullført! Etter at du har satt opp hendelsen, gjenoppretter dataene via FeedBurner API, og lagrer ønsket verdi, er alt som er igjen å gjøre, utdata! Den fulle koden for planleggings- og gjenfinningsfunksjonen som du kan plassere i functions.php-kan finnes nedenfor:

// planlegge feedburner_refresh-hendelsen bare en gang hvis (! wp_next_scheduled ('feedburner_refresh')) wp_schedule_event (tid (), 'daglig', 'feedburner_refresh');  add_action ('feedburner_refresh', 'update_rss_subscriber_count'); funksjon update_rss_subscriber_count () // finn FeedBurner url og hent dataene fra den // endre [NAME] til navnet på FeedBurner-feedet ditt $ url = 'https://feedburner.google.com/api/awareness/1.0/ ? GetFeedData uri = [NAVN] '; $ data = @file_get_contents ($ url); // @ vil surpress feil // bruk et vanlig uttrykk for å analysere data $ regex = '% circulation = "(. *?)"%'; preg_match ($ regex, $ data, $ matches); // få den resulterende tellingen hvis tilgjengelig $ count = false; hvis ($ matches && $ matches [1]) $ count = (int) $ matches [1]; // Hvis en telle ikke ble funnet, ikke oppdater // i stedet, hold deg til forrige telle hvis ($ teller! == false) update_option ('subscriber_count', $ count); 

Trinn 6 Utgang

Abonnenttellingen er nå bare en eneste funksjonssamtale unna i hvilken som helst malfil:

echo get_option ('subscriber_count');

Konklusjon

Vår RSS-abonnenttelling er nå optimalisert; I stedet for å bli hentet for hver forespørsel, blir den lagret ved hjelp av WP-Cron, og sparer brukerens tid og reduserer bruken av båndbredde. Fordi det bare aktiveres når nettstedet vårt faktisk mottar en besøkende, er vår funksjon lat - et begrep som sikkert kan betraktes som bra i denne konteksten. Men dessverre, vi har bare avdekket en applikasjon av WP-Cron her; resten er opp til deg.

Har du din egen innovative applikasjon av WP-Cron? Del det med oss ​​i kommentarene!