Nelle prime due parti di questa serie, abbiamo completato, un plug-in completo che mostra lo stato del server come widget dashboard. In quanto tale, è disponibile per tutti gli utenti registrati. Alcune informazioni possono essere sensibili e noi non vogliamo che le vedano, quindi è meglio controllare il ruolo dell'utente per determinare se dobbiamo rendere disponibile il widget a loro.
WordPress utilizza un concetto di ruoli, progettato per dare al proprietario del sito la possibilità di controllare ciò che gli utenti possono e non possono fare all'interno del sito. A ciascun ruolo è consentito eseguire una serie di attività denominate Funzionalità. Possiamo personalizzare il ruolo e le sue funzionalità con funzioni add_roles e add_cap.
Il nostro plugin creerà una nuova chiamata di capacità servermetric
. Solo l'utente che ha questa capacità può caricare i nostri widget del dashboard. Aggiungeremo questa funzionalità per il ruolo di amministratore, quindi tutti gli utenti amministratori lo vedranno per impostazione predefinita.
Per gli altri utenti, è possibile utilizzare l'editor dei ruoli utente del plugin per gestire le funzionalità di un particolare utente e assegnare il servermetic
capacità per l'utente.
Usiamo add_cap per aggiungere una nuova funzionalità, tuttavia, questa funzione scrive nel database, quindi dovremmo farlo solo quando si attiva il plugin. Una volta disattivato, dovremmo pulire il database rimuovendo il ruolo con remove_cap.
class Dashboard // ... altro codice const CAP_METRIC = 'server_metric'; / ** * Avvia l'installazione hook * / 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')); / ** * Aggiungi funzionalità severmetriche per admin di default * / function add_servermetric_caps () // ottiene il ruolo autore $ role = get_role ('administrator'); // Funziona solo perché accede all'istanza della classe. // consentirebbe all'autore di modificare i post di altri per il tema corrente solo $ role-> add_cap (self :: CAP_METRIC); function remove_servermetric_caps () // get_role restituisce un'istanza di WP_Role. $ role = get_role ('administrator'); $ role-> remove_cap (self :: CAP_METRIC); // ...
Creiamo una nuova chiamata costante CAP_METRIC
e impostare il suo valore a server_metric
quindi possiamo facilmente cambiare facilmente il nome della capacità in un secondo momento. Modifichiamo il nostro correre
metodo per aggiungere due ganci.
Register_activation_hook viene eseguito quando si attiva il plug-in. Accetta due parametri:
register_deactivation_hook viene eseguito quando si disattiva il plug-in. Accetta lo stesso parametro di register_activation_hook.
All'interno di ogni funzione uncinata, caricheremo il ruoloamministratore
e chiama add_cap
o remove_cap
sull'oggetto ruoli.add_dashboard_widgets
metodo per registrare i widget solo se l'utente corrente ha il servermetric
berretto./ ** * Registra il gestore del widget del dashboard per visualizzarlo sul dashboard * / function add_dashboard_widgets () if (! Current_user_can (self :: CAP_METRIC)) return false; $ widget = Widget :: instance (); foreach ($ widget-> get_provider () come $ name => $ provider) $ widget-> register ($ name);Successivamente, usiamo current_user_can per verificare se l'utente corrente ha o meno la capacità di richiesta.
Quindi, nella schermata delle funzionalità, possiamo assegnare il server_metric
berretto.
Utilizzando ruoli e funzionalità, abbiamo migliorato la sicurezza del nostro plugin per rendere il nostro widget disponibile solo per gli utenti di cui ci fidiamo.
WordPress utilizza l'API Transients come API cache. I dati sono serializzati e memorizzati nel wp_option
tabella di WordPress con un tempo di scadenza della cache.
Invece di ottenere dati metrici su ogni richiesta HTTP, possiamo ottenere i dati una volta e metterli in cache. Tuttavia, non possiamo semplicemente mettere tutto nella cache o usare lo stesso tempo di scadenza. Ad esempio, lo spazio su disco può essere memorizzato nella cache per 15 minuti e le informazioni sul server possono essere memorizzate nella cache per 60 minuti poiché raramente vengono modificate. Allo stesso modo, il software installato può essere memorizzato nella cache per un giorno poiché raramente cambia una volta che il server è stato configurato e sottoposto a provisioning per la produzione.
Usiamo principalmente get_transient
e set_transient
quando si lavora con l'API. Secondo la documentazione di WordPress:
get_transient ($ transitoria)
: recupera il nome transitorio come stringa e restituisce i suoi dati. Se i dati sono scaduti, restituisce false. Dovremmo usare ===
operatore da controllare perché possiamo memorizzare un valore vuoto per il transitorio.set_transient ($ transient, $ value, $ expiration)
: recupera tre parametri: il nome del transitorio, il suo valore e il suo tempo di scadenza in secondi. Si noti che il nome del transitorio non deve essere più lungo di 45 caratteri.Le nostre due opzioni consistono nel considerare la memorizzazione nella cache dei dati della metrica o la memorizzazione nella cache dei dati HTML generati. La memorizzazione nella cache dei dati HTML può rendere il nostro sito molto veloce, ma mette un carico sul database. A tal fine, potremmo fare benchmark per decidere quale sia il migliore.
Per il nostro tutorial, memorizziamo solo i dati della metrica. Inoltre, dovremmo avere un modo per invalidare la cache - come un'ancora - che ci permetterà di ricaricare i dati del dashboard e forzare il caricamento dei dati anziché dalla cache.
Possiamo usare direttamente la funzione get_transient
o set_transient
lavorare con API transient. Tuttavia, se decidiamo di cambiare il modo in cui abbiamo usato l'API Transient, dobbiamo andare oltre ogni punto in cui lo utilizziamo e modificarlo per ogni widget.
Aggiungiamo un altro livello per astrarre il meccanismo della cache. Progetteremo una classe cache semplice per il nostro widget che ha tre metodi:
impostato
: imposta i dati della cache per un widgetottenere
: ottieni i dati della cache per un widgetcaricare
: prova a caricare dalla cache, se non esiste, calcola i dati, imposta la cache e ritornaComponiamo il file widget di / cache.php
nel seguente modo. Nota che, come nostra convenzione di caricamento automatico, il nome della classe sarà nascondiglio
e il suo spazio dei nomi è AX \ StatBoard \ Widget
get_metric (); static :: set ($ provider, $ data, $ cache_time); restituire $ dati;Innanzitutto, notiamo che abbiamo contrassegnato i nostri metodi di memorizzazione nella cache come statici. Nostro
impostato
e ottenere
i metodi sono solo involucri per get_transient
e set_transient
. Il caricare
il metodo si trova sopra impostato
e ottenere
. Tutti questi metodi prevedono di recuperare l'oggetto del provider di widget; quindi, dentro caricare
metodo che possiamo invocare get_metric
metodo per ottenere i dati reali. nascondiglio
classe. Cercheremo di attuare nascondiglio
per widget di / software.php
. Cambia il nostro originale get_content
metodo per:$ informazioni) $ content. = "Puoi vedere che ci liberiamo di$ cmd $ info
"; echo $ content; // ...
$ cmds = $ this-> get_metric ()
e semplicemente sostituirlo con Cache :: Load
che caricherà i dati dalla cache, o la caricherà dal sistema se non esiste una cache. get_metric
dentro get_content
con:Cache :: load ($ this, $ time_in_second);per averlo a cuore il suo caching.
widget di / ethernet.php
. Possiamo aggiungere capacità cache come segue:funzione pubblica get_content ()
$ interfaces = Cache :: load ($ this, 3600 * 24 * 7);
$ html = '
Interfaccia | IP |
---|---|
$ Interfaccia | $ Ip |
get_metric
con Cache :: Load
. Le informazioni ethernet e il relativo indirizzo IP probabilmente non cambiano mai, quindi ho impostato una durata della cache molto lunga a una settimana: 3600 secondi * 24 ore * 7 giorni.Una volta aggiunta un'abilità cache, dovremmo supportare un meccanismo in modo che l'amministratore possa estrarre il widget senza che venga memorizzato nella cache. Il modo più semplice per farlo è utilizzare un parametro di query speciale per indicare che vogliamo dati reali.
Che ne dici di piccoli parametri come nocache
per questo? Quindi, invece dell'URL del dashboard predefinito di WordPress con domain.com/wp-admin/
possiamo usare domain.com/wp-admin/?nocache
.
Sembra facile? Facciamolo.
Modifica il nostro metodo ottenere
in widget / cache.php
funzione statica get (Provider $ provider) if (isset ($ _ GET ['nocache'])) return false; $ cache_id = get_class ($ provider); if (false! == $ data = get_transient ($ cache_id)) return $ data; return false;Finché il
nocache
parametro di ricerca esistito, restituiamo falso istantaneamente e quindi forziamo il recupero dei dati reali invece dei dati memorizzati nella cache.get_transient
e controllare il parametro di query lì. Pertanto, considera la possibilità di suddividere le cose in molti livelli durante la progettazione del plug-in. Non mettere tutto nello stesso file o copiare il codice incolla più e più volte.dominio.com/wp-admin e dominio.com/wp-admin?nocache
e notare la diversa velocità.Caricamento 987 ms con abilitazione cacheEcco il risultato con ?nocache = 1
aggiunto all'URL.
Anche se abbiamo implementato e utilizzato una cache, se la cache è mancante, la pagina è ancora lenta. Ha ancora bisogno di tempo per estrarre i dati dal server. Abbiamo ancora spazio per migliorare con cronjob. Possiamo programmare il nostro plug-in per essere eseguito a intervalli specifici. WordPress ci consente di farlo via wp_schedule_event
. Idealmente, possiamo usare wp_schedule_event
per programmare un gancio che verrà eseguito ad un intervallo specifico.
Guardando questo esempio, il nostro plugin può programmare un hook da richiamare ogni tre minuti, l'hook, a sua volta, invocherà un'altra funzione per recuperare i dati della metrica. I dati sono sempre disponibili nella cache e abbastanza freschi.
Apri il nostro file plugin principale, serverdashboard.php
, e aggiorna il metodo run per includere il nuovo hook e il nuovo gestore di hook.
3 * 60, 'display' => __ ('Una volta ogni 3 minuti')); ritorno $ orari; / ** * Pianificazione dell'installazione per l'evento. Se la pianificazione non esiste, * la registriamo in * / function setup_schedule () if (! Wp_next_scheduled ('metric_generate_every_3min')) wp_schedule_event (time (), '3min', 'metric_generate_every_3min'); / ** * La funzione principale che gira su cron e * genera dati * / function generate_metric () $ widget = Widget :: instance (); foreach ($ widget-> get_provider () come $ name => $ provider) // Chiamando get_content, attiviamo il processo di caricamento di Cache ::. $ Provider-> get_content ();Innanzitutto, il metodo wp_schedule_event supporta solo tre tipi di ricorrenza: giornaliera, ogni ora e twicedaily. Dobbiamo aggiungere un nuovo tipo di ricorrenza con il filtro wp_get_schedules.
$ schedule ['3min'] = array ('interval' => 3 * 60, 'display' => __ ('Una volta ogni 3 minuti')); ritorno $ orari;Possiamo personalizzare il valore dell'intervallo per quanti secondi vogliamo che il lavoro venga ripetuto. Quindi impostiamo a
metric_generate_every_3min
gancio.add_action ('metric_generate_every_3min', array ($ this, 'generate_metric'));Questo è il nostro amo personalizzato, non esiste in WordPress. Registriamo un handle con metodo
generate_metric
per quel gancio. Ogni volta metric_generate_every_3min
il gancio è invocato, generate_metric
sarà eseguito.dentro
con setup_schedule
metodo per verificare l'esistenza del successivo evento pianificato del gancio metric_generate_every_3min
. Se non è ancora definito, pianificheremo un evento con wp_schedule_event
, usando la nostra ricorrenza personalizzata ogni tre minuti per quel gancio.generate_metric
metodo, passiamo in rassegna tutti i widget disponibili e li chiamiamo get_content
metodo. In tal modo, ci attiviamo Cache :: Load
processo per quella metrica.wp-content.php
con l'URL yourdomain.com/wp-cron.php?doing_wp_cron
.crontab -e
e aggiungi questa riga alla fine di esso:0 * * * * wget domain.com/wp-cron.php?doing_wp_cron> / dev / null 2> & 1Abbiamo usato wget per fare una richiesta HTTP al file wp-cron.php. Dal momento che non ci interessa l'output e qualsiasi problema di errore, reindirizziamo tutto l'output a
/ Dev / null
.