Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Entradas relacionados en WordPress sin necesidad de plugin

Imago voragine.net

Hace tiempo publiqué una manera de obtener un listado de posts relacionados en WordPress. Aquel método relacionaba contenido en base a las etiquetas comunes. Publico en esta entrada una receta que además añade las categorías: si no se encuentran etiquetas en común, se analizan las categorías. Además el código está estructurado en una función para incluirlo en functions.php, a la que podemos llamar desde cualquier plantilla, manteniendo el theme limpio y ordenado.

El código ha sido desarrollado originalmente por Justin Tallant, que además acompaña el código de una buena reflexión sobre por qué es mejor un desarrollo propio que un plugin en este caso. La versión que publico aquí contiene algunas modificaciones que he añadido.

/**
 * Shows related posts by tag if available and category if not
 *
 * @author Justin Tallant
 * @param string $title h4 above list of related posts
 * @param int $count max number of posts to show
 * @return mixed related posts wrapped in div or null if none found
 * modified by Alfonso Sanchez https://voragine.net
 */
function vb_related_posts($title = 'Contenido relacionado', $count = 5) {

        global $post;

        $tag_ids = array();

        $current_cat = get_the_category($post->ID);
        $current_cat = $current_cat[0]->cat_ID;
        $this_cat = '';

        $tags = get_the_tags($post->ID);

        if ( $tags ) {
                foreach($tags as $tag) {
                        $tag_ids[] = $tag->term_id;
                }
        } else {
                $this_cat = $current_cat;
        }
        $args = array(
                'post_type'   => get_post_type(),
                'numberposts' => $count,
                'orderby'     => 'rand',
                'tag__in'     => $tag_ids,
                'cat'         => $this_cat,
                'exclude'     => $post->ID
        );

        $related_posts = get_posts($args);

        /**
         * If the tags are only assigned to this post try getting
         * the posts again without the tag__in arg and set the cat
         * arg to this category.
         */
        if ( empty($related_posts) ) {
                $args['tag__in'] = '';
                $args['cat'] = $current_cat;
                $related_posts = get_posts($args);
        }

        if ( empty($related_posts) ) {
                return;
        }

        $post_list = '';

        foreach($related_posts as $related) {
                $post_list .= '<li><a href="' . get_permalink($related->ID) . '">' . $related->post_title . '</a></li>';
        }

        return sprintf('
                        %s
                        <ul>%s</ul>
        ', $title, $post_list );
}

La función tiene dos parámetros no obligatorios, el encabezado de la lista de entradas relacionadas y la cantidad de entradas que queremos mostrar. Para usarla, basta con llamarla en cualquiera de las plantillas del theme:

vb_related_posts('Más entradas sobre este tema','5');

Dejar un comentario

No hay comentarios en esta entrada.
*
*

 

No hay trackbacks