acf_get_grouped_terms()ACF 5.7.2

acf_get_grouped_terms

Returns an array of terms for the given query $args and groups by taxonomy name.

Хуков нет.

Возвращает

Массив.

Использование

acf_get_grouped_terms( $args );
$args(массив) (обязательный)
An array of args used in the get_terms() function.

Список изменений

С версии 5.7.2 Введена.

Код acf_get_grouped_terms() ACF 6.0.4

function acf_get_grouped_terms( $args ) {

	// vars
	$data = array();

	// defaults
	$args = wp_parse_args(
		$args,
		array(
			'taxonomy'               => null,
			'hide_empty'             => false,
			'update_term_meta_cache' => false,
		)
	);

	// vars
	$taxonomies = acf_get_taxonomy_labels( acf_get_array( $args['taxonomy'] ) );
	$is_single  = ( count( $taxonomies ) == 1 );

	// specify exact taxonomies required for _acf_terms_clauses() to work.
	$args['taxonomy'] = array_keys( $taxonomies );

	// add filter to group results by taxonomy
	if ( ! $is_single ) {
		add_filter( 'terms_clauses', '_acf_terms_clauses', 10, 3 );
	}

	// get terms
	$terms = get_terms( $args );

	// remove this filter (only once)
	if ( ! $is_single ) {
		remove_filter( 'terms_clauses', '_acf_terms_clauses', 10, 3 );
	}

	// loop
	foreach ( $taxonomies as $taxonomy => $label ) {

		// vars
		$this_terms = array();

		// populate $this_terms
		foreach ( $terms as $term ) {
			if ( $term->taxonomy == $taxonomy ) {
				$this_terms[] = $term;
			}
		}

		// bail early if no $items
		if ( empty( $this_terms ) ) {
			continue;
		}

		// sort into hierachial order
		// this will fail if a search has taken place because parents wont exist
		if ( is_taxonomy_hierarchical( $taxonomy ) && empty( $args['s'] ) ) {

			// get all terms from this taxonomy
			$all_terms = get_terms(
				array_merge(
					$args,
					array(
						'number'   => 0,
						'offset'   => 0,
						'taxonomy' => $taxonomy,
					)
				)
			);

			// vars
			$length = count( $this_terms );
			$offset = 0;

			// find starting point (offset)
			foreach ( $all_terms as $i => $term ) {
				if ( $term->term_id == $this_terms[0]->term_id ) {
					$offset = $i;
					break;
				}
			}

			// order terms
			$parent        = acf_maybe_get( $args, 'parent', 0 );
			$parent        = acf_maybe_get( $args, 'child_of', $parent );
			$ordered_terms = _get_term_children( $parent, $all_terms, $taxonomy );

			// compare aray lengths
			// if $ordered_posts is smaller than $all_posts, WP has lost posts during the get_page_children() function
			// this is possible when get_post( $args ) filter out parents (via taxonomy, meta and other search parameters)
			if ( count( $ordered_terms ) == count( $all_terms ) ) {
				$this_terms = array_slice( $ordered_terms, $offset, $length );
			}
		}

		// populate group
		$data[ $label ] = array();
		foreach ( $this_terms as $term ) {
			$data[ $label ][ $term->term_id ] = $term;
		}
	}

	// return
	return $data;
}