La privacy e l'ottimizzazione di un widget Dashboard WordPress

Cosa starai creando

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. 

Utilizzo di ruoli o funzionalità per limitare la visibilità

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:

  1. (string) nome file: percorso del file plugin principale
  2. (richiama) (necessario) La funzione da eseguire quando il plugin è attivato

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 ruolo amministratore e chiama add_cap o remove_cap sull'oggetto ruoli.

Successivamente, modificheremo il nostro 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.
Ora, solo l'amministratore vedrà il widget durante il caricamento del dashboard. Se si desidera abilitare il widget di stato del server per gli altri utenti, è possibile installare il plugin User Role Editor per gestire ruoli e funzionalità per qualsiasi utente. 
Una volta installato e attivato, vai al menu Utenti, seleziona il Utente> Funzionalità:

Quindi, nella schermata delle funzionalità, possiamo assegnare il server_metric berretto.

Modifica le funzionalità utente con il plugin User Role Editor

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.

Memorizzazione nella cache della metrica del server

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:

  1. 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.
  2. 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.

Memorizzazione nella cache dei dati per il widget

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:

  1. impostato: imposta i dati della cache per un widget
  2. ottenere: ottieni i dati della cache per un widget
  3. caricare: prova a caricare dalla cache, se non esiste, calcola i dati, imposta la cache e ritorna

Componiamo 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. 
Qui, la cosa più importante è il nome transitorio. Poiché il nome della classe è univoco all'interno della nostra applicazione, lo consideriamo abbastanza unico per il nome transitorio. funzione get_class restituisce il nome della classe di un oggetto.
Tempo per usare il nostro nascondiglio classe. Cercheremo di attuare nascondiglio per widget di / software.php. Cambia il nostro originale get_content metodo per:
$ informazioni) $ content. = "

$ cmd $ info

"; echo $ content; // ...
Puoi vedere che ci liberiamo di $ 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. 
Assicurati di passare il secondo parametro per quanto tempo vuoi che i dati vengano memorizzati nella cache; in caso contrario, i dati vengono memorizzati nella cache solo per cinque minuti. Poiché le informazioni sul software sul server cambiano raramente in un breve periodo, impostiamo il tempo di cache su 24 ore.
Ora che hai avuto l'idea, puoi ripetere con ogni altro widget che vorresti memorizzare nella cache. Basta sostituire get_metric dentro get_content con:
Cache :: load ($ this, $ time_in_second);
per averlo a cuore il suo caching.
I dati di utilizzo del disco possono essere memorizzati nella cache per ore e l'interfaccia Ethernet può essere memorizzata nella cache per un giorno circa. Spetta a te decidere per quanto tempo desideri memorizzarlo nella cache. Possiamo anche creare una pagina di opzioni per il plugin per gestire questi valori della cache a vita. Questo può essere un esercizio su cui puoi lavorare dopo aver completato questo articolo.
Abbiamo un ultimo esempio con widget di / ethernet.php. Possiamo aggiungere capacità cache come segue:
funzione pubblica get_content () 
$ interfaces = Cache :: load ($ this, 3600 * 24 * 7);
$ html = '


';
foreach ($ interfacce come $ interface => $ ip)
$ html. = "


";

$ html. = '
InterfacciaIP
$ Interfaccia$ Ip
';
echo $ html;

  // ...
Ancora una volta, abbiamo solo bisogno di sostituire 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.

Forza il caricamento di dati reali

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.
Ora, pensiamo all'aggiunta di questa funzione senza la classe Cache. Potremmo dover andare ad ogni riga di 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.
Ora, proviamo a visitare dominio.com/wp-admin e dominio.com/wp-admin?nocache e notare la diversa velocità.Caricamento 987 ms con abilitazione cache

Ecco il risultato con ?nocache = 1 aggiunto all'URL.

3.01 secondo caricamento senza cache

Utilizzo di cronjob per generare cache

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. 
Aggiungiamo un altro tipo ricorrente che viene eseguito ogni tre minuti. La sua definizione:
 $ 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.
Nella prossima dichiarazione, agiremo in azione 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.
Dentro il 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.
WordPress eseguirà automaticamente quegli eventi programmati ogni volta che qualcuno visita il tuo sito WordPress. Cercherà di trovare l'evento pianificato che deve essere eseguito e invocarlo.
Tuttavia, puoi anche eseguirli manualmente. WordPress esegue cronjob visitando il file wp-content.php con l'URL yourdomain.com/wp-cron.php?doing_wp_cron.
Si consiglia di aggiornare il cronjob per aggiungere un nuovo processo che esegue il ping dell'URL sopra ogni minuto
Apriamo il tuo crontab sul server con crontab -e e aggiungi questa riga alla fine di esso:
0 * * * * wget domain.com/wp-cron.php?doing_wp_cron> / dev / null 2> & 1
Abbiamo 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.
Puoi leggere ulteriori informazioni sull'impostazione di questo cronjob nei seguenti articoli:
  1. http://tommcfarlin.com/wordpress-cron-jobs/
  2. http://code.tutsplus.com/articles/insights-into-wp-cron-an-introduction-to-scheduling-tasks-in-wordp...

Conclusione

Questo conclude il nostro lungo tutorial su come costruire un widget dashboard del server che fornisca approfondimenti su vari aspetti del nostro sistema.
In questa serie, abbiamo utilizzato librerie di terze parti, preso un'idea, sperimentato la riga di comando, imparato su ruoli e funzionalità, e rivisto le capacità transitori di WordPress così come i suoi meccanismi di pianificazione degli eventi.
Alla fine, abbiamo legato tutto insieme in un plugin per WordPress.
Ti preghiamo di considerare di lasciare un commento e di farci sapere quali idee e cambiamenti aggiuntivi ti vengono proposti, nonché eventuali domande e / o commenti che potresti avere su questa particolare serie.