Trabajando con WordPress Transitorios y Autenticación
Continuando con el contenido de la publicación anterior, también es importante considerar el uso de transitorios y autenticación.
Porque hay escenarios en los que los usuarios se autentican en un sitio (piense en un área exclusiva para miembros de un sitio) o no se autentican en el sitio (como los visitantes del sitio).
Este tipo de situaciones están presentes tanto en blogs como en otros sitios y aplicaciones web de forma generalizada.
Transitorios de WordPress y autenticación
¿Cómo podríamos almacenar información de usuario para esos usuarios? Afortunadamente, PHP nos brinda algunas funciones que nos permiten hacerlo sin necesidad de las API de WordPress.
En última instancia, el objetivo que pretendemos lograr es serializar datos transitorios mediante una clave que utiliza la ID de un usuario autenticado o un usuario no autenticado.
Y aquí está cómo hacer cada uno de ellos.
La API de WordPress
Suponiendo que un usuario esté autenticado con WordPress, entonces podemos usar la función get_current_user_id. Es simple, también.
De la referencia del código:
Obtener el ID del usuario actual
Luego podemos usar esa función en el constructor para establecer una propiedad que almacene la ID del usuario. Y mostraré el código para eso momentáneamente, pero ¿qué pasa con la situación cuando un usuario no ha iniciado sesión?
La API de PHP
Cuando se trata de almacenar información para usuarios que no están autenticados, aún necesitamos una forma de identificarlos. Esto se puede hacer de varias maneras utilizando varios valores mantenidos por PHP para agregar a la clave transitoria.
Recuerde, la clave tiene que ser única, y siempre que sea única para el usuario en el sitio, entonces debería ser buena.
Dos funciones que ofrece PHP son:
En lo que respecta al segundo, no funcionará con IIS ni con ningún servidor basado en Windows. Pero lo menciono aquí como otra alternativa para los hosts que están basados en *nix (ya que muchos lo están, especialmente con respecto a WordPress).
La función get_current_user es lo suficientemente clara:
Obtiene el nombre del propietario del script PHP actual
También hay algo más que notar en el manual. Indica explícitamente que "[devuelve] el nombre del propietario del script PHP actual". Y abordaré esto antes del final de la publicación.
Además, get_current_user también puede no ser lo que está buscando dependiendo de cómo esté configurado el servidor y qué usuario sea el ‘propietario’ del script PHP que se ejecuta en el servidor.
Pero baste decir que para este ejemplo funciona. Y he aquí por qué: el punto que estoy tratando de demostrar es cómo usar valores que son únicos para un visitante que no está autenticado en un sitio para generar una clave de la cual podemos extraer información.
La forma en que se genera la clave es secundaria al código real.
Combinando todo junto
Entonces, ¿cómo se ve el código si vamos a aprovechar las funciones anteriores? Es decir, si mantenemos una propiedad que contiene la identificación del usuario y luego lo hace tanto para los usuarios autenticados como para los no autenticados.
<?php
/**
* Initializes the User ID properly this is what's going to be appended to incoming
* keys when saving or checking for values.
*
* Use PHP's native get_current_user function then fall back to WP's
* and use that to help generate the key.
*/
public function __construct()
{
$this->user_id = get_current_user();
if (get_current_user_id()) {
$this->user_id = get_current_user_id();
}
}
Y eso le brindará la funcionalidad necesaria para crear una identificación de usuario única tanto para usuarios autenticados como para usuarios no autenticados.
¿Qué pasa con las claves transitorias?
Sí, parte del objetivo de lo que estamos discutiendo es también crear claves transitorias únicas.
Para hacer esto, me resultó bastante fácil concatenar la identificación del usuario que generamos anteriormente y agregarla a la clave que se usa al serializar un transitorio.
<?php
/**
* Creates a unique key using a combination of the incoming database key and the user's ID.
*
* @param string $key The key used to store transient data.
* @return string The unique key used to store values associated with the data store.
*/
private function getUniqueKey(string $key)
{
return $key .= '-'. $this->user_id;
}
Luego, con el valor que devuelve esta función, podemos usarla para guardar los datos como un transitorio usando claves únicas.
Todavía otras opciones
Como se mencionó, el simple uso de funciones integradas en PHP puede no ser la ruta adecuada. Pero eso no significa que no haya otros valores que aporten un valor único a lo que necesitas.
En casos como ese, es importante identificar cómo desea identificar a su usuario, qué sistema operativo usa y qué cuenta de usuario posee la aplicación.
Si eso no proporciona una configuración lo suficientemente única (y es muy probable que no lo haga bajo ciertas condiciones), entonces el principio aún se aplica: solo tendrá que cambiar la llamada funcional get_current_user() a algo que funcione mejor para tú.
