WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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;

    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
share|improve this question
up vote 5 down vote accepted

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.

share|improve this answer
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
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
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

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

$children = get_term_children($termId, $taxonomyName);

if( empty( $children ) ) {
    //do something here
share|improve this answer

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.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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