Crear un listado de posts de la misma categoría que la actual

En este tutorial te enseñamos a desarrollar un plugin que muestre un listado de posts de la misma categoría del post en el que se encuentre el usuario. ¿Te atreves? ¡Pues vamos allá!

Si cuentas con un blog de gran tamaño, tendrás que encontrar una manera de ayudar a los lectores a encontrar contenidos que posiblemente quieran leer, como un listado de posts, basándose en lo que están leyendo actualmente o simplemente, en lo que han leído ya.

Una forma de hacer esto es mediante el uso de uno de los muchos plugins que existen en el mercado que son capaces de mostrar artículos relacionados. Dichos plugins utilizan diversos métodos para identificar otros posts que tengan contenido similar al post actual, pero muchas veces no nos proporcionan los resultados que deseamos.

Listado de posts relacionados
Fuente: mythemeshop.com

Una manera lógica de identificar posts como el que se le está mostrando al usuario es mediante el uso de categorías, etiquetas o taxonomías. Si pudieras identificar los posts de la misma categoría que el actual, podríamos entonces mostrar un listado de posts recientes que estén indexados en la misma categoría, para así, ayudar a los lectores a encontrar contenido relacionado.

En este tutorial os voy a mostrar cómo crear un plugin para hacer precisamente eso. El plugin te proporcionará una función que luego tendrás que añadir al archivo single.php de tu theme para mostrar un listado de posts dependiendo de la categoría del post que el usuario esté visitando.

Preparando el plugin

Vamos a empezar por definir el plugin. Crea un nuevo fichero para tu plugin (yo llamaré al mio wpdirecto-related-posts.php). En tu nuevo fichero, añade lo siguiente:

<?php
/**
 * Plugin Name: WPDirecto Posts Relacionados
 * Plugin URI: http://wpdirecto.com/crear-plugin-listado-de-posts-2464
 * Description: Este plugin muestra un listado de posts basándose en las categorías del post que está visualizando el usuario
 * Version: 1.0.0
 * Author: Rachel McCollin
 * Author URI: http://rachelmccollin.com
 * License: GPL-3.0+
 * License URI: http://www.gnu.org/licenses/gpl-3.0.html
 * Domain Path: /lang
 * Text Domain: tutsplus
 */

Puedes cambiar los datos del autor por los tuyos propios. Esto proporciona a WordPress la información necesaria para que reconozca al archivo como un plugin y que así, puedas activarlo en el backoffice de WordPress.

Identificando las categorías del post actual

Con el fin de identificar a otros posts en las mismas categorías, necesitamos obtener las categorías en las que está indexado el post actual, y añadirlas a un array.

Comienza creando la función en la que irá el código principal. Empezamos por algunas inicializaciones:

function wpdirecto_related_posts() {
 
    $post_id = get_the_ID();
    $cat_ids = array();
 
}

Ahora, dentro de dicha función, utiliza la función get_the_category() para extraer los datos relacionados a las categorías del post actual, tal que así:

$categories = get_the_category( $post_id );

Como véis, la función solo tiene un parámetro, el ID del post. Con este parámetro específicamos de qué post queremos obtener sus categorías. Como va a ser del post actual, ponemos la variable $post_id.

Listado de posts - Código fuente
Fuente: Christiaan Colen

Lo próximo que vamos a hacer es crear un array en el que alberguemos todos los IDs de las categorías:

if ( $categories && ! is_wp_error( $categories ) ) {
         
    foreach ( $categories as $category ) {
 
        array_push( $cat_ids, $category->term_id );
 
    }
     
}

Echemos un vistazo a lo que hace este código:

  • Primero comprueba que $categories no sea nulo o devuelva un error
  • Después, extraemos el ID de cada categoría y lo añadimos al array $cats_ids

Tu función, después de todo esto, quedaría tal que así:

function wpdirecto_related_posts() {
 
    $post_id = get_the_ID();
    $cat_ids = array();
    $categories = get_the_category( $post_id );
 
    if ( $categories && !is_wp_error( $categories ) ) {
 
        foreach ( $categories as $category ) {
 
            array_push( $cat_ids, $category->term_id );
 
        }
 
    }
 
}

Escribiendo una query para mostrar los posts de la misma categoría

Ahora que tienes un array con los IDs de las categorías, puedes utilizarlo como argumento en una query para extraer posts que estén indexados en esas mismas categorías.

Así que, todavía dentro de la función, establecemos los argumentos para la query:

$current_post_type = get_post_type( $post_id );
     
$args = array(
    'category__in' => $cat_ids,
    'post_type' => $current_post_type,
    'posts_per_page' => '10',
    'post__not_in' => array( $post_id )
);

Dichos argumentos encontrarán posts del mismo post type que el actual, que estén indexados en las mismas categorías y, por supuesto, excluirán el post actual para que no aparezca en el listado de posts. Como puedes ver en el argumento posts_per_page, tengo la intención de crear un listado de 10 posts, pero tú puedes cambiar el número a tu antojo, no te cortes…

Ahora, ejecutamos la query:

$query = new WP_Query( $args );
 
if ( $query->have_posts() ) {
 
    ?>
    <aside class="related-posts">
        <h3>
            <?php _e( 'Posts Relacionados', 'wpdirecto' ); ?>
        </h3>
        <ul class="related-posts">
            <?php
 
                while ( $query->have_posts() ) {
 
                    $query->the_post();
 
                    ?>
                    <li>
                        <a href="<?php the_permalink(); ?>">
                            <?php the_title(); ?>
                        </a>
                    </li>
                    <?php
 
                }
 
            ?>
        </ul>
    </aside>
    <?php
 
}
 
wp_reset_postdata();

Todo esto produce una salida de un listado de posts, con sus títulos enlazados al detalle de cada post.

Añadiendo la función a tu theme

El último paso, como habréis previsto es, añadir la función a un plantilla de tu theme. Para ello cogeremos el archivo single.php y le insertaremos nuestra función de este modo:

wpdirecto_related_posts();

Y eso sería todo. Como véis hoy hemos redactado un artículo un poco más avanzado para iniciaros en eso de la programación en WordPress. Es una buena manera de empezar, porque es muy gratificante (estaréis desarrollando vuestro primer plugin) y a la vez no es muy difícil de implementar. Este post no hubiera sido posible sin el original de Rachel McCollin que fue la que desarrolló el plugin.

Scroll al inicio