get_terms( array|string $args = array(), array|string $deprecated = '' )
检索给定分类法或分类法列表中的术语。目录锚点:#说明#参数#返回#源码#笔记
Retrieve the terms in a given taxonomy or list of taxonomies.
说明(Description)
说明#
说明
您可以在发送查询之前将任何自定义项完全注入查询,并使用筛选器控制输出。
当缓存拥有术语时,将调用“get-terms”筛选器,并将找到的术语与$taxonomies数组和$args数组一起传递。在传递术语数组之前也会调用此筛选器,并将传递术语数组以及$taxonomics和$args。
“list_terms_exclusions”过滤器将与$args一起传递已编译的排除项。
“get-terms-ORDER BY”筛选器将查询的orderby子句与$args数组一起传递。
在4.5.0之前,get_terms()的第一个参数是分类法或分类列表:
$terms=get_terms('post_tag',数组(
'hide_empty'=>假,
) );
从4.5.0开始,分类应通过$args数组中的“taxonomy”参数传递:
$terms=获取术语(数组(
'分类'=>'后标签',
'hide_empty'=>假,
) );
参数(Parameters)
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
$args | (array | string) | 可选 | 参数数组或字符串。有关接受参数的信息,请参见WP_Term_Query::u construct()。 |
$deprecated | (array | string) | 可选 | 参数数组,当使用传统函数参数格式时。如果存在,此参数将被解释为$args,第一个函数参数将被解析为分类法或分类法数组。 |
返回(Return)
(WP}u Term[]|int|WP}u Error)WP}u Term实例及其子实例的列表。如果任何分类不存在,将返回WP_Error。源码(Source)
/**
* Retrieve the terms in a given taxonomy or list of taxonomies.
*
* You can fully inject any customizations to the query before it is sent, as
* well as control the output with a filter.
*
* The {@see '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 {@see 'list_terms_exclusions'} filter passes the compiled exclusions along with
* the $args.
*
* The {@see 'get_terms_orderby'} filter passes the `ORDER BY` clause for the query
* along with the $args array.
*
* @since 2.3.0
* @since 4.2.0 Introduced 'name' and 'childless' parameters.
*
* @global wpdb $wpdb WordPress database abstraction object.
* @global array $wp_filter
*
* @param string|array $taxonomies Taxonomy name or list of Taxonomy names.
* @param array|string $args {
* Optional. Array or string of arguments to get terms.
*
* @type string $orderby Field(s) to order terms by. Accepts term fields ('name', 'slug',
* 'term_group', 'term_id', 'id', 'description'), 'count' for term
* taxonomy count, 'include' to match the 'order' of the $include param,
* or 'none' to skip ORDER BY. Defaults to 'name'.
* @type string $order Whether to order terms in ascending or descending order.
* Accepts 'ASC' (ascending) or 'DESC' (descending).
* Default 'ASC'.
* @type bool|int $hide_empty Whether to hide terms not assigned to any posts. Accepts
* 1|true or 0|false. Default 1|true.
* @type array|string $include Array or comma/space-separated string of term ids to include.
* Default empty array.
* @type array|string $exclude Array or comma/space-separated string of term ids to exclude.
* If $include is non-empty, $exclude is ignored.
* Default empty array.
* @type array|string $exclude_tree Array or comma/space-separated string of term ids to exclude
* along with all of their descendant terms. If $include is
* non-empty, $exclude_tree is ignored. Default empty array.
* @type int|string $number Maximum number of terms to return. Accepts ''|0 (all) or any
* positive number. Default ''|0 (all).
* @type int $offset The number by which to offset the terms query. Default empty.
* @type string $fields Term fields to query for. Accepts 'all' (returns an array of
* term objects), 'ids' or 'names' (returns an array of integers
* or strings, respectively. Default 'all'.
* @type string|array $name Optional. Name or array of names to return term(s) for. Default empty.
* @type string|array $slug Optional. Slug or array of slugs to return term(s) for. Default empty.
* @type bool $hierarchical Whether to include terms that have non-empty descendants (even
* if $hide_empty is set to true). Default true.
* @type string $search Search criteria to match terms. Will be SQL-formatted with
* wildcards before and after. Default empty.
* @type string $name__like Retrieve terms with criteria by which a term is LIKE $name__like.
* Default empty.
* @type string $description__like Retrieve terms where the description is LIKE $description__like.
* Default empty.
* @type bool $pad_counts Whether to pad the quantity of a term's children in the quantity
* of each term's "count" object variable. Default false.
* @type string $get Whether to return terms regardless of ancestry or whether the terms
* are empty. Accepts 'all' or empty (disabled). Default empty.
* @type int $child_of Term ID to retrieve child terms of. If multiple taxonomies
* are passed, $child_of is ignored. Default 0.
* @type int|string $parent Parent term ID to retrieve direct-child terms of. Default empty.
* @type bool $childless True to limit results to terms that have no children. This parameter has
* no effect on non-hierarchical taxonomies. Default false.
* @type string $cache_domain Unique cache key to be produced when this query is stored in an
* object cache. Default is 'core'.
* }
* @return array|int|WP_Error List of Term Objects and their children. Will return WP_Error, if any of $taxonomies
* do not exist.
*/
function get_terms( $taxonomies, $args = '' ) {
global $wpdb;
$empty_array = array();
$single_taxonomy = ! is_array( $taxonomies ) || 1 === count( $taxonomies );
if ( ! is_array( $taxonomies ) ) {
$taxonomies = array( $taxonomies );
}
foreach ( $taxonomies as $taxonomy ) {
if ( ! taxonomy_exists($taxonomy) ) {
return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );
}
}
$defaults = array('orderby' => 'name', 'order' => 'ASC',
'hide_empty' => true, 'exclude' => array(), 'exclude_tree' => array(), 'include' => array(),
'number' => '', 'fields' => 'all', 'name' => '', 'slug' => '', 'parent' => '', 'childless' => false,
'hierarchical' => true, 'child_of' => 0, 'get' => '', 'name__like' => '', 'description__like' => '',
'pad_counts' => false, 'offset' => '', 'search' => '', 'cache_domain' => 'core' );
$args = wp_parse_args( $args, $defaults );
$args['number'] = absint( $args['number'] );
$args['offset'] = absint( $args['offset'] );
// Save queries by not crawling the tree in the case of multiple taxes or a flat tax.
$has_hierarchical_tax = false;
foreach ( $taxonomies as $_tax ) {
if ( is_taxonomy_hierarchical( $_tax ) ) {
$has_hierarchical_tax = true;
}
}
if ( ! $has_hierarchical_tax ) {
$args['hierarchical'] = false;
$args['pad_counts'] = false;
}
// 'parent' overrides 'child_of'.
if ( 0 < intval(="" $args['parent']="" )="" )="" {="" $args['child_of']="false;" }="" if="" (="" 'all'="=" $args['get']="" )="" {="" $args['childless']="false;" $args['child_of']="0;" $args['hide_empty']="0;" $args['hierarchical']="false;" $args['pad_counts']="false;" }="" *="" *="" filter="" the="" terms="" query="" arguments.="" *="" *="" @since="" 3.1.0="" *="" *="" @param="" array="" $args="" an="" array="" of="" get_term()="" arguments.="" *="" @param="" array="" $taxonomies="" an="" array="" of="" taxonomies.="" */="" $args="apply_filters(" 'get_terms_args',="" $args,="" $taxonomies="" );="" avoid="" the="" query="" if="" the="" queried="" parent/child_of="" term="" has="" no="" descendants.="" $child_of="$args['child_of'];" $parent="$args['parent'];" if="" (="" $child_of="" )="" {="" $_parent="$child_of;" }="" elseif="" (="" $parent="" )="" {="" $_parent="$parent;" }="" else="" {="" $_parent="false;" }="" if="" (="" $_parent="" )="" {="" $in_hierarchy="false;" foreach="" (="" $taxonomies="" as="" $_tax="" )="" {="" $hierarchy="_get_term_hierarchy(" $_tax="" );="" if="" (="" isset(="" $hierarchy[="" $_parent="" ]="" )="" )="" {="" $in_hierarchy="true;" }="" }="" if="" (="" !="" $in_hierarchy="" )="" {="" return="" $empty_array;="" }="" }="" $args="" can="" be="" whatever,="" only="" use="" the="" args="" defined="" in="" defaults="" to="" compute="" the="" key.="" $filter_key="(" has_filter('list_terms_exclusions')="" )="" serialize($globals['wp_filter']['list_terms_exclusions'])="" :="" '';="" $key="md5(" serialize(="" wp_array_slice_assoc(="" $args,="" array_keys(="" $defaults="" )="" )="" )="" .="" serialize(="" $taxonomies="" )="" .="" $filter_key="" );="" $last_changed="wp_cache_get(" 'last_changed',="" 'terms'="" );="" if="" (="" !="" $last_changed="" )="" {="" $last_changed="microtime();" wp_cache_set(="" 'last_changed',="" $last_changed,="" 'terms'="" );="" }="" $cache_key="get_terms:$key:$last_changed" ;="" $cache="wp_cache_get(" $cache_key,="" 'terms'="" );="" if="" (="" false="" !="=" $cache="" )="" {="" *="" *="" filter="" the="" given="" taxonomy's="" terms="" cache.="" *="" *="" @since="" 2.3.0="" *="" *="" @param="" array="" $cache="" cached="" array="" of="" terms="" for="" the="" given="" taxonomy.="" *="" @param="" array="" $taxonomies="" an="" array="" of="" taxonomies.="" *="" @param="" array="" $args="" an="" array="" of="" get_terms()="" arguments.="" */="" return="" apply_filters(="" 'get_terms',="" $cache,="" $taxonomies,="" $args="" );="" }="" $_orderby="strtolower(" $args['orderby']="" );="" if="" (="" 'count'="=" $_orderby="" )="" {="" $orderby='tt.count' ;="" }="" elseif="" (="" 'name'="=" $_orderby="" )="" {="" $orderby='t.name' ;="" }="" elseif="" (="" 'slug'="=" $_orderby="" )="" {="" $orderby='t.slug' ;="" }="" elseif="" (="" 'include'="=" $_orderby="" &&="" !="" empty(="" $args['include']="" )="" )="" {="" $include="implode(" ',',="" array_map(="" 'absint',="" $args['include']="" )="" );="" $orderby="FIELD( t.term_id, $include )" ;="" }="" elseif="" (="" 'term_group'="=" $_orderby="" )="" {="" $orderby='t.term_group' ;="" }="" elseif="" (="" 'description'="=" $_orderby="" )="" {="" $orderby='tt.description' ;="" }="" elseif="" (="" 'none'="=" $_orderby="" )="" {="" $orderby='' ;="" }="" elseif="" (="" empty($_orderby)="" ||="" 'id'="=" $_orderby="" )="" {="" $orderby='t.term_id' ;="" }="" else="" {="" $orderby='t.name' ;="" }="" *="" *="" filter="" the="" orderby="" clause="" of="" the="" terms="" query.="" *="" *="" @since="" 2.8.0="" *="" *="" @param="" string="" $orderby="" `orderby`="" clause="" of="" the="" terms="" query.="" *="" @param="" array="" $args="" an="" array="" of="" terms="" query="" arguments.="" *="" @param="" array="" $taxonomies="" an="" array="" of="" taxonomies.="" */="" $orderby="apply_filters(" 'get_terms_orderby',="" $orderby,="" $args,="" $taxonomies="" );="" $order="strtoupper(" $args['order']="" );="" if="" (="" !="" empty(="" $orderby="" )="" )="" {="" $orderby="ORDER BY $orderby" ;="" }="" else="" {="" $order='' ;="" }="" if="" (="" ''="" !="=" $order="" &&="" !="" in_array(="" $order,="" array(="" 'asc',="" 'desc'="" )="" )="" )="" {="" $order='ASC' ;="" }="" $where="tt.taxonomy IN ('" .="" implode("',="" '",="" $taxonomies)="" .="" "')";="" $exclude="$args['exclude'];" $exclude_tree="$args['exclude_tree'];" $include="$args['include'];" $inclusions='' ;="" if="" (="" !="" empty(="" $include="" )="" )="" {="" $exclude='' ;="" $exclude_tree='' ;="" $inclusions="implode(" ',',="" wp_parse_id_list(="" $include="" )="" );="" }="" if="" (="" !="" empty(="" $inclusions="" )="" )="" {="" $inclusions=' AND t.term_id IN ( ' .="" $inclusions="" .="" '="" )';="" $where="" .="$inclusions;" }="" $exclusions="array();" if="" (="" !="" empty(="" $exclude_tree="" )="" )="" {="" $exclude_tree="wp_parse_id_list(" $exclude_tree="" );="" $excluded_children="$exclude_tree;" foreach="" (="" $exclude_tree="" as="" $extrunk="" )="" {="" $excluded_children="array_merge(" $excluded_children,="" (array)="" get_terms(="" $taxonomies[0],="" array(="" 'child_of'=""> intval( $extrunk ), 'fields' => 'ids', 'hide_empty' => 0 ) )
);
}
$exclusions = array_merge( $excluded_children, $exclusions );
}
if ( ! empty( $exclude ) ) {
$exclusions = array_merge( wp_parse_id_list( $exclude ), $exclusions );
}
// 'childless' terms are those without an entry in the flattened term hierarchy.
$childless = (bool) $args['childless'];
if ( $childless ) {
foreach ( $taxonomies as $_tax ) {
$term_hierarchy = _get_term_hierarchy( $_tax );
$exclusions = array_merge( array_keys( $term_hierarchy ), $exclusions );
}
}
if ( ! empty( $exclusions ) ) {
$exclusions = ' AND t.term_id NOT IN (' . implode( ',', array_map( 'intval', $exclusions ) ) . ')';
} else {
$exclusions = '';
}
/**
* Filter the terms to exclude from the terms query.
*
* @since 2.3.0
*
* @param string $exclusions `NOT IN` clause of the terms query.
* @param array $args An array of terms query arguments.
* @param array $taxonomies An array of taxonomies.
*/
$exclusions = apply_filters( 'list_terms_exclusions', $exclusions, $args, $taxonomies );
if ( ! empty( $exclusions ) ) {
$where .= $exclusions;
}
if ( ! empty( $args['name'] ) ) {
$names = (array) $args['name'];
foreach ( $names as &$_name ) {
$_name = sanitize_term_field( 'name', $_name, 0, reset( $taxonomies ), 'db' );
}
$where .= " AND t.name IN ('" . implode( "', '", array_map( 'esc_sql', $names ) ) . "')";
}
if ( ! empty( $args['slug'] ) ) {
if ( is_array( $args['slug'] ) ) {
$slug = array_map( 'sanitize_title', $args['slug'] );
$where .= " AND t.slug IN ('" . implode( "', '", $slug ) . "')";
} else {
$slug = sanitize_title( $args['slug'] );
$where .= " AND t.slug = '$slug'";
}
}
if ( ! empty( $args['name__like'] ) ) {
$where .= $wpdb->prepare( " AND t.name LIKE %s", '%' . $wpdb->esc_like( $args['name__like'] ) . '%' );
}
if ( ! empty( $args['description__like'] ) ) {
$where .= $wpdb->prepare( " AND tt.description LIKE %s", '%' . $wpdb->esc_like( $args['description__like'] ) . '%' );
}
if ( '' !== $parent ) {
$parent = (int) $parent;
$where .= " AND tt.parent = '$parent'";
}
$hierarchical = $args['hierarchical'];
if ( 'count' == $args['fields'] ) {
$hierarchical = false;
}
if ( $args['hide_empty'] && !$hierarchical ) {
$where .= ' AND tt.count > 0';
}
$number = $args['number'];
$offset = $args['offset'];
// Don't limit the query results when we have to descend the family tree.
if ( $number && ! $hierarchical && ! $child_of && '' === $parent ) {
if ( $offset ) {
$limits = 'LIMIT ' . $offset . ',' . $number;
} else {
$limits = 'LIMIT ' . $number;
}
} else {
$limits = '';
}
if ( ! empty( $args['search'] ) ) {
$like = '%' . $wpdb->esc_like( $args['search'] ) . '%';
$where .= $wpdb->prepare( ' AND ((t.name LIKE %s) OR (t.slug LIKE %s))', $like, $like );
}
$selects = array();
switch ( $args['fields'] ) {
case 'all':
$selects = array( 't.*', 'tt.*' );
break;
case 'ids':
case 'id=>parent':
$selects = array( 't.term_id', 'tt.parent', 'tt.count', 'tt.taxonomy' );
break;
case 'names':
$selects = array( 't.term_id', 'tt.parent', 'tt.count', 't.name', 'tt.taxonomy' );
break;
case 'count':
$orderby = '';
$order = '';
$selects = array( 'COUNT(*)' );
break;
case 'id=>name':
$selects = array( 't.term_id', 't.name', 'tt.count', 'tt.taxonomy' );
break;
case 'id=>slug':
$selects = array( 't.term_id', 't.slug', 'tt.count', 'tt.taxonomy' );
break;
}
$_fields = $args['fields'];
/**
* Filter the fields to select in the terms query.
*
* Field lists modified using this filter will only modify the term fields returned
* by the function when the `$fields` parameter set to 'count' or 'all'. In all other
* cases, the term fields in the results array will be determined by the `$fields`
* parameter alone.
*
* Use of this filter can result in unpredictable behavior, and is not recommended.
*
* @since 2.8.0
*
* @param array $selects An array of fields to select for the terms query.
* @param array $args An array of term query arguments.
* @param array $taxonomies An array of taxonomies.
*/
$fields = implode( ', ', apply_filters( 'get_terms_fields', $selects, $args, $taxonomies ) );
$join = "INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id";
$pieces = array( 'fields', 'join', 'where', 'orderby', 'order', 'limits' );
/**
* Filter the terms query SQL clauses.
*
* @since 3.1.0
*
* @param array $pieces Terms query SQL clauses.
* @param array $taxonomies An array of taxonomies.
* @param array $args An array of terms query arguments.
*/
$clauses = apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args );
$fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : '';
$join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : '';
$where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : '';
$orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : '';
$order = isset( $clauses[ 'order' ] ) ? $clauses[ 'order' ] : '';
$limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : '';
$query = "SELECT $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits";
if ( 'count' == $_fields ) {
return $wpdb->get_var( $query );
}
$terms = $wpdb->get_results($query);
if ( 'all' == $_fields ) {
update_term_cache( $terms );
}
if ( empty($terms) ) {
wp_cache_add( $cache_key, array(), 'terms', DAY_IN_SECONDS );
/** This filter is documented in wp-includes/taxonomy.php */
return apply_filters( 'get_terms', array(), $taxonomies, $args );
}
if ( $child_of ) {
foreach ( $taxonomies as $_tax ) {
$children = _get_term_hierarchy( $_tax );
if ( ! empty( $children ) ) {
$terms = _get_term_children( $child_of, $terms, $_tax );
}
}
}
// Update term counts to include children.
if ( $args['pad_counts'] && 'all' == $_fields ) {
foreach ( $taxonomies as $_tax ) {
_pad_term_counts( $terms, $_tax );
}
}
// Make sure we show empty categories that have children.
if ( $hierarchical && $args['hide_empty'] && is_array( $terms ) ) {
foreach ( $terms as $k => $term ) {
if ( ! $term->count ) {
$children = get_term_children( $term->term_id, $term->taxonomy );
if ( is_array( $children ) ) {
foreach ( $children as $child_id ) {
$child = get_term( $child_id, $term->taxonomy );
if ( $child->count ) {
continue 2;
}
}
}
// It really is empty.
unset($terms[$k]);
}
}
}
$_terms = array();
if ( 'id=>parent' == $_fields ) {
foreach ( $terms as $term ) {
$_terms[ $term->term_id ] = $term->parent;
}
} elseif ( 'ids' == $_fields ) {
foreach ( $terms as $term ) {
$_terms[] = $term->term_id;
}
} elseif ( 'names' == $_fields ) {
foreach ( $terms as $term ) {
$_terms[] = $term->name;
}
} elseif ( 'id=>name' == $_fields ) {
foreach ( $terms as $term ) {
$_terms[ $term->term_id ] = $term->name;
}
} elseif ( 'id=>slug' == $_fields ) {
foreach ( $terms as $term ) {
$_terms[ $term->term_id ] = $term->slug;
}
}
if ( ! empty( $_terms ) ) {
$terms = $_terms;
}
if ( $number && is_array( $terms ) && count( $terms ) > $number ) {
$terms = array_slice( $terms, $offset, $number );
}
wp_cache_add( $cache_key, $terms, 'terms', DAY_IN_SECONDS );
/** This filter is documented in wp-includes/taxonomy */
return apply_filters( 'get_terms', $terms, $taxonomies, $args );
}
更新版本 | 源码位置 | 使用 | 被使用 |
---|---|---|---|
4.8.0 | wp-includes/taxonomy.php:1141 | 33 | 7 |
笔记(Notes)
所有具有默认值的get_terms属性:从WordPress4.6.1开始,这里是返回的数组(添加到上面Leo的有用注释中)
如果通过parent=>0,则只返回顶级术语