WordPress per lo sviluppo di app Web sessioni

In questa serie, stiamo dando un'occhiata a come è possibile costruire applicazioni web usando WordPress.

Finora, abbiamo parlato di come WordPress sia un fondamento (piuttosto che un framework), la sua architettura, il modo in cui dobbiamo pensarci concettualmente quando ci si avvicina particolarmente provenendo da altre lingue, e poi abbiamo iniziato a parlare dei componenti che compongono un'applicazione web di base.

Come promemoria, abbiamo menzionato:

  • Gestione utenti
  • permessi
  • Gestione delle sessioni
  • Funzionalità di posta elettronica
  • Serializzazione e recupero dei dati
  • Routing URL (a volte indicato come regole di riscrittura o riscrittura degli URL o anche solo percorsi)
  • caching
  • Supporto per query personalizzate

E a partire dall'ultimo post, abbiamo trattato sia la gestione degli utenti che le autorizzazioni.

In questo post, daremo un'occhiata a come incorporare le sessioni all'interno di un'applicazione basata su WordPress; tuttavia, assumeremo che tu o altri lettori non abbiate familiarità con le sessioni.

Quindi inizieremo con una vista di alto livello delle sessioni, parleremo della relazione tra le sessioni e WordPress, e quindi come iniziare a incorporare le sessioni nell'applicazione basata su WordPress.


Un'introduzione alle sessioni

Per quelli di voi che non hanno familiarità con il concetto di sessioni, è relativamente semplice da capire (ma può essere difficile da implementare a seconda del framework o delle fondamenta che si stanno utilizzando).

In breve, le sessioni sono un modo per mantenere lo stato di un'applicazione attraverso i carichi di pagina.

Ma ecco il punto: questo può essere implementato in diversi modi. In uno scenario, è sufficiente scrivere i dati nel database su una pagina, quindi recuperarli alla successiva.

Questo non è esattamente il modo più efficiente per impostare una sessione particolarmente se hai molti utenti attivi, ma è così fa ti permettono di mantenere lo stato.

Poi di nuovo, non è quello di cui stiamo parlando quando ci riferiamo alle sessioni. Invece, stiamo parlando di mantenere un insieme di informazioni persistenti in memoria - letteralmente, nella RAM - per tutto il tempo in cui l'utente è attivo sul sito web.

A rischio di diventare più tecnico di quanto mi piacerebbe in questa serie di articoli, lì siamo modi in cui le sessioni sono gestite in modo un po 'diverso in modo da poter lasciare un sito, tornare indietro e mantenere la sessione attiva mantenuta.

Pensa a servizi come Twitter quando non devi effettuare il login ogni volta che visiti il ​​sito. Indipendentemente da ciò, i dettagli di quello l'implementazione va oltre lo scopo di questa serie.

Invece, consideriamo per un momento l'aspetto di una sessione dal momento in cui un utente è atterrato sulla home page di un'applicazione, ha effettuato l'accesso, ha stabilito una sessione e quindi ha effettuato il logout..

Caricamento di un'applicazione senza sessione

Ecco come appare una tipica applicazione supportata da database dal punto di vista di non mantenere qualsiasi informazione sulla sessione. Invece, tutto è staticamente fornito su pagine e / o caricato dal database:


Un semplice esempio di applicazione Web supportata da database.

Abbastanza facile da capire, non è vero??

Fondamentalmente, ogni volta che una pagina viene caricata - o ogni volta che un utente naviga verso una nuova pagina - la pagina recupererà le informazioni necessarie dal database e poi la presenterà all'utente.

Caricamento di un'applicazione con una sessione

Se il diagramma sopra mostra come appare un'applicazione web supportata da database senza alcun tipo di meccanismo di sessione, come appare quando lo fa fa offrire supporto per le sessioni?

Prima di esaminare un diagramma di come è, impostiamo i seguenti parametri:

  • L'applicazione non manterrà alcuna sessione per gli utenti che non hanno effettuato l'accesso
  • L'applicazione memorizzerà determinate informazioni nella sessione una volta che l'utente ha effettuato l'accesso
  • La sessione verrà distrutta quando l'utente si disconnette

In breve, questo significa che una volta che l'utente ha effettuato l'accesso, alcune informazioni verranno visualizzate da informazioni statiche, informazioni nel database e informazioni memorizzate nella sessione.


Un semplice esempio di un'applicazione web abilitata alla sessione.

Niente di terribilmente complicato, huh?

In breve, le informazioni vengono caricate in una sessione archiviata in memoria e recuperata da lì quando è necessaria. Altre informazioni non in corso ma pertinenti alla pagina visualizzata verranno recuperate dai dati.

Consentendo che questo sia implementato correttamente, puoi davvero spremere un sacco di prestazioni da un'applicazione e rendere l'esperienza utente complessiva un po 'migliore; tuttavia, i dettagli di ciò sono al di là di questo particolare articolo.

La cosa più importante da prendere in questa particolare sezione è come funzionano le sessioni e quali sono i benefici che offrono.


La verità su WordPress e Sessioni

Per chiunque abbia lavorato con la creazione di applicazioni Web in altri framework, è probabile che abbia dimestichezza con le sessioni e il loro funzionamento nel contesto degli strumenti forniti che si stavano utilizzando.

In effetti, se hai già lavorato con PHP, probabilmente hai familiarità con il funzionamento delle sessioni.

Ma ecco un fatto interessante (almeno, io pensa che sia interessante!):

L'applicazione principale di WordPress non usa le sessioni.

Infatti, l'unica volta che si avvicina al mantenimento di qualsiasi tipo di stato è attraverso l'uso di un cookie che viene generato quando si accede all'applicazione.


Come implementiamo le sessioni?

Quando si tratta di implementare le sessioni in WordPress, è più una questione di capire come implementare una sessione in PHP e assicurarsi di fare la corretta pulizia della casa, quando necessario.

In particolare, questo significa che sai come:

  • Inizia la sessione
  • Memorizza le informazioni in una sessione
  • Recupera le informazioni dalla sessione (e come recuperare le informazioni dal database se non è in una sessione)
  • Distruggi la sessione

Sembra abbastanza semplice, vero? Per la maggior parte, è ma, come con la maggior parte delle cose in fase di sviluppo, ci sono cose che dobbiamo considerare.

Inizia la sessione

La prima cosa che devi notare è che le sessioni devono essere avviate. Questo viene fatto chiamando PHP session_start () funzione.

Ci sono due cose da notare sull'avvio di una sessione in PHP:

  1. Si desidera avviare una sessione solo se non esiste un ID di sessione
  2. È necessario avviare una sessione prima che qualsiasi informazione venga inviata al browser

Per fare ciò, è possibile definire una funzione usando un gancio appropriato ma esso dovere essere abbastanza precoce nel ciclo di vita della pagina WordPress.

Ai fini dell'esempio di questo articolo, inizierò una sessione Se un utente ha effettuato l'accesso. Se un utente ha effettuato l'accesso, memorizzeremo l'ora in cui è stato effettuato l'accesso; altrimenti, non faremo nulla.

Caso in questione: nel codice qui sotto, sto iniziando una sessione durante WordPress ' dentro azione.

function example_login () if (! session_id () && is_user_logged_in ()) session_start ();  add_action ('init', 'example_login');

Ora con una sessione avviata, possiamo effettivamente iniziare a memorizzare le informazioni.

Memorizza informazioni sulla sessione

Lavorare con i dati di sessione è molto simile a lavorare con i dati memorizzati in $ _GET, $ _POST, o anche in un normale array associativo. In breve, PHP offre il $ _SESSION raccolta che ci consente di memorizzare informazioni tramite coppie chiave / valore.

Continuando con l'esempio sopra, memorizzeremo l'ora corrente in cui l'utente ha effettuato l'accesso. Si noti, tuttavia, che noi dovere per prima cosa controlla se il valore è impostato nella collezione; altrimenti, lo sovrascriveremo ogni volta.

function example_login () if (! session_id () && is_user_logged_in ()) session_start (); if (! isset ($ _SESSION ['time'])) $ _SESSION ['time'] = time ();  add_action ('init', 'example_login');

Abbastanza semplice - prima, controllo per vedere se a session_id () è impostato e controllo per vedere se l'utente ha effettuato l'accesso. In tal caso, memorizza l'ora.

Ma ora abbiamo bisogno di recuperare effettivamente le informazioni dalla sessione altrove nella base di codice.

Recupera informazioni sulla sessione

Proprio come quando si memorizzano le informazioni negli array, possiamo recuperare le informazioni allo stesso modo, ma c'è un avvertimento: dobbiamo assicurarci che il valore sia impostato nell'array e che non è vuoto.

Possiamo farlo usando un semplice condizionale:

if (isset ($ _SESSION ['time']) &&! empty ($ _SESSION ['time'])) print_r ($ _SESSION ['time']); 

Supponendo che il valore sia presente nel $ _SESSION collezione, allora dovremmo essere bravi ad andare.

Distruggi la sessione

Questo può essere fatto al logout. Utilizzando il codice fornito, dovresti vedere una differenza nel tuo sito basandoti se hai effettuato l'accesso o meno.

Infine, dal momento che stiamo stabilendo una sessione quando l'utente è connesso, vogliamo distruggere la sessione ogni volta che l'utente si disconnette. Questo è relativamente semplice usando PHP session_destroy () funzione; tuttavia, ci sono alcune sfumature più sottili che devono essere capite.

Direttamente dal manuale PHP:

session_destroy () distrugge tutti i dati associati alla sessione corrente. Non annulla alcuna delle variabili globali associate alla sessione o disattiva il cookie di sessione

In breve, ciò significa che il meccanismo per la persistenza delle informazioni sulla sessione viene distrutto, ma i valori che vengono mantenuti nella raccolta della sessione vengono comunque mantenuti.

function example_logout () if (session_id ()) session_destroy ();  add_action ('wp_logout', 'example_logout');

Ma, di nuovo, come con altri array associativi e collezioni in PHP, è possibile ripristinare quei valori (o sovrascriverli). Indipendentemente da ciò, ciò va oltre lo scopo di questa particolare serie.

Ci sono alcuni trucchi!

Cosa sarebbe un articolo sulla programmazione senza qualche tipo di trucchi, giusto??

Innanzitutto, abbiamo già stabilito che il core WordPress stesso è senza stato. Non solo, ma mantiene anche una funzione che viene utilizzata per ripristinare i globali (è possibile trovare questa funzione in wp-includes / load.php - basta cercare wp_unregister_GLOBALS).

Quando guardi il codice sorgente, noterai le seguenti linee:

$ input = array_merge ($ _GET, $ _POST, $ _COOKIE, $ _SERVER, $ _ENV, $ _FILES, isset ($ _SESSION) && is_array ($ _SESSION)? $ _SESSION: array ()); foreach ($ input come $ k => $ v) if (! in_array ($ k, $ no_unset) && isset ($ GLOBALS [$ k])) unset ($ GLOBALS [$ k]); 

Questo va ad annullare i valori nella sessione, quindi, in un certo senso, WordPress potrebbe effettivamente provare a disinserire la sessione.

In secondo luogo, non tutti gli host web supportano le sessioni PHP o il $ _SESSION collezione. A tal fine, è necessario assicurarsi che l'ambiente in cui si sta distribuendo il proprio lavoro offra la configurazione e il supporto necessari per ciò che si sta pubblicando.

Che cosa deve fare uno sviluppatore??

Quindi, se sei preoccupato di dover gestire un sacco di codice per assicurarti che le sessioni funzionino all'interno di WordPress (e non siano cestinate) mentre lo fai, e inoltre non vuoi occuparti dei vari ambienti di hosting e delle loro varie configurazioni , quindi consiglio vivamente di dare un'occhiata al lavoro di Eric Mann su WP_Session.

Questo particolare progetto non rientra nello scopo di ciò che stiamo cercando di coprire qui in questo articolo; tuttavia, questo plugin vale la pena di verificare poiché fornisce a grande livello di gestione delle sessioni per WordPress senza un sacco di spese generali che abbiamo trattato qui.


Sessioni anche la materia?

Innanzitutto, ricorda che le sessioni non sono uniche per WordPress. Sono una funzionalità di PHP che siamo in grado di implementare all'interno di contesto di WordPress. E a tal fine, siamo in grado di introdurre alcune funzionalità davvero interessanti in base alle esigenze degli utenti.

Ma questo solleva la domanda: le sessioni contano?

Trovo che questa domanda sia un po 'soggettiva.

Se stai costruendo un'applicazione web in cui ogni utente ha bisogno di essere in giro per il sito con informazioni uniche per la sua sessione - come, ad esempio, il nome, il cognome, l'ultima volta di accesso e altre cose divertenti - quindi, si, penso che tu abbia un caso per usare una sessione.

Ma se stai costruendo qualcosa che non richiede altro che l'autenticazione prima di rendere le informazioni da un database, allora mi chiedo se è necessario o meno implementare una sessione.

Tutto ciò per dire: dipende dalla natura del tuo progetto.

A questo punto, siamo pronti per passare alla prossima componente comune delle applicazioni web: email.

Piuttosto che basarsi su PHP e collegarlo al ciclo di vita di WordPress, l'API di WordPress rende la gestione delle e-mail relativamente banale e davvero potente. E con quello, lo esamineremo nel prossimo articolo.