Drupal - Show child terms of current term, only if child items exist - code modification needed

StackOverflow https://stackoverflow.com/questions/16819554

  •  30-05-2022
  •  | 
  •  

Question

Having fought with the problem of showing child terms for a given taxonomy term in a block, I finally stumbled on a piece of code that does exactly what I want here

As per the instructions I've added the following to my template.php

function themename_child_terms($vid = 1) {
  if(arg(0) == 'taxonomy' && arg(1) == 'term') {   
    $children = taxonomy_get_children(arg(2), $vid);
      if(!$children) {
        $custom_parent = taxonomy_get_parents(arg(2));
          $parent_tree = array();
          foreach ($custom_parent as $custom_child => $key) {
            $parent_tree = taxonomy_get_tree($vid, $key->tid);
          }
          $children = $parent_tree;
      }

    $output = '<ul>';
    foreach ($children as $term) {
      $output .= '<li>';
      $output .= l($term->name, 'taxonomy/term/' . $term->tid);
      $output .= '</li>';
    }
    $output .= '</ul>';

    return $output;
  }
}

I've then created a block and added :

<?php // $vid is the vocabulary id.
    print themename_child_terms($vid = 1);
?>

This shows the child terms of the current term perfectly. However, it shows ALL terms that exist under the parent term, even if there is no piece of content using that term.

e.g. viewing the page with all items in Term 1, I get

child 1
child 2
child 3

correctly listed in the block. But, if there are no pieces of content tagged with 'child 3' for example, it's still showing up that term in the block. This isn't very useful as it links to an empty term page. How would I modify the code to only show children that actually have items associated with them. So if there are no children tagged 'Child 3', then that term would not show up. Is it an easy modification?

Thank you kindly for any solutions.

Nick

Working with Drupal 6

Was it helpful?

Solution

Thanks to user jerdiggity for posting the following reply over on drupal.stackexchange here. Works perfectly.


Hmm... I'd try something like this:

Change this part of your code:

foreach ($children as $term) {
  $output .= '<li>';
  $output .= l($term->name, 'taxonomy/term/' . $term->tid);
  $output .= '</li>';
}

to something like this:

// Avoid unnecessary "Invalid foreach" errors showing up in the log:
if (!empty($children)) {
  // If not empty, run the foreach loop:
  foreach ($children as $term) {
    // Then check to see if any nodes exist for that term id:
    $number_of_nodes = taxonomy_term_count_nodes($term->tid);
    // If there ARE nodes...
    if ($number_of_nodes > 0) {
      // ... then add them to the output:
      $output .= '<li>';
      $output .= l($term->name, 'taxonomy/term/' . $term->tid);
      $output .= '</li>';
    }
  }
}

Hope that helps... :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top