WordPress para el Desarrollo de Aplicaciones Web: Sesiones
() translation by (you can also view the original English article)
En esta serie, estamos echándole un vistazo a cómo es posible construir aplicaciones web usando WordPress.
Hasta ahora, hemos hablado de que WordPress es una Base (en lugar de un Framework), de su arquitectura, cómo debemos pensarlo conceptualmente para tener una aproximación a él especialmente cuando venimos de otros lenguajes, y luego empezamos a hablar de los componentes que conforman una aplicación web básica.
Como recordatorio, mencionamos:
- Gestión de usuarios
- Permisos
- Manejo de sesiones
- Funcionalidad de correo electrónico
- Recuperación y serialización de datos
- Enrutamiento de URL (a veces llamado como la reescritura de URL o reglas de reescritura o incluso solo rutas)
- Almacenamiento en caché
- Soporte para consultas personalizadas
Y a partir del último post, cubrimos la administración de usuarios y permisos.
En este post, vamos a echar un vistazo a cómo incorporar sesiones dentro de una aplicación basada en WordPress; sin embargo, vamos a asumir que tu - u otros lectores - no están del todo familiarizados con las sesiones.
Así que empezaremos con una vista de alto nivel de las sesiones, hablaremos sobre la relación entre las sesiones y WordPress y luego cómo empezar a incorporar sesiones en tu 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 fácil de entender (pero puede ser difícil de implementar dependiendo del framework o la base que estás usando).
En pocas palabras, las sesiones son una manera de mantener el estado de una aplicación a través de las cargas de la página.
Pero aquí está la cosa: esto puede ser implementado de varias maneras. En un escenario, simplemente puedes escribir datos en la base de datos en una sola página, luego recuperarlos en la siguiente.
Esta no es exactamente la manera más eficiente para establecer una sesión, especialmente si tienes un montón de usuarios activos, pero si te permite mantener el estado.
Por otra parte, no es de lo que estamos hablando cuando nos estamos refiriendo a las sesiones. Por el contrario, estamos hablando de mantener un conjunto de información persistente en la memoria - literalmente, en la RAM - durante todo el tiempo que el usuario está activo en el sitio Web.
A riesgo de conseguir más técnicas de lo que me gustaría en esta serie de artículos, hay maneras en que las sesiones se administran un poco de manera diferente para que puedas salir de un sitio, volver y hacer que tu sesión activa se mantenga.
Piensa en servicios como Twitter cuando no tienes que iniciar sesión cada vez que visites el sitio. A pesar de todo, los detalles de esa implementación están más allá del alcance de esta serie.
Por el contrario, consideremos por un momento cómo sería una sesión desde que un usuario aterriza en la página principal de una aplicación, inicia sesión, establece una sesión y luego se sale.
Cargando una Aplicación sin Sesión
Así que aquí está el cómo parece una típica aplicación respaldada con base de datos, desde la perspectiva de no mantener ninguna información en la sesión. En cambio, todo es estático en las páginas y/o se carga desde la base de datos:



Bastante fácil de entender, ¿no?
Básicamente, cada vez que cargas una página - o cada vez que un usuario se desplaza 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 de arriba muestra lo que una aplicación web con respaldo de la base de datos parece sin ningún tipo de mecanismo de sesiones, ¿cómo es la apariencia cuando se ofrece soporte para las sesiones?
Antes de que nos fijemos en un diagrama de lo que es, vamos a definir los siguientes parámetros:
- La aplicación no mantendrá ninguna sesión para los usuarios que no hayan ingresado.
- La aplicación guardará cierta información en la sesión una vez que el usuario ha ingresado.
- La sesión será destruida cuando el usuario ha salido.
En resumen, esto significa que una vez que el usuario esté conectado, alguna información se mostrará de la información estática, la información en la base de datos y la información almacenada en la sesión.



Nada terriblemente complicado, ¿Eh?
En resumen, la información se carga en una sesión que se ha almacenado en la memoria y se ha obtenido a partir de ahí cuando es necesario. La otra información que no está en la sesión, pero es relevante en la página visualizada será obtenida de los datos.
Permitiendo que esto se implemente correctamente, realmente puedes exprimir mucho del rendimiento de una aplicación y hacer que el usuario en general tenga una experiencia un poco mejor; sin embargo, los detalles de esto están más allá de este artículo en particular.
La parte más importante que quitamos de esta sección en particular es cómo funcionan las sesiones, y qué beneficios ofrecen.
La Verdad sobre WordPress y las Sesiones
Para cualquier persona que ha trabajado en la construcción de aplicaciones web dentro de otros frameworks, ya están familiarizado con las sesiones y cómo funcionan en el contexto de las herramientas dadas que estaban usando.
De hecho, si has hecho algún trabajo previo con PHP, estás familiarizado con cómo funcionan las sesiones también.
Pero aquí hay un hecho interesante (por lo menos, ¡yo creo que es interesante!):
El núcleo de la aplicación con WordPress no hace uso de sesiones.
De hecho, la única vez que está cerca de mantener cualquier tipo de estado es mediante el uso de una cookie que se genera cuando inicias sesión en la aplicación.
¿Cómo implementamos sesiones?
En cuanto a la aplicación de las sesiones en WordPress, es más una cuestión de entender cómo implementar una sesión en PHP y asegurarte de que hagas la limpieza adecuada, cuando sea necesario.
Específicamente, esto significa que sepas cómo:
- Iniciar la sesión
- Almacenar la información en una sesión
- Recuperar la información de la sesión (y cómo recuperar la información de la base de datos si no está en una sesión)
- Destruir la sesión
Suena simple, ¿no? En su mayor parte, lo es pero, como con la mayoría de las cosas en desarrollo, hay cosas que debemos tener en cuenta.
Iniciar la sesión
Lo primero que necesitas tener en cuenta es que las sesiones deben iniciarse. Esto se hace llamando a la función session_start ()
de PHP.
Hay dos cosas para tener en cuenta acerca de cómo iniciar una sesión en PHP:
- Sólo quieres iniciar una sesión si el ID de la sesión no existe
- Debes iniciar una sesión antes de que cualquier información salga al navegador
Para ello, se puede definir una función utilizando un gancho apropiado, pero debe ser lo suficientemente temprano en el ciclo de vida de la página de WordPress.
Para efectos del ejemplo de este artículo, voy a iniciar una sesión si un usuario está logueado. Si un usuario está conectado, entonces almacenaremos el momento en el que se registra, de lo contrario no hará nada.
Caso: en el código siguiente, estoy iniciando una sesión durante la acción init
de WordPress.
1 |
function example_login() { |
2 |
|
3 |
if ( ! session_id() && is_user_logged_in() ) { |
4 |
session_start(); |
5 |
}
|
6 |
}
|
7 |
add_action( 'init', 'example_login' ); |
Ahora con una sesión iniciada, podemos realmente empezar a almacenar información.
Almacenar información de Sesión
Trabajar con la sesión de datos es muy similar a trabajar con datos almacenados en $_GET
, $_POST,
o incluso en un array asociativo normal. En pocas palabras, PHP ofrece la colección de $_SESSION
que nos permite almacenar información a través de pares clave/valor.
Continuando con el ejemplo anterior, guardamos la hora en que el usuario se ha logueado. Observa, sin embargo, que en primer lugar debemos comprobar si el valor se establece en la colección; de lo contrario, lo sobreescribiremos cada vez.
1 |
function example_login() { |
2 |
|
3 |
if ( ! session_id() && is_user_logged_in() ) { |
4 |
|
5 |
session_start(); |
6 |
|
7 |
if ( ! isset( $_SESSION['time'] ) ) { |
8 |
$_SESSION['time'] = time(); |
9 |
}
|
10 |
|
11 |
}
|
12 |
}
|
13 |
add_action( 'init', 'example_login' ); |
Lo suficientemente simple - en primer lugar, comprobamos para ver si se establece una session_id ()
y comprobamos si el usuario está logueado. Si es así, guardamos la hora.
Pero ahora necesitamos realmente recuperar la información de la sesión en la base del código.
Recuperar Información de la Sesión
Así como cuando se almacena la información en matrices, podemos recuperar la información en gran parte de la misma manera, pero hay una salvedad: tenemos que asegurarnos de que el valor se establece en la matriz y que no está vacío.
Podemos hacerlo mediante un condicional simple:
1 |
if ( isset( $_SESSION['time'] ) && ! empty( $_SESSION['time'] ) ) { |
2 |
print_r( $_SESSION['time'] ); |
3 |
}
|
Suponiendo que el valor está presente en la colección de $_SESSION
, entonces deberíamos estar bien para seguir.
Destruir la Sesión
Esto se puede hacer al salir. Usando el código proporcionado, deberías ver una diferencia en tu sitio en base a si está conectado o no.
Por último, ya que estamos estableciendo una sesión cuando el usuario ingresa, queremos destruir la sesión cuando el usuario sale. Esto es relativamente sencillo utilizando la función session_destroy()
de PHP; sin embargo, hay algunos matices más finos que deben entenderse.
Directamente desde el manual de PHP:
session_destroy() destruye todos los datos asociados con la sesión actual. No desconfigura ninguna de las variables globales asociadas con la sesión, o la cookie de la sesión
En resumen, esto significa que se destruye el mecanismo para almacenar la información de la sesión, pero se mantienen los valores que se conservan en la colección de la sesión.
1 |
function example_logout() { |
2 |
|
3 |
if ( session_id() ) { |
4 |
session_destroy(); |
5 |
}
|
6 |
|
7 |
}
|
8 |
add_action( 'wp_logout', 'example_logout' ); |
Pero, otra vez, como con otras matrices asociativas y colecciones en PHP, puedes restablecer los valores (o sobrescribirlos). Pero esto, va más allá del alcance de esta serie en particular.
¡Hay algunos trucos!
¿Qué sería un artículo sobre programación sin algún tipo de trucos, de acuerdo?
En primer lugar, ya hemos establecido que la base de WordPress en sí misma es apátrida. No sólo eso, sino que también mantiene una función que se utiliza para restablecer globales (puedes encontrar esta función en wp-incluye/load.php - basta con ver wp_unregister_GLOBALS
).
Al mirar el código fuente, te darás cuenta de las siguientes líneas:
1 |
$input = array_merge( $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset( $_SESSION ) && is_array( $_SESSION ) ? $_SESSION : array() ); |
2 |
foreach ( $input as $k => $v ) |
3 |
if ( !in_array( $k, $no_unset ) && isset( $GLOBALS[$k] ) ) { |
4 |
unset( $GLOBALS[$k] ); |
5 |
}
|
Esto va a anular los valores en la sesión, por lo tanto, en un sentido, WordPress realmente intenta desactivar la sesión.
En segundo lugar, no todos los alojamientos para web soportan las sesiones en PHP o la colección $_SESSION
. Para ello, necesitas asegurarse de que el ambiente en el que estás desplegando tu trabajo ofrece la configuración necesaria y el apoyo para lo que estás liberando.
¿Qué hace un Desarrollador?
Así que si estás preocupado por tener que gestionar un montón de código para asegurarte de que las sesiones trabajen dentro de WordPress (y no vayan a la basura) al hacerlo, y no quieres tratar con los distintos entornos de hosting y sus diversas configuraciones, entonces te recomiendo revisar un trabajo de Eric Mann sobre WP_Session.
Este proyecto está fuera del alcance de lo que estamos tratando de cubrir aquí en este artículo; sin embargo, este plugin es digno de ser comprobado ya que proporciona una gran capa de gestión de la sesión de WordPress sin un montón de la sobrecarga que hemos cubierto aquí.
¿Las Sesiones Importan?
En primer lugar, recordemos que las sesiones no son exclusivas para WordPress. Son una función de PHP que podemos implementar en el contexto de WordPress. Y para ello, ser capaces de introducir algunas funciones realmente interesantes basadas en las necesidades de los usuarios.
¿Pero esto plantea la cuestión: crear las sesiones importa?
Creo que esta pregunta es un poco subjetiva.
Si vas a crear una aplicación web en la que cada usuario tiene que recorrer por el sitio con información exclusiva para su sesión - como, por ejemplo, su nombre, apellido, tiempo de inicio de sesión y otras cosas - entonces, sí, creo que tienes un caso para el uso de una sesión.
Pero si vas a compilar algo que requiere nada más que la autenticación antes de imprimir en pantalla la información procesada desde las bases de datos, entonces yo cuestionaría si necesitas implementar una sesión.
Todo esto para decir: depende de la naturaleza de tu proyecto.
En este punto, ya estamos listos para pasar al siguiente componente común de las aplicaciones web: el correo electrónico.
En lugar de depender de PHP y atarlo al ciclo de vida de WordPress, la API de WordPress hace que trabajar con el correo electrónico sea relativamente trivial y realmente potente. Y con esto, lo revisaremos en el siguiente artículo.