Acelere su WordPress almacenando en caché las consultas personalizadas utilizando la API de Transients
Oh chico, el título suena aterrador, ¿no? No tienes nada de qué preocuparte porque lo descompondremos todo. ¿Su tema ejecuta consultas personalizadas de WordPress para mostrar publicaciones aleatorias, publicaciones populares, publicaciones recientes, etc. en la barra lateral o en cualquier otro lugar? Si es así, entonces debería considerar el uso de la API transitoria de WordPress para almacenar en la memoria caché estas consultas para reducir el consumo de recursos, así como ayudar al tiempo de carga. En este artículo, le mostraremos cómo acelerar su sitio de WordPress almacenando consultas personalizadas usando la API de Transients.
Nota: debe comprender cómo funcionan los temas de WordPress (bucles, etc.) para poder seguir esta publicación..
Así que todo este caché y jerga transitoria está pasando por mi cabeza. Pues no te preocupes déjanos explicarte lo que hace. Básicamente, si está ejecutando un sitio como List25 y tiene un bucle que muestra 6 publicaciones aleatorias en su barra lateral, la API transitoria puede ayudar. Cada vez que un usuario actualice la página, esa consulta WP personalizada que tengas irá a tu base de datos y atraerá 6 publicaciones al azar. Si eres un sitio relativamente nuevo, no debería ser tan malo. Pero si recibe MUCHAS personas en su sitio, puede bloquear su servidor SQL y verá la pantalla "Error al establecer la conexión de base de datos". Al agregar algunas líneas de código adicionales, puede almacenar fácilmente los resultados de esa consulta (almacenarla en caché) durante un cierto período de tiempo utilizando la API de Transients.
Ejemplo del código de bucle que teníamos para tirar publicaciones aleatorias:
have_posts ()): $ random_query-> the_post (); ?>
Lo mejor de nuestra consulta de publicaciones aleatorias en la barra lateral fue que mostraba contenido nuevo cada vez. Entonces, al almacenar en caché la consulta durante 12 horas, tendremos las mismas 6 publicaciones durante 12 horas, ¿no? Bueno, encontramos un trabajo alrededor gracias a la sugerencia de nuestro amigo Konstantin Kovshenin (@kovshenin). Sugirió que en lugar de usar WP_Query, usemos get_posts y tiremos 20 publicaciones en su lugar. Almacene en caché los resultados de esa consulta utilizando la API de transitorios, y luego use la función array_rand () para mostrar solo 6 publicaciones de las 20 originales al azar. De esta manera 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 de WordPress Codex.
// Obtenga cualquier copia existente de nuestros datos transitorios si (false === ($ special_query_results = get_transient ('special_query_results'))) // No estaba allí, 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);
Tenga en cuenta que 60 * 60 * 12 es el área donde puede controlar la longitud del caché. Siéntete libre de cambiarlo a lo que quieras. Ahora, si mostramos los $ special_query_results usando el bucle foreach, tendremos las 20 publicaciones mostradas. Por lo tanto, 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 sacará 6 IDs de publicaciones al azar de nuestros datos transitorios. Sin embargo, no extraerá los valores para cada publicación. Así que tuvimos que añadir 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 de $ seis puestos en la que asignamos un valor a cada uno de esos artículos. No estoy seguro de si esta era la mejor manera de hacerlo, pero funcionó. Si alguno de ustedes tiene mejores sugerencias, no dude en publicarlo en los comentarios..
Después de hacer eso, ahora estamos listos para mostrar el bucle. Simplemente ponga el código de esta manera:
global $ post; // requerido para que funcione para cada persona ($ sixposts como $ 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 the_permalink, etc..
Para facilitarlo a todos, aquí está 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 normalmente tendrías ... $ 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 ($ se coloca como $ post): setup_postdata ($ post); ?>
Ta da, ahora solo hace esta consulta de base de datos una vez cada 12 horas, sin importar cuántos usuarios visiten su sitio..