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: ''
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.
Source Source
File: wp-includes/taxonomy.php
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 | 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 ); } |
Expand full source code Collapse full source code View on Trac
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. |
User Contributed Notes User Contributed Notes
You must log in before being able to contribute a note or feedback.
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'
=>
''
,
);
Expand full source codeCollapse full source code
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?
}
}
}
Expand full source codeCollapse full source code
If parent => 0 is passed, only top-level terms will be returned
$terms
= get_terms(
array
(
'taxonomy'
=>
'tax_name'
,
'parent'
=> 0
) );
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 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
.=
' · '
;
}
else
{
$term_list
.=
'</p>'
;
}
}
echo
$term_list
;
}
Expand full source codeCollapse full source code
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
;
Expand full source codeCollapse full source code
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
->term_id;
}
// Now, if Featured Categories are match, add their IDs via 'exclude'
if
(
$featured_categories
) {
$args
=
array
(
'taxonomy'
=>
'event_cat'
,
'parent'
=> 0,
'exclude'
=>
$featured_category_ids
);
}
else
{
// If no featured, just display all terms
$args
=
array
(
'taxonomy'
=>
'event_cat'
,
'parent'
=> 0
);
}
// Starting query terms now
$other_categories
= get_terms(
$args
);
Expand full source codeCollapse full source code
List terms limit to those matching a specific metadata key and metadata value
$terms
= get_terms(
array
(
'taxonomy'
=>
'taxonomy name'
,
'meta_key'
=>
'metadata key'
,
'meta_value'
=>
'metadata value'
) );
Order by parent term ID – not documented, but also works.
$categories
= get_terms(
'category'
,
array
(
'orderby'
=>
'parent'
,
) );
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'
) );
Expand full source codeCollapse full source code
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
;
}
Get terms ordered by value of meta-key:
$terms
= get_terms(
'taxonomy_name'
,
array
(
'meta_key'
=>
'custom_meta_key'
,
'orderby'
=>
'custom_meta_key'
)
);
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
) && !is_wp_error(
$terms
) ){
the_terms_list(
'categories__dropdown icon-dropdown'
,
array
(
'show_option_all'
=>
'Click to filter'
,
'taxonomy'
=>
$type
,
'current_category'
=>
$category
->term_id,
'value_field'
=>
'slug'
,
'selected'
=>
$category
->slug,
),
'dropdown'
,
'data-module-init="redirect-dropdown"'
);
}
}
Expand full source codeCollapse full source code