I de to første delene av denne serien fullførte vi et fullverdig plugin som viser oss serverstatus som dashbord-widget. Som sådan er den tilgjengelig for alle innloggede brukere. Enkelte opplysninger kan være følsomme, og vi vil ikke at de skal se det, så det er bedre å sjekke at brukerrollen skal avgjøre om vi skal gjøre widgeten tilgjengelig for dem.
WordPress bruker et konsept med roller, designet for å gi nettstedseieren muligheten til å kontrollere hva brukerne kan og ikke kan gjøre innenfor nettstedet. Hver rolle har lov til å utføre et sett med oppgaver kalt Evner. Vi kan tilpasse rollen og dens evner med add_roles og add_cap funksjoner.
Vårt plugin vil skape et nytt funksjonsanrop servermetric
. Bare brukeren som har den muligheten, kan laste inn modulene våre på dashbordet. Vi legger til denne muligheten for administratorroll, slik at alle administratorbrukerne ser det som standard.
For de andre brukerne kan du bruke Plugin User Role Editor til å administrere evnen til en bestemt bruker, og tilordne servermetic
mulighet for brukeren.
Vi bruker add_cap for å legge til en ny funksjon, men denne funksjonen skriver til databasen, så vi bør bare gjøre det når du aktiverer plugin. Når deaktiveres, bør vi rydde opp databasen ved å fjerne rollen med remove_cap.
klasse Dashboard // ... annen kode const CAP_METRIC = 'server_metric'; / ** * Begynn å konfigurere krok * / offentlig funksjon kjøre () add_action ('wp_dashboard_setup', array ($ dette, 'add_dashboard_widgets')); add_action ('admin_enqueue_scripts', array ($ dette, 'add_asset')); add_action ('admin_footer', array ($ this, 'footer')); register_activation_hook (__ FILE__, array ($ this, 'add_servermetric_caps')); register_deactivation_hook (__ FILE__, array ($ this, 'remove_servermetric_caps')); / ** * Legg til severmetric evne for admin som standard * / funksjon add_servermetric_caps () // får forfatterrollen $ role = get_role ('administrator'); // Dette virker bare, fordi det åpner klasseeksemplet. // vil tillate forfatteren å redigere andres innlegg for nåværende tema kun $ role-> add_cap (selv :: CAP_METRIC); funksjon remove_servermetric_caps () // get_role returnerer en forekomst av WP_Role. $ role = get_role ('administrator'); $ roll-> remove_cap (selv: CAP_METRIC); // //
Vi lager en ny konstant samtale CAP_METRIC
og sett verdien til server_metric
slik at vi enkelt kan endre kapasitetsnavnet senere. Vi endrer vår løpe
Metode for å legge til to kroker.
Register_activation_hook kjører når du aktiverer plugin. Den aksepterer to parametere:
register_deactivation_hook kjører når deaktiverer plugin. Den aksepterer samme parameter som register_activation_hook.
Innenfor hver tilkoblet funksjon vil vi laste inn rollenadministrator
og ring add_cap
eller remove_cap
på rollen objektet.add_dashboard_widgets
metode for å bare registrere widgets hvis den nåværende brukeren har servermetric
lokk./ ** * Registrer dashboard widget proider å dukke opp på dashbordet * / funksjon add_dashboard_widgets () hvis ! Current_user_can (selv: CAP_METRIC)) return false; $ widget = Widget :: forekomst (); foreach ($ widget-> get_provider () som $ name => $ leverandør) $ widget-> register ($ navn);Deretter bruker vi current_user_can for å sjekke om den nåværende brukeren har forespørselsevnen eller ej.
Deretter på funksjonsskjerm, kan vi tilordne server_metric
lokk.
Ved å utnytte roller og evner, forbedret vi vår plugin-sikkerhet for å gjøre widgeten tilgjengelig for kun brukeren vi stoler på.
WordPress bruker Transient API som en cache API. Dataene er serialisert og lagret i wp_option
tabell av WordPress med en utløpstid for cachen.
I stedet for å få metriske data på hver HTTP-forespørsel, kan vi få dataene en gang og cache den. Vi kan imidlertid ikke bare legge alt i cachen eller bruke samme utløpstid. For eksempel kan diskplass lagres i 15 minutter, og serverinformasjon kan bufres i 60 minutter siden de sjelden endres. På samme måte kan installert programvare bufres for en dag, da det sjelden endres når serveroppsettet og forutsatt produksjon.
Vi bruker det meste get_transient
og set_transient
når du arbeider med API. I følge WordPress-dokumentasjonen:
get_transient ($ forbigående)
: Hent det forbigående navnet som streng og returner dets data. Hvis dataene er utløpt, returnerer den falsk. Vi burde bruke ===
operatør å sjekke fordi vi kan lagre en tom verdi for forbigående.set_transient ($ forbigående, $ verdi, $ utløp)
: henter tre parametere: det forbigående navnet, dets verdi og dets utløpstid i andre. Merk at det forbigående navnet ikke skal være lengre enn 45 tegn.Våre to alternativer er å vurdere å cache de metriske dataene eller cache de genererte HTML-dataene. Caching HTML-dataene kan gjøre nettstedet vårt veldig fort, men det legger en last på databasen. For det formål kunne vi gjøre mål for å bestemme hvilket som er best.
For vår veiledning, la oss bare cache de metriske dataene. Dessuten bør vi ha en måte å ugyldiggjøre cachen - som et anker - som gjør at vi kan laste om dataene på dashbordet og tvinge dataene i stedet for fra cachen.
Vi kan direkte bruke funksjonen get_transient
eller set_transient
å jobbe med Transient API. Men hvis vi bestemmer oss for å endre måten vi brukte Transient API, må vi gå over hvert sted vi bruker det og endre det for hver widget.
La oss legge til ett lag til å trekke opp cachemekanismen. Vi vil designe en enkel hurtigbufferklasse for vår widget som har tre metoder:
sett
: Angi cacherdata for en widgetfå
: Få cacherdata for en widgetlaste
: Prøv å laste fra cache, hvis ikke eksistert, beregne data, angi cachen og returnereLa oss komponere filen widget / cache.php
på følgende måte. Vær oppmerksom på at klassenavnet som vår automatisk lastekonvensjon vil være cache
og navnets navn er AX \ StatBoard \ Widget
get_metric (); statisk :: sett ($ leverandør, $ data, $ cache_time); returner $ data;Merk først at vi har merket våre caching-metoder som statiske. Våre
sett
og få
metoder er bare wrappers for get_transient
og set_transient
. De laste
Metoden sitter på toppen av sett
og få
. Alle disse metodene forventer å hente widgetleverandørobjektet; derfor, inne i laste
Metode vi kan påberope get_metric
metode for å få de virkelige dataene. cache
klasse. Vi vil prøve å implementere cache
til widget / software.php
. Endre vår original get_content
metode for å:$ info) $ content. = "Du kan se at vi blir kvitt$ cmd $ info
"; echo $ content; // ...
$ cmds = $ this-> get_metric ()
og bare erstatte det med Cache :: belastning
som vil laste data fra cachen, eller vil laste det fra systemet hvis det ikke finnes noen buffer. get_metric
innsiden get_content
med:Cache :: load ($ dette, $ time_in_second);å få det ta seg av sin caching.
widget / ethernet.php
. Vi kan legge til cache-evne som følger:offentlig funksjon get_content ()
$ grensesnitt = Cache :: load ($ dette, 3600 * 24 * 7);
$ html = '
Interface | IP |
---|---|
$ Grensesnitt | $ Ip |
get_metric
med Cache :: belastning
. Ethernetinformasjonen og dens IP-adresse sannsynligvis aldri endres, så jeg legger en veldig lang cache livstid til en uke: 3600 sekunder * 24 timer * 7 dager.Når vi har lagt til en cache-evne, bør vi støtte en mekanisme slik at administratoren kan trekke widgeten uten at den blir cached. Den enkleste måten å gjøre dette på er å bruke en spesiell søkeparameter for å indikere at vi vil ha ekte data.
Hva med liten parameter som nocache
for dette? Så i stedet for standard WordPress dashboard URL med domain.com/wp-admin/
Vi kan bruke domain.com/wp-admin/?nocache
.
Lyd lett? La oss gjøre det.
Rediger vår metode få
i widget / cache.php
statisk funksjon får (Provider $ provider) if (isset ($ _ GET ['nocache']))) return false; $ cache_id = get_class ($ leverandør); hvis (false! == $ data = get_transient ($ cache_id)) return $ data; returner falsk;Så lenge som
nocache
forespørselsparameter eksisterte, returnerer vi falsk umiddelbart, og derfor tvinges de virkelige dataene til å bli hentet i stedet for bufret data.get_transient
og sjekk etter forespørselsparameteren der. Derfor, vurder å bryte ting ned i mange lag når du designer pluginet ditt. Ikke legg alt i samme fil eller kopier pastakode igjen og igjen.domain.com/wp-admin og domain.com/wp-admin?nocache
og legg merke til den forskjellige hastigheten.987ms loading med hurtigbuffer aktiveringHer er resultatet med ?nocache = 1
lagt til URL-adressen.
Selv om vi implementerte og brukte en cache, er siden fortsatt sakte hvis cachen mangler. Det trenger fortsatt tid til å trekke data fra serveren. Vi har fortsatt plass til å forbedre med cronjob. Vi kan planlegge vårt plugin for å bli kjørt på et bestemt intervall. WordPress tillater oss å gjøre dette via wp_schedule_event
. Ideelt sett kan vi bruke wp_schedule_event
å planlegge en krok som vil bli utført ved et bestemt intervall.
Når vi ser på dette eksempelet, kan plugin-modulen planlegge en krok for å påkalle hvert tredje minutt, kroken vil igjen påkalle en annen funksjon for å hente metriske dataene. Dataene er alltid tilgjengelige i cache og frisk nok.
Åpne vår hoved plugin-fil, serverdashboard.php
, og oppdater løpemetoden for å inkludere ny krok samt ny krokhåndterer.
3 * 60, 'display' => __ ('En gang hvert tredje minutt')); returner $ tidsplaner; / ** * Oppsettplan for hendelsen. Hvis tidsplanen ikke eksisterer, * registrerer vi det til * / funksjon setup_schedule () if (! Wp_next_scheduled ('metric_generate_every_3min')) wp_schedule_event (tid (), '3min', 'metric_generate_every_3min'); / ** * Hovedfunksjonen som kjører på cron og * genererer data * / funksjon generate_metric () $ widget = Widget :: forekomst (); foreach ($ widget-> get_provider () som $ name => $ leverandør) // Ved å ringe get_content, utløser vi Cache :: load prosess. $ Av operatør> get_content ();For det første støtter wp_schedule_event-metoden bare tre gjentatte typer: daglig, time og twicedaily. Vi må legge til en ny type gjentakelse med wp_get_schedules filter.
$ tidsplaner ['3min'] = array ('interval' => 3 * 60, 'display' => __ ('En gang hvert tredje minutt')); returner $ tidsplaner;Vi kan tilpasse intervallverdien til hvor mange sekunder vi vil at jobben skal gjentas. Neste settes vi opp a
metric_generate_every_3min
krok.add_action ('metric_generate_every_3min', array ($ this, 'generate_metric'));Dette er vår tilpassede krok, den finnes ikke i WordPress. Vi registrerer et håndtak med metode
generate_metric
for den kroken. Når som helst metric_generate_every_3min
krok er påkalt, generate_metric
vil bli utført.i det
med setup_schedule
Metode for å sjekke at eksistensen av den neste planlagte hendelsen på kroken finnes metric_generate_every_3min
. Hvis det ikke er definert, planlegger vi et arrangement med wp_schedule_event
, bruker vår egendefinerte gjentagelse hvert tredje minutt for den kroken.generate_metric
metode, vi sløyfe gjennom all tilgjengelig widget gi, og ringe deres get_content
metode. Ved å gjøre det, utløser vi Cache :: belastning
prosess for den metriske.wp-content.php
med nettadressen yourdomain.com/wp-cron.php?doing_wp_cron
.crontab -e
og legg til denne linjen på slutten av den:0 * * * * wget domain.com/wp-cron.php?doing_wp_cron> / dev / null 2> & 1Vi brukte wget til å lage en HTTP-forespørsel til wp-cron.php-filen. Siden vi ikke bryr oss om utdata og noe feil, omdirigerer vi alle utdataene til
/ Dev / null
.