Acelere su WordPress almacenando en caché las consultas personalizadas utilizando la API de transitorios

Oh chico, el título suena aterrador, ¿no? No tienes nada de qué preocuparte porque lo analizaremos todo. ¿Su tema ejecuta consultas personalizadas de WordPress para mostrar publicaciones aleatorias, publicaciones populares, publicaciones recientes, etc.en la barra lateral o en otro lugar? Si es así, debería considerar el uso de la API transitoria de WordPress para almacenar en caché estas consultas para reducir el consumo de recursos y aumentar el 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 Transients.

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

Así que toda esta jerga transitoria y de almacenamiento en caché me pasa por la cabeza. Bueno, no te preocupes, déjanos explicarte lo que hace. Básicamente, si está ejecutando un sitio como Lista25 y tener un bucle que muestre 6 publicaciones aleatorias en la barra lateral, para que la API transitoria pueda ayudar. Cada vez que un usuario actualiza la página, esa consulta de WP personalizada que tiene entrará en su base de datos y extraerá 6 publicaciones aleatorias. Si eres un sitio relativamente nuevo, no debería ser tan malo. Pero si está atrayendo a MUCHAS personas a su sitio, entonces su servidor SQL puede fallar y verá la pantalla «Error al crear la conexión a la base de datos». Al agregar algunas líneas más de código, puede almacenar fácilmente los resultados de esa consulta (almacenar en caché) durante un cierto período de tiempo utilizando la API de transitorios.

Ejemplo del código de bucle que teníamos para extraer publicaciones aleatorias:

<?php $random_query = new WP_Query('orderby=rand&posts_per_page=6');
while ($random_query->have_posts()) : $random_query->the_post();
?>
<div class="gridcontainer">
<div class="gridthumb"><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_post_thumbnail(); ?></a></div>
<div class="gridcontent">
<div class="gridtext"><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></div>
</div>
</div>
<?php endwhile; ?>

La parte más interesante de nuestra consulta de publicación aleatoria 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 mostradas 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, usemos get_posts y recuperemos 20 publicaciones. Almacene en caché los resultados de esa consulta usando la API de transitorios, luego use la función array_rand () para mostrar aleatoriamente solo 6 de las 20 publicaciones originales. De esta forma podemos seguir simulando el efecto aleatorio en el sitio.

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

// Get any existing copy of our transient data
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
    // It wasn't there, so regenerate the data and save the transient
	$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 se puede verificar la longitud de la caché. Siéntete libre de cambiarlo como quieras. Ahora, si mostramos $ special_query_results usando el bucle foreach, tendremos las 20 publicaciones mostradas. Entonces necesitamos usar la función array_rand () para extraer solo 6 elementos aleatorios. Agregamos el código así:

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

Ahora, esto extrae 6 ID de publicación aleatoria de nuestros datos temporales. Sin embargo, no extraerá los valores de cada publicación. Entonces tuvimos que 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, hemos creado una matriz para $ sixposts donde asignamos un valor a cada uno de estos elementos. No estoy seguro de que esta fuera la mejor manera de hacerlo, pero funcionó. Si alguno de ustedes tiene mejores sugerencias, no dude en publicarlas en los comentarios.

Habiendo hecho eso, ahora estamos listos para visualizar el ciclo. Simplemente ponga el código así:

global $post; //required for it to work
foreach( $sixposts as $post ) :  setup_postdata($post);

//All the items go here.

endforeach; 

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

Para que sea más fácil para todos, aquí está el código final que tenemos:

<?php
// Get any existing copy of our transient data
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
    // It wasn't there, so regenerate the data and save the transient
	$randargs = array('orderby' => 'rand', 'numberposts' => 20);
	$special_query_results = get_posts($randargs);
    set_transient( 'special_query_results', $special_query_results, 60*60*12 );
}

// Use the data like you would have normally...
$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); ?>

<div class="gridcontainer">
<div class="gridthumb"><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_post_thumbnail(); ?></a></div>
<div class="gridcontent">
<div class="gridtext"><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></div>
</div>
</div>

<?php endforeach; ?>

Bueno, ahora ejecute esta consulta de base de datos solo una vez cada 12 horas, independientemente de la cantidad de usuarios que visiten su sitio.

¿Te ha resultado útil??

0 / 0

Deja una respuesta 0

Tu dirección de correo electrónico no será publicado. Required fields are marked *