1. 首页
  2. WordPress 函数手册

get_terms()

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&#91;'parent'&#93;="" )="" )="" {="" $args&#91;'child_of'&#93;="false;" }="" if="" (="" 'all'="=" $args&#91;'get'&#93;="" )="" {="" $args&#91;'childless'&#93;="false;" $args&#91;'child_of'&#93;="0;" $args&#91;'hide_empty'&#93;="0;" $args&#91;'hierarchical'&#93;="false;" $args&#91;'pad_counts'&#93;="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&#91;'child_of'&#93;;" $parent="$args&#91;'parent'&#93;;" 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&#91;="" $_parent="" &#93;="" )="" )="" {="" $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&#91;'wp_filter'&#93;&#91;'list_terms_exclusions'&#93;)="" :="" '';="" $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&#91;'orderby'&#93;="" );="" if="" (="" 'count'="=" $_orderby="" )="" {="" $orderby='tt.count' ;="" }="" elseif="" (="" 'name'="=" $_orderby="" )="" {="" $orderby='t.name' ;="" }="" elseif="" (="" 'slug'="=" $_orderby="" )="" {="" $orderby='t.slug' ;="" }="" elseif="" (="" 'include'="=" $_orderby="" &&="" !="" empty(="" $args&#91;'include'&#93;="" )="" )="" {="" $include="implode(" ',',="" array_map(="" 'absint',="" $args&#91;'include'&#93;="" )="" );="" $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&#91;'order'&#93;="" );="" 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&#91;'exclude'&#93;;" $exclude_tree="$args&#91;'exclude_tree'&#93;;" $include="$args&#91;'include'&#93;;" $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&#91;0&#93;,="" 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,则只返回顶级术语

get_terms() 为WP2原创文章,链接:https://www.wp2.cn/functions/get_terms/

发表评论

您的电子邮箱地址不会被公开。