Lo que estoy tratando de lograr es lo siguiente: para cada usuario de nuestro sitio web, quiero hacer una solicitud de API a un servicio (API REST local que interactúa con otra base de datos) una vez y luego almacenar en caché el resultado en el Usuario WP (sub ) hasta que el usuario cierre la sesión y vuelva a iniciar sesión (ya que este valor se usa en todas las páginas de la aplicación una vez, de lo contrario, tendría que recuperarse una vez por cada carga de página, lo cual es muy indeseable en cuanto al rendimiento).
La forma más elegante en términos de Separación de Preocupaciones que he encontrado hasta ahora, se realiza extendiendo (subclasificando) la clase WP_User como en el ejemplo presentado en el libro de O'Reilly Construyendo aplicaciones web con WordPress Por Brian Messenlehner & Jason Coleman .
El código de ejemplo se puede ver aquí: vea este archivo en Gitre del autor .
Sin embargo, el problema es que todavía no tenemos este Estudiante (amplía WP_User, por lo tanto, subclase) disponible en nuestro código, todavía necesitamos crear una instancia de la siguiente manera para obtener una instancia de Estudiante para el usuario actual:
$student = new Student($current_user->ID);
Si hacemos eso en una página, la instancia siempre se volverá a crear (por lo tanto, me referiré al ciclo de vida en el título) y la llamada a $student->assignments
nunca se almacenará en caché dentro de la subclase WP_User
después de navegar a una nueva página y / o volver a cargar la página, por lo que para cada carga de página estamos llegando a la API y la base de datos que probablemente nunca se desempeñarán en nuestro entorno de producción de alto tráfico.
Sin embargo, parece que la variable global $current_user
dentro de WordPress (que es una instancia WP_User
) se crea directamente después de iniciar sesión y está disponible en toda la aplicación hasta donde entiendo. Lo que realmente quiero es la misma disponibilidad en toda la aplicación, pero luego para mi subclase (Estudiante) en lugar de la clase WP_User
, pero lo más importante es que quiero asegurarme de que para cada usuario registrado, el resultado de la API solo se haga. una vez (al igual que para $current_user->user_login
que está en WP_User
por ejemplo).
También he estudiado la adición de user_meta
a WP_User
, y he comprobado esta pregunta relacionada con la que me pareció parcialmente útil:
¿Obtiene el caché de WordPress get_user_meta ()?
Sin embargo, esto se recupera a través de wp_cache_get
, que es el Caché de Objetos de WordPress que indica claramente:
- El caché no persistente está disponible solo durante la carga de la página actual; una vez que se cargue la siguiente página, volverá a estar en blanco.
- El tamaño del almacenamiento está limitado por la memoria total disponible para PHP en el servidor. No almacene grandes conjuntos de datos, o podría terminar con un mensaje de "Memoria insuficiente".
- Utilizar este tipo de caché solo tiene sentido para las operaciones que se repiten más de una vez en la creación de una página.
No estamos usando los valores en la subclase de Estudiante más de una vez en la creación de la página, sin embargo, el valor se usa en todas las páginas de la aplicación una vez, por lo que debería recuperarse una vez por cada carga de página.
¿Estoy pensando en la dirección equivocada aquí, o cómo sería posible dentro de WordPress? Realmente necesito una buena solución a largo plazo que debería funcionar en un entorno de producción de alto tráfico. ¡Gracias por todos los comentarios y ayuda por adelantado!