I de två första delarna av den här serien avslutade vi ett komplett plugin som visar vår serverstatus som instrumentbräd widget. Som sådan är den tillgänglig för alla inloggade användare. En del information kan vara känslig och vi vill inte att de ska se det så det är bättre att kontrollera användarrollen för att avgöra om vi ska göra widgeten tillgänglig för dem.
WordPress använder ett koncept Roller, utformat för att ge webbplatsen ägaren möjlighet att styra vad användare kan och inte kan göra inom webbplatsen. Varje roll får utföra en uppsättning uppgifter som heter Kapacitet. Vi kan anpassa rollen och dess funktioner med add_roles och add_cap funktioner.
Vår plugin skapar ett nytt kapacitetssamtal servermetric
. Endast användaren som har den möjligheten kan ladda våra widgetar i instrumentbrädan. Vi lägger till denna möjlighet för administratörsroll så alla administratörs användare ser det som standard.
För de andra användarna kan du använda plugin User Role Editor för att hantera funktionerna för en viss användare och tilldela servermetic
förmåga för användaren.
Vi använder add_cap för att lägga till en ny funktion, men den här funktionen skriver till databasen, så vi borde bara göra det när du aktiverar plugin. När du har avaktiverat bör vi städa upp databasen genom att ta bort rollen med remove_cap.
klass Dashboard // ... annan kod const CAP_METRIC = 'server_metric'; / ** * Börja med att installera krok * / public function run () add_action ('wp_dashboard_setup', array ($ this, 'add_dashboard_widgets')); add_action ('admin_enqueue_scripts', array ($ this, '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')); / ** * Lägg till severmetric förmåga för admin som standard * / funktion add_servermetric_caps () // får författarrollen $ role = get_role ('administrator'); // Det här fungerar bara, eftersom det går åt klassens instans. // skulle tillåta författaren att redigera andras inlägg för aktuellt tema bara $ role-> add_cap (själv :: CAP_METRIC); funktion remove_servermetric_caps () // get_role returnerar en instans av WP_Role. $ role = get_role ('administrator'); $ roll-> remove_cap (själv :: CAP_METRIC); // //
Vi skapar ett nytt konstant samtal CAP_METRIC
och sätta sitt värde till server_metric
så vi kan enkelt ändra kapacitetsnamnet senare lätt. Vi ändrar vårt springa
Metod för att lägga till två krokar.
Register_activation_hook körs när du aktiverar plugin. Den accepterar två parametrar:
register_deactivation_hook körs när deaktiverar plugin. Den accepterar samma parameter som register_activation_hook.
Inne i varje ansluten funktion laddar vi rollenadministratör
och ringa add_cap
eller remove_cap
på rollobjektet.add_dashboard_widgets
Metod för att bara registrera widgets om den nuvarande användaren har servermetric
keps./ ** * Registrera dashboard widget proider att dyka upp på instrumentbrädan * / function add_dashboard_widgets () if (! Current_user_can (self :: CAP_METRIC)) return false; $ widget = Widget :: instans (); foreach ($ widget-> get_provider () som $ name => $ provider) $ widget-> register ($ name);Därefter använder vi current_user_can för att kontrollera om den nuvarande användaren har begäranskapacitet eller inte.
Sedan kan vi tilldela server_metric
keps.
Genom att använda roller och funktioner förbättrade vi vår pluginsäkerhet för att göra vår widget tillgänglig för endast användare som vi litar på.
WordPress använder Transient API som ett cache API. Uppgifterna serialiseras och lagras i wp_option
tabellen med WordPress med cachens löptid.
Istället för att få metriska data på varje HTTP-förfrågan kan vi hämta uppgifterna en gång och cache den. Vi kan dock inte helt enkelt lägga allt i cachen eller använda samma utgångstid. Diskutrymme kan till exempel cachas i 15 minuter och serverinformation kan cachas i 60 minuter eftersom de sällan ändras. På samma sätt kan installerad programvara cachas för en dag eftersom det sällan ändras när serverns inställning och är avsedd för produktion.
Vi använder mest get_transient
och set_transient
när du arbetar med API: n. Enligt WordPress-dokumentationen:
get_transient ($ gående)
: Hämta det transienta namnet som sträng och returnera dess data. Om uppgifterna har löpt ut, returneras det falskt. Vi borde använda ===
operatör att kontrollera eftersom vi kan lagra ett tomt värde för övergående.set_transient ($ transient, $ value, $ expiration)
: hämtar tre parametrar: det transienta namnet, dess värde och dess utgångstid i andra. Observera att det övergående namnet inte ska vara längre än 45 tecken.Våra två alternativ är att överväga att cache de metriska data eller cache genererade HTML-data. Cachning av HTML-data kan göra vår webbplats mycket snabb, men den lägger en belastning på databasen. För det ändamålet kunde vi göra riktmärke för att bestämma vilket som är bäst.
För vår handledning, låt oss bara cache metriska data. Dessutom bör vi ha ett sätt att invalidera cacheminnet - som ett ankare - som gör det möjligt för oss att ladda om instrumentpaneldata och tvinga in data i stället för från cacheminnet.
Vi kan direkt använda funktionen get_transient
eller set_transient
att arbeta med Transient API. Om vi bestämmer oss för att ändra hur vi använde Transient API måste vi dock gå över alla ställen vi använder det och ändra det för varje widget.
Låt oss lägga till ytterligare ett lager för att abstrakt cachemekanismen. Vi kommer att designa en enkel cacheklass för vår widget som har tre metoder:
uppsättning
: Ange cacherdata för en widgetskaffa sig
: Hämta cacherdata för en widgetladda
: Försök ladda från cacheminne, om det inte existerade, beräkna data, ställ in cacheminnet och returneraLåt oss komponera filen widget / cache.php
på följande sätt. Observera att klassnamnet kommer att vara vår automatiska laddningskonvention cache
och dess namnrymd är AX \ StatBoard \ Widget
get_metric (); statisk :: set ($ provider, $ data, $ cache_time); returnera $ data;Först märker vi att vi har markerat våra caching-metoder som statiska. Vår
uppsättning
och skaffa sig
metoder är bara wrappers för get_transient
och set_transient
. De ladda
Metoden sitter ovanpå uppsättning
och skaffa sig
. Alla dessa metoder förväntar sig att hämta widgetleverantörsobjektet; därför inuti ladda
metod vi kan åberopa get_metric
metod för att få den verkliga data. cache
klass. Vi kommer att försöka genomföra cache
för widget / software.php
. Ändra vårt original get_content
metod för att$ info) $ content. = "Du kan se att vi blir av med$ cmd $ info
"; echo $ content; // ...
$ cmds = $ this-> get_metric ()
och ersätt det enkelt med Cache :: belastning
som laddar data från cacheminnet, eller laddar det från systemet om ingen cache existerade. get_metric
inuti get_content
med:Cache :: load ($ this, $ time_in_second);att få det ta hand om sin caching.
widget / ethernet.php
. Vi kan lägga till cache-förmåga enligt följande:offentlig funktion get_content ()
$ gränssnitt = Cache :: ladda ($ this, 3600 * 24 * 7);
$ html = '
Gränssnitt | IP |
---|---|
$ Gränssnitt | $ Ip |
get_metric
med Cache :: belastning
. Ethernetinformationen och dess IP-adress förändras troligen aldrig så jag ställer in en mycket lång cache livstid till en vecka: 3600 sekunder * 24 timmar * 7 dagar.När vi har lagt till en cache-förmåga bör vi stödja en mekanism så att administratören kan dra widgeten utan att den cachas. Det enklaste sättet att göra detta är att använda en särskild sökparameter för att indikera att vi vill ha riktiga data.
Vad sägs om liten parameter som nocache
för detta? Så istället för standard WordPress dashboard URL med domain.com/wp-admin/
vi kan använda domain.com/wp-admin/?nocache
.
Ljud lätt? Vi gör det.
Redigera vår metod skaffa sig
i widget / cache.php
statisk funktion get (Provider $ provider) if (isset ($ _ GET ['nocache']))) return false; $ cache_id = get_class ($ provider); om (false! == $ data = get_transient ($ cache_id)) returnera $ data; returnera false;Så länge som
nocache
frågeparametern existerade, returnerar vi falskt omedelbart och därför tvingas den verkliga data hämtas i stället för cachad data.get_transient
och kontrollera efterfrågeparametern där. Därför överväga att bryta saker ner i många lager när du utformar ditt plugin. Lägg inte allt i samma fil eller kopiera pastakod om och om igen.domain.com/wp-admin och domain.com/wp-admin?nocache
och märka den olika hastigheten.987ms laddar med cache-aktiveraHär är resultatet med ?nocache = 1
bifogas URL-adressen.
Även om vi genomförde och använde en cache, är det fortfarande långsamt om cacheminnet saknas. Det behöver fortfarande tid att dra data från servern. Vi har fortfarande utrymme att förbättra med cronjob. Vi kan schemalägga vårt plugin för att köras vid ett visst intervall. WordPress tillåter oss att göra detta via wp_schedule_event
. Idealiskt kan vi använda wp_schedule_event
att schemalägga en krok som kommer att utföras vid ett visst intervall.
Om vi tittar på det här exemplet kan vårt plugin schemalägga en krok för att anropa var tredje minut, kroken kommer i sin tur att påkalla en annan funktion för att hämta metriska data. Uppgifterna är alltid tillgängliga i cache och tillräckligt färskt.
Öppna vår huvudsakliga pluginfil, serverdashboard.php
, och uppdatera körmetoden för att inkludera ny krok samt ny krokhanterare.
3 * 60, 'display' => __ ('En gång var tredje minut')); returnera $ scheman; / ** * Inställningsschema för händelse. Om schemat inte finns, * registrerar vi det till * / funktion setup_schedule () if (! Wp_next_scheduled ('metric_generate_every_3min')) wp_schedule_event (time (), '3min', 'metric_generate_every_3min'); / ** * Huvudfunktionen som körs på cron och * genererar data * / funktion generate_metric () $ widget = Widget :: instance (); foreach ($ widget-> get_provider () som $ name => $ provider) // Genom att ringa get_content utlöser vi Cache :: load process. $ Operatörs-> get_content ();För det första stöder metoden wp_schedule_event endast tre återkommande typer: dagligen, timme och twicedaily. Vi måste lägga till en ny typ av återkommande med wp_get_schedules filter.
$ scheman ['3min'] = array ('interval' => 3 * 60, 'display' => __ ('En gång var tredje minut')); returnera $ scheman;Vi kan anpassa intervallvärdet till hur många sekunder vi vill att jobbet ska upprepas. Därefter installerar vi a
metric_generate_every_3min
krok.add_action ('metric_generate_every_3min', array ($ this, 'generate_metric'));Detta är vår anpassade krok, det finns inte i WordPress. Vi registrerar ett handtag med metod
generate_metric
för den kroken. Närhelst metric_generate_every_3min
krok påkallas, generate_metric
kommer att utföras.i det
med setup_schedule
metod för att kontrollera att det finns nästa planerade händelse i kroken metric_generate_every_3min
. Om det ännu inte är definierat planerar vi en händelse med wp_schedule_event
, Använd vår anpassade återkommande för var tredje minut för den där kroken.generate_metric
metod, vi slår igenom all tillgänglig widget tillhandahålla och ringa deras get_content
metod. Genom att göra det utlöser vi Cache :: belastning
bearbeta för den metriska.wp-content.php
med webbadressen yourdomain.com/wp-cron.php?doing_wp_cron
.crontab -e
och lägg till den här raden i slutet av den:0 * * * * wget domain.com/wp-cron.php?doing_wp_cron> / dev / null 2> & 1Vi använde wget för att göra en HTTP-begäran till wp-cron.php-filen. Eftersom vi inte bryr oss om produktionen och eventuella fel saker, omdirigerar vi all utdata till
/ Dev / null
.