WordPress para Desarrollo de Aplicaciones Web Sesiones

En esta serie, analizamos cómo es posible crear aplicaciones web con WordPress.

Hasta ahora, hemos hablado de cómo WordPress es una base (en lugar de un marco), su arquitectura, cómo debemos pensar en ello de manera conceptual cuando nos acercamos a ella. especialmente viniendo de otros idiomas, y luego comenzamos a hablar sobre los componentes que conforman una aplicación web básica.

Como recordatorio, mencionamos:

  • Gestión de usuarios
  • Permisos
  • Gestion de sesion
  • Funcionalidad de correo electrónico
  • Serialización y recuperación de datos
  • Enrutamiento de URL (a veces denominado reglas de reescritura o reescritura de URL o incluso solo rutas)
  • Almacenamiento en caché
  • Soporte para consultas personalizadas.

Y a partir de la última publicación, cubrimos la administración de usuarios y los permisos..

En esta publicación, veremos cómo incorporar sesiones dentro de una aplicación basada en WordPress; sin embargo, vamos a suponer que usted, u otros lectores, no están familiarizados con las sesiones en absoluto.

Así que comenzaremos con una vista de alto nivel de las sesiones, hablaremos sobre la relación entre las sesiones y WordPress, y luego cómo comenzar a incorporar sesiones en su aplicación basada en WordPress..


Una introducción a las sesiones

Para aquellos de ustedes que no están familiarizados con el concepto de sesiones, es relativamente simple de entender (pero puede ser difícil de implementar según el marco o la base que esté usando).

En resumen, las sesiones son una forma de mantener el estado de una aplicación en todas las cargas de página..

Pero aquí está la cosa: esto se puede implementar de varias maneras. En un caso, simplemente podría escribir datos en la base de datos en una página y luego recuperarlos en la siguiente.

Esta no es exactamente la forma más eficiente de configurar una sesión. especialmente Si tienes muchos usuarios activos, pero hace te permite mantener el estado.

Por otra parte, no estamos hablando de eso cuando nos referimos a las sesiones. En cambio, estamos hablando de mantener un conjunto de información persistente en la memoria, literalmente, en la memoria RAM, durante todo el tiempo que el usuario esté activo en el sitio web..

A riesgo de ser más técnico de lo que me gustaría en esta serie de artículos, hay son formas en que las sesiones se administran de manera un poco diferente para que pueda abandonar un sitio, volver y mantener su sesión activa.

Piense en servicios como Twitter cuando no tiene que iniciar sesión cada Hora de visitar el sitio. Independientemente, los detalles de ese La implementación está fuera del alcance de esta serie..

En su lugar, consideremos por un momento cómo se vería una sesión desde el momento en que un usuario llegó a la página de inicio de una aplicación, inició sesión, estableció una sesión y luego se desconectó..

Cargando una aplicación sin una sesión

Así que esto es lo que parece una aplicación respaldada por una base de datos típica desde la perspectiva de no Manteniendo cualquier información de sesión. En su lugar, todo se proporciona estáticamente en las páginas y / o se carga desde la base de datos:


Un ejemplo simple de una aplicación web respaldada por una base de datos.

Bastante fácil de entender, ¿no es así??

Básicamente, cada vez que una página se carga, o cada vez que un usuario navega a una nueva página, la página recuperará la información necesaria de la base de datos y luego la presentará al usuario..

Cargando una aplicación con una sesión

Si el diagrama anterior muestra cómo se ve una aplicación web respaldada por una base de datos sin ningún tipo de mecanismo de sesión, ¿cómo se ve cuando hace ofrecer soporte para sesiones?

Antes de ver un diagrama de cómo es, establezcamos los siguientes parámetros:

  • La aplicación no mantendrá ninguna sesión para los usuarios que no hayan iniciado sesión.
  • La aplicación almacenará cierta información en la sesión una vez que el usuario haya iniciado sesión
  • La sesión se destruirá cuando el usuario cierre la sesión

En resumen, esto significa que una vez que el usuario haya iniciado sesión, se mostrará información a partir de información estática, información en la base de datos e información almacenada en la sesión..


Un ejemplo simple de una aplicación web habilitada para sesión..

Nada terriblemente complicado, eh?

En resumen, la información se carga en una sesión que se almacena en la memoria y se recupera de allí cuando se necesita. Otra información que no esté en sesión pero que sea relevante para la página que se muestra se recuperará de los datos.

Permitir que esto se implemente correctamente, realmente puede exprimir mucho rendimiento de una aplicación y hacer que la experiencia general del usuario sea un poco mejor; Sin embargo, los detalles de eso están más allá de este artículo en particular..

Lo más importante de esta sección en particular es cómo funcionan las sesiones y qué beneficios ofrecen..


La verdad sobre WordPress y sesiones

Para cualquier persona que haya trabajado en la creación de aplicaciones web en otros marcos, es probable que esté familiarizado con las sesiones y cómo funcionan dentro del contexto de las herramientas proporcionadas que estaba usando..

De hecho, si ha realizado algún trabajo anterior con PHP, es probable que también esté familiarizado con el funcionamiento de las sesiones..

Pero aquí hay un hecho interesante (al menos, yo creo que es interesante!):

La aplicación central de WordPress no usa sesiones.

De hecho, la única vez que se acerca al mantenimiento de cualquier tipo de estado es mediante el uso de una cookie que se genera al iniciar sesión en la aplicación..


¿Cómo implementamos sesiones??

Cuando se trata de implementar sesiones en WordPress, es más una cuestión de entender cómo implementar una sesión en PHP y asegurarse de hacer la limpieza del hogar adecuada, cuando sea necesario..

Específicamente, esto significa que usted sabe cómo:

  • Inicia la sesion
  • Almacenar información en una sesión.
  • Recupere la información de la sesión (y cómo recuperar información de la base de datos si no está en una sesión)
  • Destruir la sesion

Suena bastante simple, ¿no es así? En su mayor parte, es pero, como con la mayoría de las cosas en desarrollo, hay cosas que debemos considerar.

Iniciar la sesion

Lo primero que debe tener en cuenta es que las sesiones deben iniciarse. Esto se hace llamando a PHP's session_start () función.

Hay dos cosas a tener en cuenta sobre el inicio de una sesión en PHP:

  1. Solo desea iniciar una sesión si no existe un ID de sesión
  2. Debe iniciar una sesión antes de que se envíe información al navegador.

Para hacer esto, puede definir una función usando un gancho apropiado pero debe ser lo suficientemente temprano en el ciclo de vida de la página de WordPress.

A los efectos del ejemplo de este artículo, voy a comenzar una sesión. Si un usuario ha iniciado sesión. Si un usuario ha iniciado sesión, entonces almacenaremos la hora en la que iniciaron sesión; de lo contrario, no haremos nada.

Caso en cuestión: en el siguiente código, estoy iniciando una sesión durante WordPress ' en eso acción.

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

Ahora, con una sesión iniciada, podemos comenzar a almacenar información.

Información de la sesión de la tienda

Trabajar con datos de sesión es muy similar a trabajar con datos almacenados en $ _GET, $ _POST, o incluso en una matriz asociativa normal. En resumen, PHP ofrece la $ _SESION Colección que nos permite almacenar información a través de pares clave / valor..

Al continuar con el ejemplo anterior, almacenaremos la hora actual en la que el usuario inició sesión. Tenga en cuenta, sin embargo, que debe primero verifique si el valor está establecido en la colección; De lo contrario, lo sobrescribiremos cada vez..

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

Bastante simple: primero, verifico si un ID de sesión() está configurado y verifico si el usuario ha iniciado sesión. Si es así, almacene la hora.

Pero ahora necesitamos recuperar la información de la sesión en otro lugar del código base..

Recuperar información de la sesión

Del mismo modo que cuando se almacena información en arreglos, podemos recuperar la información de la misma manera, pero hay una advertencia: tenemos que asegurarnos de que el valor esté establecido en el arreglo. y que no esta vacio.

Podemos hacer esto usando un condicional simple:

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

Suponiendo que el valor está presente en el $ _SESION colección, entonces deberíamos estar bien para ir.

Destruir la sesion

Esto se puede hacer en el cierre de sesión. Al usar el código provisto, debería ver una diferencia en su sitio en función de si ha iniciado sesión o no..

Finalmente, ya que estamos estableciendo una sesión cuando el usuario ha iniciado sesión, queremos destruir la sesión cada vez que el usuario cierre la sesión. Esto es relativamente simple usando PHP's session_destroy () función; Sin embargo, hay algunos matices más finos que deben ser entendidos..

Directamente del manual de PHP:

session_destroy () destruye todos los datos asociados con la sesión actual. No anula ninguna de las variables globales asociadas con la sesión, ni desactiva la cookie de sesión

En resumen, esto significa que el mecanismo para persistir la información de la sesión se destruye, pero los valores que se mantienen en la recopilación de la sesión aún se mantienen.

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

Pero, nuevamente, al igual que con otras matrices asociativas y colecciones en PHP, puede restablecer esos valores (o sobrescribirlos). Independientemente, eso va más allá del alcance de esta serie en particular.

Hay algunas gotchas!

¿Qué sería un artículo sobre programación sin algún tipo de errores??

Primero, ya hemos establecido que el núcleo de WordPress en sí no tiene estado. No solo eso, sino que también mantiene una función que se utiliza para restablecer los globales (puede encontrar esta función en wp-includes / load.php - solo busca wp_unregister_GLOBALS).

Al mirar el código fuente, notarás las siguientes líneas:

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

Esto se aplica a valores no configurados en la sesión, por lo que, en cierto sentido, WordPress puede realmente intentar cancelar la sesión..

En segundo lugar, no todos los servidores web admiten sesiones PHP o $ _SESION colección. Para ello, debe asegurarse de que el entorno en el que está implementando su trabajo ofrece la configuración y el soporte necesarios para lo que está liberando..

¿Qué es un desarrollador para hacer?

Por lo tanto, si está preocupado por tener que administrar una gran cantidad de código para garantizar que las sesiones funcionen dentro de WordPress (y no se destruya) al hacerlo, y tampoco desea lidiar con los distintos entornos de alojamiento y sus diversas configuraciones. , entonces recomiendo revisar el trabajo de Eric Mann en WP_Session.

Este proyecto en particular está fuera del alcance de lo que intentamos cubrir aquí en este artículo; Sin embargo, este plugin vale la pena echarle un vistazo, ya que proporciona una genial capa de gestión de sesión para WordPress sin muchos de los gastos generales que hemos cubierto aquí.


Hacer sesiones incluso importan?

Primero, recuerde que las sesiones no son exclusivas de WordPress. Son una característica de PHP que podemos implementar dentro de contexto de WordPress. Y para ese fin, podemos introducir algunas funciones realmente interesantes basadas en las necesidades de los usuarios..

Pero esto plantea la pregunta: ¿importan las sesiones??

Me parece que esta pregunta es un poco subjetiva..

Si está creando una aplicación web en la que cada usuario debe caminar por el sitio con información exclusiva de su sesión, como, por ejemplo, su nombre, apellido, la última vez que ingresó y otras cosas divertidas, entonces, Sí, creo que tienes un caso para usar una sesión.

Pero si está creando algo que no requiere nada más que autenticación antes de representar información de una base de datos, entonces me cuestiono si necesita o no implementar una sesión..

Todo eso para decir: depende de la naturaleza de su proyecto..

En este punto, estamos listos para pasar al siguiente componente común de las aplicaciones web: correo electrónico.

En lugar de confiar en PHP y conectarlo al ciclo de vida de WordPress, la API de WordPress hace que trabajar con el correo electrónico sea relativamente trivial y realmente poderoso. Y con eso, lo revisaremos en el próximo artículo..