get_terms( string|array $args = array(), array $deprecated = '' )

Retrieve the terms in a given taxonomy or list of taxonomies.


Description Description

You can fully inject any customizations to the query before it is sent, as well as control the output with a filter.

The ‘get_terms’ filter will be called when the cache has the term and will pass the found term along with the array of $taxonomies and array of $args. This filter is also called before the array of terms is passed and will pass the array of terms, along with the $taxonomies and $args.

The ‘list_terms_exclusions’ filter passes the compiled exclusions along with the $args.

The ‘get_terms_orderby’ filter passes the ORDER BY clause for the query along with the $args array.

Prior to 4.5.0, the first parameter of get_terms() was a taxonomy or list of taxonomies:

$terms = get_terms( 'post_tag', array(
    'hide_empty' => false,
) );

Since 4.5.0, taxonomies should be passed via the ‘taxonomy’ argument in the $args array:

$terms = get_terms( array(
    'taxonomy' => 'post_tag',
    'hide_empty' => false,
) );

Parameters Parameters

$args

(string|array) (Optional) Array or string of arguments. See WP_Term_Query::__construct() for information on accepted arguments.

Default value: array()

$deprecated

(array) (Optional) Argument array, when using the legacy function parameter format. If present, this parameter will be interpreted as $args, and the first function parameter will be parsed as a taxonomy or array of taxonomies.

Default value: ''


Top ↑

Return Return

(array|int|WP_Error) List of WP_Term instances and their children. Will return WP_Error, if any of $taxonomies do not exist.


Top ↑

Source Source

File: wp-includes/taxonomy.php

function get_terms( $args = array(), $deprecated = '' ) {
	$term_query = new WP_Term_Query();

	$defaults = array(
		'suppress_filter' => false,
	);

	/*
	 * Legacy argument format ($taxonomy, $args) takes precedence.
	 *
	 * We detect legacy argument format by checking if
	 * (a) a second non-empty parameter is passed, or
	 * (b) the first parameter shares no keys with the default array (ie, it's a list of taxonomies)
	 */
	$_args          = wp_parse_args( $args );
	$key_intersect  = array_intersect_key( $term_query->query_var_defaults, (array) $_args );
	$do_legacy_args = $deprecated || empty( $key_intersect );

	if ( $do_legacy_args ) {
		$taxonomies       = (array) $args;
		$args             = wp_parse_args( $deprecated, $defaults );
		$args['taxonomy'] = $taxonomies;
	} else {
		$args = wp_parse_args( $args, $defaults );
		if ( isset( $args['taxonomy'] ) && null !== $args['taxonomy'] ) {
			$args['taxonomy'] = (array) $args['taxonomy'];
		}
	}

	if ( ! empty( $args['taxonomy'] ) ) {
		foreach ( $args['taxonomy'] as $taxonomy ) {
			if ( ! taxonomy_exists( $taxonomy ) ) {
				return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
			}
		}
	}

	// Don't pass suppress_filter to WP_Term_Query.
	$suppress_filter = $args['suppress_filter'];
	unset( $args['suppress_filter'] );

	$terms = $term_query->query( $args );

	// Count queries are not filtered, for legacy reasons.
	if ( ! is_array( $terms ) ) {
		return $terms;
	}

	if ( $suppress_filter ) {
		return $terms;
	}

	/**
	 * Filters the found terms.
	 *
	 * @since 2.3.0
	 * @since 4.6.0 Added the `$term_query` parameter.
	 *
	 * @param array         $terms      Array of found terms.
	 * @param array         $taxonomies An array of taxonomies.
	 * @param array         $args       An array of get_terms() arguments.
	 * @param WP_Term_Query $term_query The WP_Term_Query object.
	 */
	return apply_filters( 'get_terms', $terms, $term_query->query_vars['taxonomy'], $term_query->query_vars, $term_query );
}

Top ↑

Changelog Changelog

Changelog
Version Description
4.8.0 Introduced 'suppress_filter' parameter.
4.5.0 Changed the function signature so that the $args array can be provided as the first parameter. Introduced 'meta_key' and 'meta_value' parameters. Introduced the ability to order results by metadata.
4.4.0 Introduced the ability to pass 'term_id' as an alias of 'id' for the orderby parameter. Introduced the 'meta_query' and 'update_term_meta_cache' parameters. Converted to return a list of WP_Term objects.
4.2.0 Introduced 'name' and 'childless' parameters.
2.3.0 Introduced.


Top ↑

User Contributed Notes User Contributed Notes

  1. Skip to note 1 content
    Contributed by kopernik1elfka

    All get_terms attributes with default values:
    (I try default from this article and it didn’t work. This works.)

    $get_terms_default_attributes = array (
    			'taxonomy' => 'category', //empty string(''), false, 0 don't work, and return empty array
    			'orderby' => 'name',
    			'order' => 'ASC',
    			'hide_empty' => true, //can be 1, '1' too
    			'include' => 'all', //empty string(''), false, 0 don't work, and return empty array
    			'exclude' => 'all', //empty string(''), false, 0 don't work, and return empty array
    			'exclude_tree' => 'all', //empty string(''), false, 0 don't work, and return empty array
    			'number' => false, //can be 0, '0', '' too
    			'offset' => '',
    			'fields' => 'all',
    			'name' => '',
    			'slug' => '',
    			'hierarchical' => true, //can be 1, '1' too
    			'search' => '',
    			'name__like' => '',
    			'description__like' => '',
    			'pad_counts' => false, //can be 0, '0', '' too
    			'get' => '',
    			'child_of' => false, //can be 0, '0', '' too
    			'childless' => false,
    			'cache_domain' => 'core',
    			'update_term_meta_cache' => true, //can be 1, '1' too
    			'meta_query' => '',
    			'meta_key' => array(),
    			'meta_value'=> '',
    	);
  2. Skip to note 2 content
    Contributed by ancawonka

    As of WordPress 4.6.1, here’s the array that’s returned (to add to Leo’s helpful note above)

    array(1) {
      [0]=>
      object(WP_Term) (11) {
        ["term_id"]=>  //int
        ["name"]=>	//string 
        ["slug"]=>  //string 
        ["term_group"]=>  //int
        ["term_taxonomy_id"]=> //int
        ["taxonomy"]=>	//string
        ["description"]=>	//string
        ["parent"]=>	//int
        ["count"]=>	// int
        ["filter"]=>	//string
        ["meta"]=> array(0) { // presumably this would be some returned meta-data?
        }
      }
    }
    
  3. Skip to note 5 content
    Contributed by znowebdev

    Get all post categories ordered by count.

    String syntax:

    $categories = get_terms( 'category', 'orderby=count&hide_empty=0' );
    

    Array syntax:

    $categories = get_terms( 'category', array(
    	'orderby'    => 'count',
    	'hide_empty' => 0,
    ) );
    

    Get all the links categories:

    $my_links_categories = get_terms( 'link_category', 'orderby=count&hide_empty=0' );
    

    List all the terms in a custom taxonomy, without a link:

    $terms = get_terms( 'my_taxonomy' );
    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
    	echo '<ul>';
    	foreach ( $terms as $term ) {
    		echo '<li>' . $term->name . '</li>';
    	}
    	echo '</ul>';
    }
    

    List all the terms, with link to term archive, separated by an interpunct (ยท):

    $args = array( 'hide_empty=0' );
    
    $terms = get_terms( 'my_term', $args );
    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
    	$count = count( $terms );
    	$i = 0;
    	$term_list = '<p class="my_term-archive">';
    	foreach ( $terms as $term ) {
    		$i++;
    		$term_list .= '<a href="' . esc_url( get_term_link( $term ) ) . '" alt="' . esc_attr( sprintf( __( 'View all post filed under %s', 'my_localization_domain' ), $term->name ) ) . '">' . $term->name . '</a>';
    		if ( $count != $i ) {
    			$term_list .= ' &middot; ';
    		}
    		else {
    			$term_list .= '</p>';
    		}
    	}
    	echo $term_list;
    }
    
  4. Skip to note 6 content
    Contributed by CdWritted

    Get categories and subcategories by custom taxonomies:

    $taxonomies = get_terms( array(
    	'taxonomy' => 'taxonomy_name',
    	'hide_empty' => false
    ) );
    
    if ( !empty($taxonomies) ) :
    	$output = '<select>';
    	foreach( $taxonomies as $category ) {
    		if( $category->parent == 0 ) {
    			$output.= '<optgroup label="'. esc_attr( $category->name ) .'">';
    			foreach( $taxonomies as $subcategory ) {
    				if($subcategory->parent == $category->term_id) {
    				$output.= '<option value="'. esc_attr( $subcategory->term_id ) .'">
    					'. esc_html( $subcategory->name ) .'</option>';
    				}
    			}
    			$output.='</optgroup>';
    		}
    	}
    	$output.='</select>';
    	echo $output;
    endif;
  5. Skip to note 7 content
    Contributed by Kevin

    Working with Advanced Custom Fields (field type: Taxonomy, output: Object) for filtering taxonomies.

    Case: Create a filter with main categories defined by ACF field, and all another should belongs to *others*.

    Solution:

    // Define Featured Category IDs first
    $featured_category_ids = array();
    // It must be output WP_Object
    $featured_categories = get_field('main_category_filters');
    
    // Creating loop to insert IDs to array.
    foreach( $featured_categories as $cat ) {
    	$featured_category_ids[] = $cat-&gt;term_id;
    }
    
    // Now, if Featured Categories are match, add their IDs via 'exclude'
    if( $featured_categories ) {
    	$args = array(
    		'taxonomy' =&gt; 'event_cat',
    		'parent' =&gt; 0,
    		'exclude' =&gt; $featured_category_ids
    	);
    } else {
        // If no featured, just display all terms
    	$args = array(
    		'taxonomy' =&gt; 'event_cat',
    		'parent' =&gt; 0
    	);
    }
    
    // Starting query terms now
    $other_categories = get_terms($args);
    
  6. Skip to note 10 content
    Contributed by ctousignant

    Meta Query using a custom field, and then ordering using a different custom field.

    $terms = get_terms( array(
        'taxonomy' => 'tax_slug',
        'hide_empty' => false,
        'meta_query' => array(
            [
                'key' => 'meta_key_slug_1',
                'value' => 'desired value to look for'
            ]
        ),
        'meta_key' => 'meta_key_slug_2',
        'orderby' => 'meta_key_slug_2'
    
    ) );
    
  7. Skip to note 11 content
    Contributed by Anvar Ulugov

    Get Terms filtered by first letter

    $authors = get_terms('book-authors', array('name__like' => $first_l));
    
    function custom_tax_query( $pieces, $taxonomies, $args ) {
      if ( 'book-authors' == $taxonomies[0] ) {
        $pieces['where'] = str_replace("LIKE '%", "LIKE '", $pieces['where']);
      }
    return $pieces;
    }
    
  8. Skip to note 13 content
    Contributed by Kevin

    Get Categories by custom post type with dropdown:

    function taxonomy_list_dropdown($type, $post_type) {
      $terms = get_terms($type);
      $category = taxonomy_current($type);
    
      if ( !empty( $terms ) &amp;&amp; !is_wp_error( $terms ) ){
        the_terms_list(
          'categories__dropdown icon-dropdown',
          array(
            'show_option_all'  =&gt; 'Click to filter',
            'taxonomy'         =&gt; $type,
            'current_category' =&gt; $category-&gt;term_id,
            'value_field'      =&gt; 'slug',
            'selected'         =&gt; $category-&gt;slug,
          ),
          'dropdown',
          'data-module-init="redirect-dropdown"'
        );
      }
    }
    

You must log in before being able to contribute a note or feedback.