12

I need to tell whether or not the current custom taxonomy archive page I'm viewing has child categories. I've got a situation where there are a lot of custom categories with children and the site is only to show posts at the end of the line. Otherwise it should show a link to the category that's the next step down. I've found this snippet, but it doesn't seem to work for custom taxonomies.

function category_has_children() {
global $wpdb;   
$term = get_queried_object();
$category_children_check = $wpdb->get_results(" SELECT * FROM wp_term_taxonomy WHERE parent = '$term->term_id' ");
    if ($category_children_check) {
        return true;
    } else {
       return false;
    }
}   

<?php
    if (!category_has_children()) {
        //use whatever loop or template part here to show the posts at the end of the line
   get_template_part('loop', 'index'); 
       }   

    else {
       // show your category index page here
    }
?>
user29489
  • 143
  • 1
  • 1
  • 5

4 Answers4

16

There may or may not be a better way to do this, but here's how I would do it:

$term = get_queried_object();

$children = get_terms( $term->taxonomy, array(
'parent'    => $term->term_id,
'hide_empty' => false
) );
// print_r($children); // uncomment to examine for debugging
if($children) { // get_terms will return false if tax does not exist or term wasn't found.
    // term has children
}

If current taxonomy term has children the get_terms function will return an array, otherwise it will return false.

Tested and works on my local vanilla install with Custom Post Type UI plugin used for CPT generation.

montrealist
  • 3,074
  • 1
  • 22
  • 27
15

There's also a generic WP possibility to do this via get_term_children.

<?php
$children = get_term_children($termId, $taxonomyName);

if( empty( $children ) ) { //do something here }

Darshan Gada
  • 119
  • 3
1

Assuming that you are trying to filter your terms to only show terms that either have children or not, you can actually use the childless parameter in your get_terms() function.

$children = get_terms( 
    'taxonomy' => '$taxonomy_slug',
    'hide_empty' => false,
    'childless' => true
  ) 
);

This will output an array of terms that don't have children.

Frits
  • 190
  • 4
  • 13
-2

This is by far the cleanest solution

$term = get_queried_object();
if($term->parent == 0 ){
  // do stuff;
}
ivan marchenko
  • 149
  • 1
  • 6