11

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
    }
?>
9

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.

  • When I uncommented the print_r($children).... it outputted an array. How could that be turned into an if/else? Sorry, I'm still very new to php – user29489 Mar 28 '13 at 17:43
  • 1
    Disregard I used this: if ($children) { echo 'Children Here'; } else { echo 'No Children'; } – user29489 Mar 28 '13 at 17:52
  • @user29489 You're right, I wasn't clear enough in my answer. Edited for future reference. – montrealist Mar 28 '13 at 18:02
  • 1
    For those that just need to know whether there are any children and don't need to get the data for the child terms, I suggest adding 'field' => 'count' to just count the number of children. – J.D. Dec 30 '13 at 19:54
  • Does this work with normal post categories as well? – Pete Nov 19 '18 at 0:48
8

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
}
0

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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.