Artículos similares en WordPress
En algunos sitios webs, sobre todo aquellos de contenido variado, se suele mostrar al visitante una pequeña lista de otros artículos publicados relacionados con el que está leyendo en esos momentos de forma que pueda seguir navegando cómodamente dentro de una temática concreta de su interés.
Normalmente eso se consigue en WordPress mediante plugins como "Similar posts" pero si no queremos sobrecargar el blog con tanto plugin o no nos gusta que los plugins guarden información en la base de datos puesto que con el paso del tiempo sufre un aumento considerable, se podría emplear la solución que comento a continuación.
WordPress posee potentes funciones para realizar todo tipo de consultas a la base de datos. Es el caso de query_posts(). A esta función se le pueden pasar diferentes parámetros dependiendo de la clase de consulta que se desea hacer.
Por ejemplo, query_posts(array('orderby' => 'rand', 'showposts' => 3)); le dice a WordPress que busque en la base de datos 3 posts de forma aleatoria. Cambiando el 3 por otro valor encontrará tantos posts como se le indique.
Si además le indicamos la categoría donde buscar los artículos ya habremos conseguido lo que queríamos, crear nuestra lista de artículos relacionados o similares. Este sería el código a utilizar con categoría y para 5 artículos: query_posts(array('cat' => 'mi_categoria', 'orderby' => 'rand', 'showposts' => 5));
Recordar que vamos a trabajar con el archivo single.php que es el encargado de mostrar un sólo post. La lista de artículos similares debe aparecer debajo del contenido.
Ahora bien, primero necesitamos saber a qué categoría pertenece el artículo que se está leyendo para poder ejecutar la consulta de forma automática. Para ello existe la función get_the_category() cuyo resultado lo guardamos en una variable y utilizamos el identificador de la categoría para realizar la consulta.
$category = get_the_category(); query_posts(array('cat' => $category[0]->cat_ID, 'orderby' => 'rand', 'showposts' => 5));
Una vez hemos hecho la consulta ya podremos mostrar la información en pantalla. El código completo sería el siguiente:
$category = get_the_category(); query_posts(array('cat' => $category[0]->cat_ID, 'orderby' => 'rand', 'showposts' => 5)); while (have_posts()) : the_post(); $similares = $similares .'<a href="'. get_permalink() .'" rel="bookmark" title="'. get_the_title().'">'.get_the_title().'</a><br />'; endwhile;
Pero la cosa se complica. El archivo single.php ya tiene un blucle while que es el encargado de mostrar la información original de la consulta, o sea, el post. Tenemos dos problemas:
1 - No podemos perder la consulta previa. Es decir, cuando el visitante selecciona un enlace hacia un post ya le estamos pasando la consulta para que el bucle la muestre. Si ejecutamos otra consulta perdemos la anterior.
2 - No podemos usar un bucle dentro de otro de esta manera. WordPress, sin embargo, permite hacer consultas anidadas. Es lo que haremos en este ejemplo.
Una vez aclarado lo anterior lo primero que debemos hacer es guardar la consulta previa. Realizamos la nueva consulta y el segundo bucle while, y el resultado lo guardamos en la variable $similares. Restauramos la consulta previa y dejamos que el archivo single.php trabaje como lo haría normalmente con su propio bucle while.
Este sería el código completo al que hemos añadido una condición para que nunca salga en la lista de similares el artículo que se está leyendo. Este código debe añadirse al principio del archivo single.php después de <?php get_header(); ?>.
<?php /* Guardamos la categoria actual */ $category = get_the_category(); /* Guardamos el ID del post actual para no repetirlo en la consulta */ $do_not_duplicate = $post->ID; /* Guardamos el query anterior para realizar nueva consulta */ $temp_query = clone $wp_query; /* Consultamos por categoria aleatoriamente un numero de posts y guardamos en similares */ query_posts(array('cat' => $category[0]->cat_ID, 'orderby' => 'rand', 'showposts' => 5)); if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID == $do_not_duplicate ) continue; update_post_caches($posts); $similares = $similares .'<a href="'. get_permalink() .'" rel="bookmark" title="'. get_the_title().'">'.get_the_title().'</a><br />'; endwhile; endif; /* Restauramos el query anterior */ $wp_query = clone $temp_query; ?>
Dependiendo de la plantilla o theme $similares se puede situar en cualquier lugar dentro de la columna de contenido del artículo aunque queda mejor al final justo antes de los comentarios. Para mostrar la información debes escribir el siguiente código:
<h3>Articulos similares</h3> <?php echo $similares; ?>
Si colocas $similares antes de los comentarios (antes de <?php comments_template(); ?>) estará dentro del bucle while principal. Se podría ubicar fuera pero quedaría muy abajo después de los comentarios.
Puesto que el bucle principal sólo muestra un artículo cada vez no hay mayor problema con meter $similares dentro, es decir, sólo se ejecutará una vez. Esta es la razón de que sólo se pueda usar este código en el archivo single.php. Si lo intentas poner en el index.php no funcionará porque se crearán varios bucles encadenados obteniendo un resultado no deseado.
Puedes consultar sobre los bucles anidados en el codex de WordPress.
23 diciembre 2010
Gracias por el aporte!