I det første innlegget i denne serien tok vi definert hva APIen er, hvordan det skiller seg ut fra innstillings-API, og noen av de generelle samtalene vi kan gjøre til APIen. I dette innlegget tar vi en titt på en praktisk implementering av API og hvordan du håndterer noen idiosynkrasjoner som kommer med å håndtere utløpte data.
WordPress Transients API er et kraftig (men veldig enkelt å bruke) aspekt av WordPress API. Generelt sett gjør det det veldig enkelt å lagre data med en utløpstid, og gjør det veldig enkelt å dra nytte av ulike caching-plugins for å øke hastigheten på nettstedet ditt..
I forbindelse med dette pluginet kommer vi til å lage en enkel widget som vil liste en bloggs toppkommentarer av all tid. Målet med plugin er å holde det lunt, slik at vi kan markere transientfunksjonaliteten til plugin.
Merk at alle pluginfilene kan hentes fra GitHub når som helst. I mellomtiden, fortsett og opprett en katalog kalt "toppkommentarer-bufret" og sørg for at den har følgende katalogstruktur:
Hvis du ikke er interessert i å lokalisere plugin-modulen, vær så snill å forlate katalogen 'lang' ut av plugin-modulen. På dette tidspunktet er vi klare til å begynne å skrive widgeten.
Pluggen er enkel. Det burde?
Lett nok. Her er koden for grunnleggende plugin. Legg merke til at det er kommentert gjennom så tilbringe en gang å lese gjennom det for å forstå hva vi gjør. Hvis du ikke er kjent med widget-API, ikke glem å sjekke ut vår WordPress Widget Boilerplate-post.
klasse Top_Commenters_Cached utvider WP_Widget const name = 'Top Commenters (Cached!)'; const locale = 'top-commenters-cached-locale'; const slug = 'top-commenters-cached'; / * ------------------------------------------------ - * / / * Constructor / * ----------------------------------------- --------- * / / ** * Widgetkonstruktøren. Angir klassenavn og beskrivelse, instantiates * widgeten, laster lokaliseringsfiler, og inneholder nødvendige skript og * stiler. * / funksjon Top_Commenters_Cached () $ widget_opts = array ('classname' => self :: name, 'description' => __ ('Et plugin som brukes til å demonstrere WordPress Transients API for en Envato bloggserie.' locale)); $ this-> WP_Widget (selv :: slug, __ (selv :: navn, selv :: locale), $ widget_opts); load_plugin_textdomain (self :: locale, false, dirname (plugin_basename (__FILE__)). '/ lang /'); // endekonstruktor / * ------------------------------------------- ------- * / / * API Funksjoner / * ----------------------------------- --------------- * / / ** * Utfører innholdet i widgeten. * * @args Gruppen av formelementer * @instance * / function widget ($ args, $ instance) ekstrakt ($ args, EXTR_SKIP); ekko $ before_widget; $ widget_title = tomt ($ instance ['widget_title'])? ": apply_filters ('widget_title', $ instance ['widget_title']); $ commenters = $ this-> query_for_commenters (); // Vis widgeten inkluderer (WP_PLUGIN_DIR . '/'. selv :: slug. '/views/widget.php'); echo $ after_widget; // end widget / ** * Behandler widgetens alternativer som skal lagres. * * @new_instance Den tidligere forekomsten av verdier før oppdateringen. * @old_instance Den nye forekomsten av verdier som skal genereres via oppdateringen. * / funksjonsoppdatering ($ new_instance, $ old_instance) $ instance = $ old_instance; $ instance ['widget_title'] = $ this-> strip ($ new_instance, 'widget_title'); returner $ instance; // end widget / ** * Genererer administrasjonsskjemaet for widgeten. * * @instance Utvalget av nøkler og verdier for widgeten. * / funksjonsskjema ($ eksempel) $ instance = wp_parse_args ((array) $ instance, array ('widget_title' => ")); $ widget_title = $ this-> strip ($ instance, 'widget_title'); // Vis administrasjonsskjemaet inkluderer (WP_PLUGIN_DIR. '/'. Selv: slug. '/Views/admin.php'); // sluttform / * ------------------------------------------- ------- * / / * Private Funksjoner / * ----------------------------------- --------------- * / / ** * Henter de ukentlige toppkommentarerne for den siste uken og lagrer verdiene i hurtigbufferen. * Hvis hurtigbufferen er tom, vil funksjonen be om informasjon fra databasen og * lagre den i hurtigbufferen. * / Private funksjon query_for_commenters () $ commenters = null; // spørre databasen for toppkommentarenes globale $ wpdb; $ commenters = $ wpdb-> get_results ("velg telling (comment_author) som comments_count, comment_author, comment_type fra $ wpdb-> kommentarer der comment_type! = 'pingback' og comment_author! =" og comment_approved = '1' gruppe av kommentar_author rekkefølge av comment_author desc LIMIT 10 "); returnere $ commenters // end query_for_commenters / * --------------------------------- ----------------- * / / * Hjelperfunksjoner / * ------------------------- ------------------------- * / / ** * Convenience metode for stripping merker og skråstreker fra innholdet * av en skjemainngang. * * @ obj forekomsten av argumentet array * @title tittelen på elementet som vi fjerner tagger og skråstreker. * / privat funksjonstegn ($ obj, $ title) return strip_tags (stripslashes ($ obj [$ title]) ); // end strip // end class add_action ('widgets_init', create_function (", 'register_widget (" Top_Commenters_Cached ");')); ?>
Neste, la oss se på widgetens visning. Dette er delen av plugin-modulen som er ansvarlig for å vise listen over kommentarer. Det fungerer ved å vise widgetens tittel (hvis den er definert), og slår seg gjennom resultatene som oppretter et nytt listeelement.
0) ?>'; foreach ($ kommenterer som $ commenter) $ comment_list. = '
Tydeligvis har vi slått ut en del av koden. Nemlig, administrasjonspanelet. Det bør bare tillate brukere å legge inn en tittel for deres widget:
Husk at du kan vise full kildekoden og laste ned pluginet fra sitt GitHub-lager.
På dette punktet har vi en funksjonell plugin; Vi kaster imidlertid ingen data enda. Den mest intensive delen av denne plugin er når vi spør etter databasen, og resultatene av spørringen er hva vi faktisk ønsker å cache, så la oss gjøre det.
Finn søket i koden:
global $ wpdb; $ commenters = $ wpdb-> get_results ("velg telling (comment_author) som comments_count, comment_author, comment_type fra $ wpdb-> kommentarer der comment_type! = 'pingback' og comment_author! =" og comment_approved = '1' gruppe av kommentar_author rekkefølge av comment_author desc LIMIT 10 ");
Og la oss lagre resultatene i 12 timer ved hjelp av transient API:
set_transient ('top_commenters_cached', $ commenters, 60 * 60 * 12);
Ganske enkelt, ikke sant? Selvfølgelig er vi ikke ferdige ennå.
Når transient er satt, må vi kunne hente forbigående. La oss sette opp det nå:
privat funksjon query_for_commenters () return get_transient ('top_commenters_cached'); // end query_for_commenters
Det er alt der er til det!
Men vent - hvis du husker fra det første innlegget i serien, utløper transienter faktisk slik at vi ikke garanterer å hente forbigående.
Uansett hva du gjør, følger det med å hente data som har utløpt, vanligvis samme prosess:
Så la oss gjøre det i sammenheng med vårt plugin:
privatfunksjon query_for_commenters () $ commenters = null; // Sjekk for å se om forbigående eksisterer. sett det hvis det er utgått eller mangler hvis (! get_transient ('top_commenters_cached')) // spørre databasen for den øverste kommentars globale $ wpdb; $ commenters = $ wpdb-> get_results ("velg telling (comment_author) som comments_count, comment_author, comment_type fra $ wpdb-> kommentarer der comment_type! = 'pingback' og comment_author! =" og comment_approved = '1' gruppe av kommentar_author rekkefølge av comment_author desc LIMIT 10 "); // lagre resultatet set_transient ('top_commenters_cached', $ commenters, 60 * 60 * 12); // ende hvis // transient er garantert å eksistere nå, så returner det return get_transient ('top_commenters_cached '); // end query_for_commenters
Ikke så ille, ikke sant?
Som du kan se, krever det å arbeide med Transient-API-en lite mer enn å vite når du skal bruke den og hvilke funksjoner som er tilgjengelige. Etter min mening er det en av de kraftigste aspektene av WordPress API.
Hvis du finner deg selv å hente store mengder data, leter etter en måte å utelate data for en oppdatering, eller bare ønsker å utnytte caching-pluginene, husk å dra nytte av Transients API.