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.
Список изменений
Код acf_get_grouped_terms() 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;
}