Oh chico, el título suena aterrador ¿no? No tiene nada de qué preocuparse porque lo analizaremos todo. ¿Su tema ejecuta consultas personalizadas de WordPress para mostrar publicaciones al azar, publicaciones populares, publicaciones recientes, etc. en la barra lateral o en cualquier otro lugar? En caso afirmativo, entonces debería considerar usar la API transitoria de WordPress para almacenar en caché estas consultas a fin de reducir el consumo de recursos y ayudar al tiempo de carga. En este artículo, le mostraremos cómo acelerar su sitio de WordPress almacenando en caché las consultas personalizadas utilizando la API de Transitorios.

Nota: debe comprender cómo funcionan los temas de WordPress (bucles, etc.), para poder seguir esta publicación.

Así que todo este caching y la jerga transitoria están pasando por alto mi cabeza. Bueno, no te preocupes, vamos a explicar lo que hace. Básicamente, si está ejecutando un sitio como List25 y tiene un bucle que muestra 6 publicaciones al azar en su barra lateral, la API transitoria puede ayudar. Cada vez que un usuario actualiza la página, esa consulta de WP personalizada que tiene irá a su base de datos y extraerá 6 publicaciones al azar. Si usted es un sitio relativamente nuevo, no debería ser tan malo. Pero si recibe MUCHA gente en su sitio, puede bloquear su servidor SQL y verá la pantalla «Error al establecer la conexión de la base de datos». Al agregar algunas líneas adicionales de código, puede almacenar fácilmente los resultados de esa consulta (almacenarla en caché) durante un cierto período de tiempo usando la API de Transitorios.

Ejemplo del código de bucle que tuvimos para extraer publicaciones al azar:

have_posts ()): $ random_query-> the_post ();
 ?> 

La mejor parte de nuestra consulta de publicaciones aleatorias en la barra lateral fue que mostró contenido nuevo cada vez. Entonces al almacenar en caché la consulta durante 12 horas, tendremos las mismas 6 publicaciones que se muestran durante 12 horas, ¿verdad? Bueno, encontramos una solución gracias a la sugerencia de nuestro amigo Konstantin Kovshenin (@kovshenin). Sugirió que en lugar de usar WP_Query, usamos get_posts y extraigamos 20 publicaciones. Guarde en caché los resultados de esa consulta usando la API transitoria, y luego use la función array_rand () para mostrar solo 6 publicaciones de las 20 originales al azar. De esta forma, podemos seguir simulando el efecto aleatorio en el sitio.

Lo primero que hicimos fue establecer el transitorio. Obtuvimos el código de la página Codex de WordPress.

// Obtenga cualquier copia existente de nuestros datos transitorios
 if (falso === ($ special_query_results = get_transient ('special_query_results'))) {
     // No estaba allí, así que regenere los datos y guarde el transitorio
 $ randargs = array ('orderby' => 'rand', 'numberposts' => 20);
 $ special_query_results = get_posts ($ randargs);
     set_transient ('special_query_results', $ special_query_results, 60 * 60 * 12);
 } 

Observe que el 60 * 60 * 12 es el área donde puede controlar la longitud de la memoria caché. Siéntete libre de cambiarlo a lo que quieras. Ahora si mostramos $ special_query_results usando el bucle foreach, tendremos las 20 publicaciones mostradas. Entonces, necesitamos utilizar la función array_rand () para extraer solo 6 elementos al azar. Agregamos el código así:

$ randomposts = get_transient ('special_query_results');
 $ randkey = array_rand ($ randomposts, 6); 

Ahora esto extraerá 6 ID de publicación al azar de nuestros datos transitorios. Sin embargo, no extraerá los valores de cada publicación. Así que tuvimos que hacer agregar estos bits de código:

$ sixposts [0] = $ randomposts [$ randkey [0]];
 $ sixposts [1] = $ randomposts [$ randkey [1]];
 $ sixposts [2] = $ randomposts [$ randkey [2]];
 $ sixposts [3] = $ randomposts [$ randkey [3]];
 $ sixposts [4] = $ randomposts [$ randkey [4]];
 $ sixposts [5] = $ randomposts [$ randkey [5]]; 

Básicamente, creamos una matriz para $ sixposts en la que asignamos un valor a cada uno de esos elementos. No estoy seguro de si esta era la mejor manera de hacerlo, pero funcionó. Si alguno de ustedes tiene mejores sugerencias, entonces siéntase libre de publicarlo en los comentarios.

Después de hacer eso, ahora estamos listos para mostrar el ciclo. Simplemente coloque el código así:

global $ post;  // requerido para que funcione
 foreach ($ sixposts as $ post): setup_postdata ($ post);

 // Todos los artículos van aquí.

 endforeach; 

setup_postdata le permite usar todas las etiquetas de bucle dentro de este bucle foreach como, por ejemplo, the_permalink, etc.

Para que sea fácil para todos, este es el código final que tenemos:

'rand', 'numberposts' => 20);
 $ special_query_results = get_posts ($ randargs);
     set_transient ('special_query_results', $ special_query_results, 60 * 60 * 12);
 }

 // Usa los datos como lo harías normalmente ...
 $ randomposts = get_transient ('special_query_results');
 $ randkey = array_rand ($ randomposts, 6);
 $ sixposts [0] = $ randomposts [$ randkey [0]];
 $ sixposts [1] = $ randomposts [$ randkey [1]];
 $ sixposts [2] = $ randomposts [$ randkey [2]];
 $ sixposts [3] = $ randomposts [$ randkey [3]];
 $ sixposts [4] = $ randomposts [$ randkey [4]];
 $ sixposts [5] = $ randomposts [$ randkey [5]];

 global $ post;
 foreach ($ sixposts as $ post): setup_postdata ($ post);  ?> 

Ta da, ahora solo está realizando esta consulta DB una vez cada 12 horas, sin importar cuántos usuarios visiten su sitio.