Las entradas o posts relacionados son de gran ayuda para mantener a los visitantes leyendo en nuestro blog, en este artículo veremos cómo obtener esta funcionalidad de posts relacionados, pero sin usar plugins.
Existen básicamente dos maneras para obtener los posts relacionados: por Categorias o por Etiquetas (tags).
Posts relacionados por categorías
El siguiente código puede ser agregado a nuestro archivo functions.php de nuestro theme.
<?php
function dc_related_after_content( $content )
{
if ( !is_singular('post') ) return $content;
$cad = "";
$template_li = '<li>
<a class="thumb_rel" href="{url}">{thumb}</a>
<a class="title_rel" href="{url}">{title}</a>
</li>';
$template_rel = '<div class="rel_posts">
<h3>Artículos Relacionados</h3>
<ul>
{list}
</ul>
</div>';
$terms = get_the_terms( get_the_ID(), 'category');
$categ = array();
if ( $terms )
{
foreach ($terms as $term)
{
$categ[] = $term->term_id;
}
}
else{
return $content;
}
$loop = new WP_QUERY(array(
'category__in' => $categ,
'posts_per_page' => 4,
'post__not_in' =>array(get_the_ID()),
'orderby' =>'rand'
));
if ( $loop->have_posts() )
{
while ( $loop->have_posts() )
{
$loop->the_post();
$search = Array('{url}','{thumb}','{title}');
$replace = Array(get_permalink(),get_the_post_thumbnail(),get_the_title());
$cad .= str_replace($search,$replace, $template_li);
}
if ( $cad )
{
$content .= str_replace('{list}', $cad, $template_rel);
}
}
wp_reset_query();
return $content;
}
add_filter( 'the_content', 'dc_related_after_content');
Lo que hace este código es:
- Usar un filtro con el hook the_content para ejecutar una función que agregará los posts relacionados al contenido.
- Dentro de la función comprobamos que sólo sea ejecutada cuando veo el detalle de un post.
- Uso la función get_the_terms para obtener las categorías del post actual.
- Paso los datos obtenidos desde el objeto a un array.
- Recupero los datos de la base de datos con la clase WP_QUERY, pasando los argumentos como categoría, cantidad de posts, exclusión, y orden.
- Empiezo el bucle para obtener los datos y concatenarlos en una variable, usando variables de plantilla.
- Finalmente concateno los datos de la variable en la variable $content y usando igualmente una variable de plantilla
Posts relacionados por etiquetas
En este caso el código es bastante similar al anterior, lo único que varía son los parámetros de la función get_the_terms usada para el filtro, y los argumentos de la clase WP_QUERY, en lugar de filtrar por categorías filtramos por tags, se puede ver el código completo de posts relacionados por tags en el siguiente enlace.
$terms = get_the_terms( get_the_ID(), 'post_tag');
$loop = new WP_QUERY(array(
'tag__in' => $tags,
'posts_per_page' => 4,
'post__not_in' =>array(get_the_ID()),
'orderby' =>'asc'
));
Archivo CSS
Finalmente para dar a las entradas relacionadas un aspecto visual más atractivo agregaremos algo de CSS, este código debe ser agregado en algún archivo de estilos que ya está cargando nuestro theme. El código CSS aplicado en este ejemplo se puede descargar desde el siguiente enlace.
Tras hacer los cambios los posts relacionadas lucirán tal como se muestra en la siguiente imagen
Conclusión
Si nuestro sitio ya tiene muchos plugins y queremos evitar instalar otro adicional, es buena idea colocar funcionalidad adicional como parte del theme en el archivo functions.php. Tener en cuenta que debemos documentar nuestros cambios o usar child-themes para no perder los cambios en una actualización de theme.
El código utilizado en este artículo se puede obtener desde el respositorio de Github de Posts Relacionados
Ver comentarios (75)
Hola! En mi caso, me gustaría tener la posibilidad de añadir en mitad del post o al final ... un articulo relacionado de mi gusto o aleatorio según la etiqueta o categoría con su correspondiente imagen destacada.
Sabrían decirme cómo se puede hacer esto?
Hola Lorenzo
Podrías evaluar usar Javascript para mover o duplicar los artículos relacionados que te aparecen al final y colocarlos en algún lugar como parte de tu contenido.
Te sugiero revises : https://decodecms.com/duplicar-widget-wordpress-javascript/
Hola Jhon,
Muy interesante. Funciona a la perfección.
Echaré un vistazo al blog que hay varias cosas interesantes.
Gracias por compartir.
Que bueno que te sirvió. Saludos :)
Hola Jhon, muchas gracias por compartir tu conocimiento.
Me gusta mucho que expliques cada parte del código, así podemos aprender y entender como jugar con las entrañas de WP.
Me suscribo a DecodeCMS, te meto en favoritos y te seguiré leyendo.
Por cierto, el código funcionó a la perfección.
Un saludo, y muchas gracias.
Hola, Sergio, si, esa es la idea de este sitio, gracias también a ti y estamos en contacto.
Gracias por este aporte, me ahorraste buscar algun plugin que hiciera esta funcion como lo hace este trozo de codigo.
buenas...
Gran articulo me ha servido de inspiración!!!!.
Tengo un problema con las miniaturas no aparecen todas...habria forma de implementar esta parte. Parece como si no pudieran entrar todas. gracias por tu trabajo
Tal vez tengas algún margen de más, prueba colocando menos % en el CSS .rel_posts ul li, por ejemplo:
Lo mejor para usar menos plugins gracias amigo por tu trabajo es uno de los mejores !!! Agradecería si también puedes hacer uno para caja de autor sin plugins gracias
Hola, supongo que te refieres a la funcionalidad de caja de autor, en este caso si que hay más programación y hacerlo sin plugins puede complicarse, sin embargo te recomiendo un plugin muy liviano que he subido al repositorio de WordPress : https://es.wordpress.org/plugins/simple-author-bio/ .Saludos.
Excelente gracias
Que excelente post, y con CSS queda muy chulo. Pero tengo una duda y espero pueda ayudarme, quiero colocar los post relacionados fuera del the_content. Digamos debajo de cierto div dentro del single. Como podria moverlo a mi gusto. Una disculpa no se mucho de programacion. Saludos y gracias!
Hola si no quieres usar el filtro, the_content, podrías evaluar hacer un short_code y ese shortcode lo puedes llamar por ejemplo desde un Widget de texto o desde una posición. Revisa por ejemplo: https://decodecms.com/que-son-los-shortcodes-en-wordpress-y-como-usarlos/ , sin embargo para lograr esto tendrías que programar, si no conoces mucho de programación tal vez te convenga usar un plugin. Saludos.
Que puedo hacer para mostrar los post relacionados de la subcategoría.
Hola, cambia el array que se pasa a la consulta WP_Query, es decir en lugar de usar 'category__in' , prueba usar sólo 'cat' que devuelve categorías y subcategorías, revisa la siguiente referencia:
https://codex.wordpress.org/Class_Reference/WP_Query#Category_Parameters
Me ha encantado tu post, funciona perfectamente! Y muchísimas gracias por compartirlo.
Mi duda es qué tendría que hacer si en lugar de mostrar los post relacionados por categorías, lo que quiero mostrar son los últimos post.
Muchas gracias!! :)
Hola Maso, gracias, para lo que comentas en la consulta quita la línea de category__in. Saludos.
Hola Jhon, Excelente Post, explicas todo de una manera muy sencilla y fácil de entender, gracias a tus aportes entendí el funcionamiento de las Taxonomías y los CPT, y en este caso como agregar posts relacionados, en mi caso lo haré con tags y de forma aleatoria, Saludos!!
Gracias Ewir, que bueno que te sirvió. Saludos.