Here's another solution using a simple lightweight `db_select` query on `taxonomy_term_data`. It provides two functions, one to get the next term, and one to get the previous. The idea is to select the next ( or previous ) term in the same vocabulary with a weight greater ( or less than ) than current term, ordered by weight and limited to one result. A static cache is used so query only performed once per page load. /** * Return next term id by weight * @param $term taxonomy term object * @return int term id or FALSE if none exists */ function EXAMPLE_next_term($term) { // Use static cache $next = &drupal_static(__FUNCTION__ . '_' . $term->tid, FALSE); if(!$next){ $next = db_select('taxonomy_term_data', 'td') ->fields('td', array('tid')) ->condition('weight', $term->weight, '>') ->condition('vid', $term->vid) ->orderBy('weight') ->range(0,1) ->execute() ->fetchField(); } return $next; } /** * Return previous term id by weight * @param $term taxonomy term object * @return int term id or FALSE if none exists */ function EXAMPLE_previous_term($term) { // Use static cache $previous = &drupal_static(__FUNCTION__ . '_' . $term->tid, FALSE); if(!$previous){ $previous = db_select('taxonomy_term_data', 'td') ->fields('td', array('tid')) ->condition('weight', $term->weight, '<') ->condition('vid', $term->vid) ->orderBy('weight') ->range(0,1) ->execute() ->fetchField(); } return $previous; } Example usage: if($tid = EXAMPLE_next_term($term)){ $next_term = taxonomy_term_load($tid); // Load full term $link = l($next_term->name, 'taxonomy/term/'.$next_term->tid); }