Como listar los tipos de post personalizados en un mapa de sitio de WordPress

Como listar los tipos de post personalizados en un mapa de sitio de WordPress
Photo by Hal Gatewood / Unsplash

Mientras revisaba la página de archivo que construimos en el artículo anterior, Cómo crear un mapa de sitio en WordPress con Genesis Framework, encontré un pequeño detalle que había pasado por alto.

La lista de los artículos más recientes únicamente mostraba las entradas del tipo post.

En Cyberia.MX eso significaba que quedaban fuera todos los tipos de contenido personalizados que utilizo en el sitio, como libros, películas y aplicaciones.

Aunque el número de estos artículos era relativamente pequeño, el comportamiento no era el esperado. Si la página promete mostrar los cien artículos más recientes, debería hacerlo sin importar el tipo de contenido al que pertenezcan.

El problema está en la función que utilizamos originalmente.

wp_get_archives( 'type=postbypost&limit=100' );

Esta función trabaja únicamente con el tipo de contenido post, por lo que ignora automáticamente cualquier tipo de entrada personalizada.

Para resolver el problema necesitamos construir nuestra propia consulta.

Utilizando WP_Query

Una vez más la solución pasa por utilizar WP_Query[1].

Lo primero es definir los argumentos de la consulta.

$args = array(
    'post_type'      => array( 'post', 'peliculas', 'libros', 'apps' ),
    'post_status'    => 'publish',
    'posts_per_page' => 100,
);

Cada uno de estos argumentos tiene un propósito muy concreto.

El primero, post_type, indica qué tipos de contenido participarán en la consulta.

'post_type' => array( 'post', 'peliculas', 'libros', 'apps' ),

En este arreglo incluyo el tipo de contenido estándar (post) junto con todos los tipos personalizados que utiliza el sitio.

El segundo argumento limita la consulta únicamente a los artículos publicados.

'post_status' => 'publish',

Con ello evitamos que aparezcan borradores, entradas privadas o cualquier otro contenido que todavía no debería mostrarse públicamente.

Finalmente establecemos el número máximo de resultados.

'posts_per_page' => 100,

Con esos tres parámetros obtenemos exactamente los cien artículos publicados más recientes, independientemente del tipo de contenido al que pertenezcan.

Ejecutando la consulta

Una vez definidos los argumentos creamos el objeto WP_Query.

$my_query = null;
$my_query = new WP_Query( $args );

A diferencia del loop principal de WordPress, aquí trabajamos con un objeto independiente que contiene únicamente los resultados de nuestra consulta personalizada[2].

Recorriendo los resultados

Ahora sólo queda recorrer el resultado para construir la lista de enlaces.

if ( $my_query->have_posts() ) {

    while ( $my_query->have_posts() ) :

        $my_query->the_post(); ?>

        <li>
            <a href="<?php the_permalink(); ?>"
               rel="bookmark"
               title="Enlace permanente a <?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
        </li>

    <?php endwhile;

}

wp_reset_query();

En este caso únicamente utilizamos dos datos de cada artículo:

  • el título;
  • el enlace permanente.

Con ellos construimos la lista que aparecerá en nuestro mapa del sitio.

Al finalizar la consulta restauramos el estado global de WordPress mediante wp_reset_query(), ya que durante el recorrido utilizamos the_post() para avanzar por los resultados.

Código completo

El código completo queda de la siguiente manera.

<?php

$args = array(
    'post_type'      => array( 'post', 'peliculas', 'libros', 'apps' ),
    'post_status'    => 'publish',
    'posts_per_page' => 100,
);

$my_query = null;
$my_query = new WP_Query( $args );

if ( $my_query->have_posts() ) {

    while ( $my_query->have_posts() ) :

        $my_query->the_post(); ?>

        <li>
            <a href="<?php the_permalink(); ?>"
               rel="bookmark"
               title="Enlace permanente a <?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
        </li>

    <?php endwhile;

}

wp_reset_query();

?>

Este bloque reemplaza la llamada original a wp_get_archives() dentro de la plantilla de archivo y permite que el mapa del sitio muestre todos los tipos de contenido publicados, no únicamente las entradas tradicionales del blog.

Puede parecer un cambio pequeño, pero hace que la página de archivo refleje con mucha mayor fidelidad el contenido real del sitio.

Usa Genesis Framework

Genesis proporciona una base sólida para desarrollar temas sobre WordPress. Combinado con la flexibilidad de WP_Query es posible construir consultas completamente personalizadas sin modificar el núcleo del framework.


  1. En mi opinión, WP_Query es probablemente la clase más potente de WordPress. Gran parte de la flexibilidad del sistema proviene precisamente de ella y vale la pena conocerla a fondo. ↩︎

  2. Los loops creados mediante WP_Query son objetos independientes. Eso nos permite ejecutar varias consultas diferentes dentro de una misma página sin modificar la consulta principal. ↩︎