WordPress pentru dezvoltarea aplicațiilor web sesiuni

În această serie, analizăm modul în care este posibilă crearea de aplicații web utilizând WordPress.

Până acum, am vorbit despre modul în care WordPress este o fundație (mai degrabă decât un cadru), arhitectura acesteia, cum trebuie să ne gândim conceptual la ea atunci când ne apropiem de ea mai ales provenind din alte limbi, și apoi am început să vorbim despre componentele care alcătuiesc o aplicație web de bază.

Ca o reamintire, am menționat:

  • Gestionarea utilizatorilor
  • Permisiuni
  • Managementul sesiunilor
  • Funcția de e-mail
  • Serializarea și recuperarea datelor
  • Rutarea adreselor URL (uneori denumită rescriere sau rescriere a URL-urilor sau chiar rute)
  • Caching
  • Suport pentru interogări personalizate

Și începând din ultimul post, am abordat atât gestionarea utilizatorilor, cât și permisiunile.

În acest post, vom examina cum să încorporăm sesiunile într-o aplicație bazată pe WordPress; cu toate acestea, vom presupune că voi sau alte cititori nu sunteți familiarizați cu sesiunile.

Deci, vom începe la o vizualizare la nivel înalt a sesiunilor, vorbi despre relația dintre sesiuni și WordPress, și apoi cum să începeți încorporarea sesiunilor în aplicația dvs. bazată pe WordPress.


O introducere la sesiuni

Pentru cei care nu sunteți familiarizați cu conceptul sesiunilor, este relativ simplu de înțeles (dar poate fi dificil de implementat în funcție de cadrul sau fundația pe care o utilizați).

Pe scurt, sesiunile sunt o modalitate de a menține starea unei aplicații în întreaga încărcare a paginii.

Dar aici este chestia: aceasta poate fi implementată în mai multe moduri. Într-un scenariu, ați putea să scrieți date în baza de date pe o singură pagină, apoi să le preluați la următoarea.

Aceasta nu este exact modul cel mai eficient de a seta o sesiune mai ales dacă aveți o mulțime de utilizatori activi, dar aceasta face vă permite să mențineți statul.

Din nou, nu despre asta vorbim atunci când ne referim la sesiuni. În schimb, vorbim despre păstrarea unui set de informații persistente în memorie - literalmente, în memoria RAM - de-a lungul timpului în care utilizatorul este activ pe site.

Cu riscul de a deveni mai tehnic decât mi-aș dori în această serie de articole, acolo sunteți modalitățile în care sesiunile sunt gestionate puțin diferit, astfel încât să puteți părăsi un site, să reveniți și să aveți în continuare o sesiune activă menținută.

Gândiți-vă la servicii precum Twitter, când nu trebuie să vă conectați fiecare când vizitați site-ul. Indiferent de detaliile acea punerea în aplicare depășește sfera de aplicare a acestei serii.

În schimb, să examinăm pentru moment ce va arăta o sesiune din momentul în care un utilizator a aterizat pe pagina de pornire a unei aplicații, sa logat, a stabilit o sesiune și apoi sa deconectat.

Încărcarea unei aplicații fără o sesiune

Deci, iată ce arată o aplicație tipică bazată pe bază de date din perspectiva nu menținând orice informație despre sesiune. În schimb, totul este furnizat static pe pagini și / sau este încărcat din baza de date:


Un exemplu simplu al unei aplicații web bazate pe baze de date.

Destul de ușor de înțeles, nu-i așa??

Practic, de fiecare dată când se încarcă o pagină - sau de fiecare dată când un utilizator navighează către o pagină nouă - pagina va prelua informațiile necesare din baza de date și apoi le va prezenta utilizatorului.

Încărcarea unei aplicații cu o sesiune

Dacă diagrama de mai sus arată cum arată o aplicație web bazată pe baze de date fără niciun tip de mecanism de sesiune, cum arata ea atunci când aceasta face oferă suport pentru sesiuni?

Înainte de a ne uita la o diagramă a ceea ce este, să stabilim următorii parametri:

  • Aplicația nu va menține nicio sesiune pentru utilizatorii care nu sunt conectați
  • Aplicația va stoca anumite informații în sesiune odată ce utilizatorul sa logat
  • Sesiunea va fi distrusă atunci când utilizatorul se deconectează

Pe scurt, aceasta înseamnă că, odată ce utilizatorul este logat, unele informații vor fi afișate din informațiile statice, informațiile din baza de date și informațiile stocate în sesiune.


Un exemplu simplu al unei aplicații web bazate pe sesiune.

Nimic din ce în ce mai complicat, huh?

Pe scurt, informațiile sunt încărcate într-o sesiune care este stocată în memorie și recuperată de acolo, când este nevoie. Alte informații care nu sunt în sesiune, dar care sunt relevante pentru pagina afișată vor fi preluate din date.

Permițând acest lucru să fie implementat corect, puteți să strângeți într-adevăr o mulțime de performanțe dintr-o aplicație și să faceți o experiență de ansamblu a utilizatorilor puțin mai bună; cu toate acestea, detaliile acestui fapt sunt dincolo de acest articol special.

Cea mai importantă scăpare din această secțiune este modul în care funcționează sesiunile și beneficiile pe care le oferă.


Adevărul despre WordPress și sesiuni

Pentru oricine care a lucrat cu crearea de aplicații web în alte cadre, este probabil să cunoașteți sesiunile și modul în care acestea funcționează în contextul instrumentelor date pe care le utilizați.

De fapt, dacă ați făcut o lucrare anterioară cu PHP, probabil că sunteți familiarizat cu modul în care funcționează și sesiunile.

Dar aici este un fapt interesant (cel puțin, eu cred că este interesant!):

Aplicația WordPress de bază nu utilizează sesiuni.

De fapt, singura dată când se apropie de menținerea oricărui tip de stare este prin utilizarea unui cookie generat atunci când vă conectați la aplicație.


Cum punem în aplicare sesiunile?

Când vine vorba de implementarea sesiunilor în WordPress, este mai mult o chestiune de înțelegere a modului de implementare a unei sesiuni în PHP și asigurarea faptului că faceți o curățare corectă a casetei, atunci când este necesar.

În mod specific, aceasta înseamnă că știți cum să:

  • Porniți sesiunea
  • Stocați informațiile într-o sesiune
  • Descărcați informațiile din sesiune (și cum să preluați informațiile din baza de date dacă nu este într-o sesiune)
  • Distruge sesiunea

Sună destul de simplu, nu-i așa? În cea mai mare parte, este, însă, ca și în cele mai multe lucruri în dezvoltare, sunt lucruri pe care trebuie să le luăm în considerare.

Porniți sesiunea

Primul lucru pe care trebuie să-l notează este că sesiunile trebuie să înceapă. Acest lucru se face prin apelarea lui PHP session_start () funcţie.

Există două lucruri de remarcat despre începerea unei sesiuni în PHP:

  1. Doar doriți să începeți o sesiune dacă nu există un ID de sesiune
  2. Trebuie să începeți o sesiune înainte ca orice informație să fie transmisă browserului

Pentru a face acest lucru, puteți defini o funcție folosind un cârlig adecvat, dar acesta trebuie sa să fie suficient de devreme în ciclul de viață al paginii WordPress.

În scopul exemplului acestui articol, voi începe o sesiune dacă un utilizator este conectat. Dacă un utilizator este conectat, atunci vom stoca timpul la care s-au logat; altfel, nu vom face nimic.

Cazul în punct: În codul de mai jos, încep o sesiune în timpul WordPress " init acțiune.

funcția example_login () if (! session_id () && is_user_logged_in ()) session_start ();  add_action ('init', 'example_login');

Acum, odată cu începerea unei sesiuni, putem începe să stocăm informații.

Stocați informații despre sesiuni

Lucrul cu datele sesiunii este foarte similar cu lucrul cu datele stocate în $ _GET, $ _POST, sau chiar într-o matrice asociativă normală. Pe scurt, PHP oferă $ _SESSION colecție care ne permite să stocăm informații prin perechi cheie / valoare.

Continuând cu exemplul de mai sus, vom stoca ora curentă la care utilizatorul sa logat. Rețineți, totuși, că noi trebuie sa verificați mai întâi dacă valoarea este setată în colecție; în caz contrar, îl vom suprascrie de fiecare dată.

funcția example_login () if (! session_id () && is_user_logged_in ()) session_start (); dacă (! isset ($ _SESSION ['time'])) $ _SESSION ['timp'] = timp ();  add_action ("init", "example_login");

Destul de simplu - mai întâi, verific pentru a vedea dacă sesiune ID() este setat și verific pentru a vedea dacă utilizatorul este conectat. Dacă da, păstrați ora.

Dar acum trebuie să preluăm informațiile de la sesiunea din altă parte a codului.

Preluați informațiile sesiunii

La fel cum este și atunci când stocăm informații în matrice, putem prelua informațiile în același fel, dar există o avertizare: trebuie să ne asigurăm că valoarea este setată în matrice și că nu este gol.

Putem face acest lucru folosind o condiție simplă:

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

Presupunând că valoarea este prezentă în $ _SESSION colecție, atunci ar trebui să fim buni să mergem.

Distrugeți sesiunea

Acest lucru se poate face la deconectare. Folosind codul furnizat, ar trebui să vedeți o diferență în site-ul dvs. pe baza faptului că sunteți conectat (ă) sau nu.

În cele din urmă, de vreme ce stabilim o sesiune când utilizatorul este conectat, dorim să distrugem sesiunea de fiecare dată când utilizatorul se deconectează. Acest lucru este relativ simplu folosind PHP session_destroy () funcţie; totuși, există câteva nuanțe mai fine care trebuie înțelese.

Direct de la manualul PHP:

session_destroy () distruge toate datele asociate sesiunii curente. Nu dezactivează niciuna dintre variabilele globale asociate sesiunii sau dezactivează modul cookie de sesiune

Pe scurt, aceasta înseamnă că mecanismul pentru informarea sesiunilor persistente este distrus, dar valorile păstrate în colecția de sesiuni sunt încă menținute.

funcția example_logout () if (session_id ()) session_destroy ();  add_action ("wp_logout", "example_logout");

Dar, din nou, ca și în cazul altor array-uri și colecții asociative din PHP, puteți să reinițializați aceste valori (sau să le suprascrieți). Indiferent, acest lucru depășește sfera acestei serii.

Sunt niște Gotchas!

Ce ar însemna un articol despre programare fără vreun tip de getchas??

În primul rând, am stabilit deja că nucleul WordPress în sine este apatrid. Nu numai asta, ci și o funcție care este utilizată pentru resetarea globalelor (puteți găsi această funcție în wp-includes / load.php - căutați doar wp_unregister_GLOBALS).

Când vă uitați la codul sursă, veți observa următoarele linii:

$ input = array_merge ($ _GET, $ _POST, $ _COOKIE, $ _SERVER, $ _ENV, $ _FILES, isset ($ _SESSION) && is_array ($ _SESSION) $ _SESSION: array; foreach ($ introduceți ca $ k => $ v) dacă ! in_array ($ k, $ no_unset) && isset ($ GLOBALS [$ k])) unset ($ GLOBALS [$ k]); 

Acest lucru merge la dezactivarea valorilor din sesiune, deci, într-un sens, WordPress poate încerca să vă dezactiveze sesiunea.

În al doilea rând, nu toate gazdele web suportă sesiuni PHP sau $ _SESSION Colectie. În acest scop, trebuie să vă asigurați că mediul în care desfășurați activitatea dvs. oferă configurația și suportul necesar pentru ceea ce lansați.

Ce este un dezvoltator de făcut?

Deci, dacă sunteți îngrijorat că trebuie să gestionați o mulțime de coduri pentru a vă asigura că sesiunile lucrează în cadrul WordPress (și nu sunt trasate) în timp ce faceți acest lucru și că nu doriți să vă ocupați de diferitele medii de găzduire și de diferitele lor configurații , atunci vă recomand să verificați activitatea lui Eric Mann pe WP_Session.

Acest proiect special este în afara scopului a ceea ce încercăm să acoperim aici în acest articol; cu toate acestea, acest plugin este în valoare de verificare, deoarece oferă o Grozav sesiune de management strat pentru WordPress, fără o mulțime de overhead pe care le-am acoperit aici.


Sesiunile chiar au importanță?

Mai întâi, rețineți că sesiunile nu sunt unice pentru WordPress. Ele sunt o caracteristică a PHP pe care o putem implementa în cadrul context de WordPress. Și în acest scop, suntem capabili să introducem câteva funcționalități foarte cool, bazate pe nevoile utilizatorilor.

Dar aceasta ridică întrebarea: contează sesiunile?

Mi se pare că această întrebare este puțin subiectivă.

Dacă construiți o aplicație web în care fiecare utilizator trebuie să meargă în jurul site-ului cu informații unice pentru sesiunea sa - cum ar fi, de exemplu, numele, prenumele, ultima dată de conectare și alte lucruri distractive - atunci, Da, cred că aveți un caz pentru utilizarea unei sesiuni.

Dar dacă construiți ceva care nu necesită altceva decât autentificare înainte de a reda informații dintr-o bază de date, atunci m-aș întreba dacă aveți sau nu nevoie să implementați o sesiune.

Tot ce trebuie spus: depinde de natura proiectului.

În acest moment, suntem gata să trecem la următoarea componentă comună a aplicațiilor web: e-mail.

Mai degrabă decât bazându-se pe PHP și conectându-l la ciclul de viață WordPress, API-ul WordPress face lucrul cu e-mail relativ trivial și foarte puternic. Și cu asta, vom examina în următorul articol.

Cod