X

Posts relacionados sin plugins en WordPress

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).

 

Código actualizado, puedes ver la nueva funcionalidad para fijar ciertas entradas específicas, adicionales a las entradas por categorías, revisa: Entradas relacionadas mejoradas sin plugins en WordPress.

 

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

 

Categorías: Themes
Etiquetas: optimización

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 Jhon,

    Muy interesante. Funciona a la perfección.

    Echaré un vistazo al blog que hay varias cosas interesantes.

    Gracias por compartir.

  • 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:

      .rel_posts ul li {
        width: 18%;
      }
  • 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

  • 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!

  • 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!!