Introducción. El porqué de este código.

Relaccionar entradas en Wordpress con las siguientes condiciones:

  1. Debe funcionar con un blog en varios idiomas
  2. Debe permitir aplicar diferentes estilos (css) dependiendo de la categoría a la que pertenezca cada entrada
  3. Un post puede tener más de un grupo de entradas relacionadas

Esto puede ser útil para una compañía de discos, una tienda de libros, etc... Un grupo de música o un autor de libros pueden tener muchos discos o libros publicados (entradas relacionadas) con diferentes estilos o géneros, también puede ser que un libro tenga dos autores o en un disco aparezca más de un grupo, etc...

Una imagen vale más que mil palabras, esto es lo que buscamos:

A continuación puedes encontrar todas las referencias y enlaces a las diferentes piezas que he juntado para desarrollar las entradas relacionadas con diferentes hojas de estilo. Los enlaces son a páginas que no están traducidas al español pero en ellas se puede ver el código necesario.

Este código requiere el plugin para recuperar el valor de los campos personalizados“Get Custom Field Values” de Scott Reilly y el plugin para cambiar de idioma “Language Switcher” de Jennifer Hodgdon si necesitas que funcione en varios idiomas. Nota: Aquí puedes encontrar la tradución al español de la documentación del plugin para cambiar de idioma.

Campos Personalizados al rescate

Para relacionar una entrada con otras podemos usar Campos Personalizados. En nuestro ejempo lo que nos interesa es listar todas las películas que tienen el mismo Director. Lo que tenemos que hacer es crear un nuevo campo personalizado y asignarle es mismo valor en todos los post que lo comparte. Así, al campo personalizado "Director" le asignaremos el valor "Stanley_Kubrick" en todos los post en los que él sea el director de la película

El código explicado

Solamente queremos ver entradas relacionadas cuando estemos en una página de un solo post, pare ello tenemos que usar esta función:

 
<?php if (is_single()) { 
 

Yo quiero que mis entradas relacionadas aparezcan en la columna lateral (sidebar), ello me obliga a trabajar fuera de El Loop, esto se puede consegur utilizando la clase WP_Query

 
$relatedPosts = new WP_Query();	
 

A continuación hacemos una llamada al plugin “Get Custom Field Values” para recuperar el valor de los campos personalizados. Si nuestro campo tiene asignado un valor... recuperamos todos los post que comparten ese valor. En este caso he utilzado un guión bajo para separar el nombre del apellido y aquí tenemos que reemplazar ese guión bajo por un espacio en blanco, de esta forma Stanley_Kubric se convierte en "Stanley Kubric". Aquí también recuperamos el valor de la variable del lenguaje (solo si estás desarrollando un blog en multiples idiomas usando el plugin “Language Switcher”). En el ejemplo, mostrar un título en ingles o español dependiendo del lenguaje.

 
<?php 
$keyPerson = c2c_get_custom('Person');
if ($keyPerson != '') {     
    $relatedPosts->query("meta_key=Person&meta_value=$keyPerson");
    global $langswitch_lang_pref;
    if( $langswitch_lang_pref == 'en' ) {
        $person_name = str_replace("_", " ", $keyPerson);?>
        <h3>More Projects by <?php echo $person_name;?></h3>
    <?php } else {  ?>
        <h3>Mas proyectos por <?php echo $person_name;?></h3>
        <?php } ?>
 

Lo siguiente que tenemos que hacer es recuperar el ID del post como una variable PHP fuera del Loop y ejecutar algun código para todos los post relacionados. Además necesitamos aplicar estilos diferentes para cada entrada relacionada dependiendo de su categoría, un post puede tener dos o más categorías a la vez. Por ejemplo, los géneros de la película "La chaqueta metálica" son Acción/Aventura y Drama. Recuperando los slugs de las categorías podemos usarlos como clases css, sin olvidar que debemos añadir esas mismas clases y sus posibles combinaciones a nuestra hoja de estilos. También debemos de mostrar un mensaje alternativo en el caso de que no haya entradas relacionadas con ese post. (El código para mostrar el mensaje es varios idiomas no está incluido para mantener el sigueinte bloque lo más cirto y limpio posible pero se puede utilizar el mismo de antes).

 
   <ul><?php $current_post_id = $post->ID ?>
    <?php while ($relatedPosts->have_posts()) : $relatedPosts->the_post();
        $related_post_id = $post->ID;
        if ($current_post_id != $related_post_id) { ?>
            <li><a class="
            <?php $categories =  get_the_category($related_post_id);
                foreach ($categories as $cat) {
                    $css_cat = $cat->slug;
                    echo $css_cat;
                } ?>" 
                href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
        <?php } ?>
    <?php endwhile; ?>
<?php } else {  ?>
    <li>We haven't found related entries for this author, please let us know if you've found one</li>
<?php } ?>
</ul>       
 

Por último, hay que tener en cuenta que algunos temas de Wordpress pueden excluir este código en la página principal. En este caso, en lugar de mostrar las entradas relacionadas para el ultimos post mostraremos una lista con los post mas recientes

 
    <?php } else {  ?>
        <ul>
        <?php
        $recentPosts = new WP_Query();
        $recentPosts->query('showposts=5');
        ?>
        <?php while ($recentPosts->have_posts()) : $recentPosts->the_post(); ?>
        <li><a class="
            <?php $categories =  get_the_category($related_post_id);
                foreach ($categories as $cat) {
                    $css_cat = $cat->slug;
                    echo $css_cat;
                } ?>" href="<?php the_permalink() ?>" rel="bookmark">
                <?php the_title(); ?></a></li>
        <?php endwhile; ?>
        </ul>       
<?php  } ?>
 

Aquí está el código completo:

 
<div class="boxtop">
<?php if (is_single()) { 
    $relatedPosts = new WP_Query();	
    $keyPerson = c2c_get_custom('Person');
    if ($keyPerson != '') {     
        $relatedPosts->query("meta_key=Person&meta_value=$keyPerson");
        global $langswitch_lang_pref;
        if( $langswitch_lang_pref == 'en' ) {
            $person_name = str_replace("_", " ", $keyPerson);?>
            <h3>More Projects by <?php echo $person_name;?></h3>
        <?php } else {  ?>
            <h3>Mas proyectos por <?php echo $person_name;?></h3>
            <?php } ?>
            <ul><?php $current_post_id = $post->ID ?>
            <?php while ($relatedPosts->have_posts()) : $relatedPosts->the_post();
                $related_post_id = $post->ID;
                if ($current_post_id != $related_post_id) { ?>
                    <li><a class="
                    <?php $categories =  get_the_category($related_post_id);
                        foreach ($categories as $cat) {
                            $css_cat = $cat->slug;
                            echo $css_cat;
                        } ?>" 
                        href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
                <?php } ?>
            <?php endwhile; ?>
        <?php } else {  ?>
            <li>We haven't found related entries for this author,
                  please let us know if you've found one</li>
        <?php } ?>
        </ul>       
    <?php } else {  ?>
        <ul>
        <?php
        $recentPosts = new WP_Query();
        $recentPosts->query('showposts=5');
        ?>
        <?php while ($recentPosts->have_posts()) : $recentPosts->the_post(); ?>
        <li><a class="
            <?php $categories =  get_the_category($related_post_id);
                foreach ($categories as $cat) {
                    $css_cat = $cat->slug;
                    echo $css_cat;
                } ?>" href="<?php the_permalink() ?>" rel="bookmark">
                <?php the_title(); ?></a></li>
        <?php endwhile; ?>
        </ul>       
<?php  } ?>
</div>