Cómo añadir entradas relacionadas con miniaturas en wordpress

Categoría: WordPress , 26/10/2011, 6 comentarios

En el manual de hoy, voy a tratar de poner por escrito la última mejora que he desarrollado en esta web, que son los tres posts relacionados que hay debajo de cada post, justo antes de los comentarios.

Para eso, lo primero es definir lo que queremos hacer, la idea es que cada noticia, busque entre las demás, alguna que tenga como coincidencia una etiqueta, de ese modo sabemos que esa noticia tiene alguna relación.

Pongámonos manos a la obra, lo primero será crear la función en el fichero functions.php, a la que llamaremos desde cualquier parte que queramos en nuestra plantilla.

function franmoreno_get_related()
{
	global $post;
	$tags = wp_get_post_tags($post->ID);

	$related = '';

	if ($tags):
		foreach ($tags as $tag):
			$tag_ids[] = $tag->term_id;
		endforeach;
		$args=array(
			'tag__in' => $tag_ids,
			'post__not_in' => array($post->ID), // Omitimos el post actual
			'showposts'=>3 //Cuantos artículos queremos mostrar
		);
		$q = new WP_Query($args);
		if ($q->have_posts()):
			while ($q->have_posts()): $q->the_post();
				if (has_post_thumbnail()):
					$related .= '<a href="' . get_permalink() . '" title="' . get_the_title() . '">' .
 get_the_post_thumbnail(get_the_ID(),'thumbnail',array('title'=>get_the_title())) .
'<span class="title">' . get_the_title() . '</span></a>';
				endif;
			endwhile;
		endif;
		wp_reset_query();
	endif;
	return $related;
}

La función anterior, hace varias cosas:

  1. Obtenemos las etiquetas del post actual con la función wp_get_post_tags().
  2. Almacenamos los ids de estas etiquetas en una variable ($tag_ids) para poder pasarselos a la función que hace la búsqueda.
  3. Definimos los argumentos que recibe la consulta que busca las entradas, en este caso, definimos las etiquetas que debe contener, el post a omitir y la cantidad de posts a obtener con la consulta.
  4. Obtenemos los posts y hacemos un recorrido como ya se explicó en el post sobre cómo listar posts en WordPress.
  5. Devolvemos el string generado para mostrarlo en la plantilla.
Con esto, tenemos una función, llamamos desde el fichero single.php a esta función para mostrar los posts relacionados:
<?php
  $related = franmoreno_get_related();
  if ($related):
?>
<section class="related">
  <h2>Posts relacionados</h2>
  <?php echo $related; ?>
</section>
<?php endif; ?>
Para darle algo de estilo, nos vamos a nuestro css y definimos las clases o ids necesarios.
.related{
	padding: 20px 0;
}

.related h2{
	margin-bottom: 20px;
}

.related a{
	margin: 0 45px;
	width: 150px;
	padding: 5px;
	border: solid 1px #ccc;
	display: block;
	float: left;
	position: relative;
	text-decoration: none;
}

.related a img{
	width: 150px;
	height: 150px;
}

.related a .title{
	display: none;
	width: 140px;
	height: 140px;
	background: #000;
	background: rgba(0,0,0,0.6);
	color: #fff;
	position: absolute;
	top: 0;
	left: 0;
	text-decoration: none;
	line-height: 20px;
	padding: 10px;
	vertical-align: bottom;
}
Y para el efecto al pasar por encima, he usado un poco de jquery, el código sería el siguiente:
var $j = jQuery.noConflict();

$j(function(){
	$j('.related a').hover(function(){
		$j(this).children('.title').fadeIn('slow');
	}, function(){
		$j(this).children('.title').fadeOut('slow');
	});
});
  • http://www.tecnoinfinity.info/ Henry_Dee

    gracias, me ayudó bastante, pero tengo una pregunta aunque no esta relacionada con el tema.

    ¿Cómo le hago para darle estilo a las etiquetas de las entradas? por ejemplo las tuyas están encerradas en el cuadro azul con los bordes redondos, he buscado por días y todavía no tengo éxito.

    Un saludo y gracias de nuevo!

  • http://www.franmoreno.com Fran Moreno

    @Enrique_Canche:disqus Siento el retraso. Eso se hace con CSS únicamente. Definiendo un borde con el color que necesites, color de letra, etc. En GitHub tengo el código de la plantilla de este blog, para que cualquiera pueda verlo y sacar lo que quiera, en el fichero: https://github.com/siner/franmoreno/blob/master/css/franmoreno.css en la línea 171 está el código que define el estilo de las etiquetas.

    Saludos, y gracias por visitar el blog :)

  • http://zonafan.net/ Straw

    Está estupendo, me ha servido para mi blog, Gracias por compartir!

    • http://www.franmoreno.com Fran Moreno

      De nada, me alegro que te sirva :)

  • William

    Hola, funciona estupendo, gracias!!! pero me estoy partiendo el cerebro en dos mientras averiguo como insertar el Jquery :(

  • http://twitter.com/ivianag Israel Viana

    Yo prefiero meter el JS en un ámbito de función auto-ejecutable, así puedo poner cualquier nombre al objeto jQuery :

    (function($) {
    $(function(){
    $(‘.related a’).hover(function(){
    $(this).children(‘.title’).fadeIn(‘slow’);
    }, function(){
    $(this).children(‘.title’).fadeOut(‘slow’);
    });
    });
    })(jQuery.noConflict());