Las categorías en WordPress

How to show tags from a category in WordPress?

Cada post en WordPress puede tener asociado uno o varios campos categoría (category) y uno o varios campos etiqueta (tag).

Si se desea mostrar la lista de etiquetas que reúne una categoría, debemos programar un script propio, ya que nativamente WordPress, no incluye ninguna función que lo realice automáticamente.

Para ello, debemos recorrer los posts de una categoría y e ir acumulando las etiquetas que tiene cada post. Por tanto, la lógica del script consistirá en:

  1. Buscar posts asociados a una categoría
  2. Leer etiquetas asociadas a cada post
  3. Acumular etiquetas en una lista resultado

Se debe usar la función get_post_tags, nativa de WordPress que devuelve el listado de etiquetas asociadas a un solo post. Por tanto, se ha de construir una lógica en torno a esta función siguiendo los pasos antes citados. El script ya existe, gracias a un usuario de StackOverflow (enlace aquí)

function get_tags_in_use($category_ID, $type = 'name'){
    // Set up the query for our posts
    $my_posts = new WP_Query(array(
      'cat' => $category_ID, // Your category id
      'posts_per_page' => -1 // All posts from that category
    ));

    // Initialize our tag arrays
    $tags_by_id = array();
    $tags_by_name = array();
    $tags_by_slug = array();

    // If there are posts in this category, loop through them
    if ($my_posts->have_posts()): while ($my_posts->have_posts()): $my_posts->the_post();

      // Get all tags of current post
      $post_tags = wp_get_post_tags($my_posts->post->ID);

      // Loop through each tag
      foreach ($post_tags as $tag):

        // Set up our tags by id, name, and/or slug
        $tag_id = $tag->term_id;
        $tag_name = $tag->name;
        $tag_slug = $tag->slug;

        // Push each tag into our main array if not already in it
        if (!in_array($tag_id, $tags_by_id))
          array_push($tags_by_id, $tag_id);

        if (!in_array($tag_name, $tags_by_name))
          array_push($tags_by_name, $tag_name);

        if (!in_array($tag_slug, $tags_by_slug))
          array_push($tags_by_slug, $tag_slug);

      endforeach;
    endwhile; endif;

    // Return value specified
    if ($type == 'id')
        return $tags_by_id;

    if ($type == 'name')
        return $tags_by_name;

    if ($type == 'slug')
        return $tags_by_slug;
}

Gracias a este script, obtenemos una lista de las etiquetas asociadas a los posts de la categoría que se pase por parámetro. Para saber el ID de la categoría que nos interesa, se aconseja comprobarlo con el atajo que se explica (aquí).

Implementación

Ya solo faltaría llamar a la función desde la sección de nuestra plantilla donde se quiera mostrar el listado de etiquetas. Para ello, primero se ha de pegar la función en el fichero functions.php, dando así la posibilidad de ser invocado desde cualquier fichero de la plantilla.

Para leer el listado de etiquetas y mostrarlo como un bloque HTML, se recomienda la siguiente función tag_cloud_by_category, creada por el mismo usuario de StackOverflow. Esta función recibe el ID de categoría e invoca internamente a la primera función get_tags_in_use para guardar las etiquetas. Luego, acto seguido itera a través del listado de resultado construyendo un bloque de HTML con los valores. Al final, la función devuelve el bloque completo.

function tag_cloud_by_category($category_ID){
    // Get our tag array
    $tags = get_tags_in_use($category_ID, 'id');

    // Start our output variable
    echo '<div class="tag-cloud">';

    // Cycle through each tag and set it up
    foreach ($tags as $tag):
        // Get our count
        $term = get_term_by('id', $tag, 'post_tag');
        $count = $term->count;

        // Get tag name
        $tag_info = get_tag($tag);
        $tag_name = $tag_info->name;

        // Get tag link
        $tag_link = get_tag_link($tag);

        // Set up our font size based on count
        $size = 8 + $count;

        echo '<span style="font-size:'.$size.'px;">';
        echo '<a href="'.$tag_link.'">'.$tag_name.'</a>';
        echo ' </span>';

    endforeach;

    echo '</div>';
}

Ahora sí, ya solo nos queda acceder al fichero php de nuestra plantilla donde se quiera mostrar la nube de tags asociada a una categoría de posts.

Simplemente invocaremos con:

<?php tag_cloud_by_category($cat_id); ?>

Resultado

WhatsApp chat