123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522 |
- <?php
- /*
- * acf_get_taxonomies
- *
- * Returns an array of taxonomy names.
- *
- * @date 7/10/13
- * @since 5.0.0
- *
- * @param array $args An array of args used in the get_taxonomies() function.
- * @return array An array of taxonomy names.
- */
- function acf_get_taxonomies( $args = array() ) {
- // vars
- $taxonomies = array();
- // get taxonomy objects
- $objects = get_taxonomies( $args, 'objects' );
- // loop
- foreach ( $objects as $i => $object ) {
- // bail early if is builtin (WP) private post type
- // - nav_menu_item, revision, customize_changeset, etc
- if ( $object->_builtin && ! $object->public ) {
- continue;
- }
- // append
- $taxonomies[] = $i;
- }
- // custom post_type arg which does not yet exist in core
- if ( isset( $args['post_type'] ) ) {
- $taxonomies = acf_get_taxonomies_for_post_type( $args['post_type'] );
- }
- // filter
- $taxonomies = apply_filters( 'acf/get_taxonomies', $taxonomies, $args );
- // return
- return $taxonomies;
- }
- /**
- * acf_get_taxonomies_for_post_type
- *
- * Returns an array of taxonomies for a given post type(s)
- *
- * @date 7/9/18
- * @since 5.7.5
- *
- * @param string|array $post_types The post types to compare against.
- * @return array
- */
- function acf_get_taxonomies_for_post_type( $post_types = 'post' ) {
- // vars
- $taxonomies = array();
- // loop
- foreach ( (array) $post_types as $post_type ) {
- $object_taxonomies = get_object_taxonomies( $post_type );
- foreach ( (array) $object_taxonomies as $taxonomy ) {
- $taxonomies[] = $taxonomy;
- }
- }
- // remove duplicates
- $taxonomies = array_unique( $taxonomies );
- // return
- return $taxonomies;
- }
- /*
- * acf_get_taxonomy_labels
- *
- * Returns an array of taxonomies in the format "name => label" for use in a select field.
- *
- * @date 3/8/18
- * @since 5.7.2
- *
- * @param array $taxonomies Optional. An array of specific taxonomies to return.
- * @return array
- */
- function acf_get_taxonomy_labels( $taxonomies = array() ) {
- // default
- if ( empty( $taxonomies ) ) {
- $taxonomies = acf_get_taxonomies();
- }
- // vars
- $ref = array();
- $data = array();
- // loop
- foreach ( $taxonomies as $taxonomy ) {
- // vars
- $object = get_taxonomy( $taxonomy );
- $label = $object->labels->singular_name;
- // append
- $data[ $taxonomy ] = $label;
- // increase counter
- if ( ! isset( $ref[ $label ] ) ) {
- $ref[ $label ] = 0;
- }
- $ref[ $label ]++;
- }
- // show taxonomy name next to label for shared labels
- foreach ( $data as $taxonomy => $label ) {
- if ( $ref[ $label ] > 1 ) {
- $data[ $taxonomy ] .= ' (' . $taxonomy . ')';
- }
- }
- // return
- return $data;
- }
- /**
- * acf_get_term_title
- *
- * Returns the title for this term object.
- *
- * @date 10/9/18
- * @since 5.0.0
- *
- * @param object $term The WP_Term object.
- * @return string
- */
- function acf_get_term_title( $term ) {
- $title = $term->name;
- // Allow for empty name.
- if ( $title === '' ) {
- $title = __( '(no title)', 'acf' );
- }
- // Prepend ancestors indentation.
- if ( is_taxonomy_hierarchical( $term->taxonomy ) ) {
- $ancestors = get_ancestors( $term->term_id, $term->taxonomy );
- $title = str_repeat( '- ', count( $ancestors ) ) . $title;
- }
- return $title;
- }
- /**
- * acf_get_grouped_terms
- *
- * Returns an array of terms for the given query $args and groups by taxonomy name.
- *
- * @date 2/8/18
- * @since 5.7.2
- *
- * @param array $args An array of args used in the get_terms() function.
- * @return array
- */
- 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;
- }
- /**
- * _acf_terms_clauses
- *
- * Used in the 'terms_clauses' filter to order terms by taxonomy name.
- *
- * @date 2/8/18
- * @since 5.7.2
- *
- * @param array $pieces Terms query SQL clauses.
- * @param array $taxonomies An array of taxonomies.
- * @param array $args An array of terms query arguments.
- * @return array $pieces
- */
- function _acf_terms_clauses( $pieces, $taxonomies, $args ) {
- // prepend taxonomy to 'orderby' SQL
- if ( is_array( $taxonomies ) ) {
- $sql = "FIELD(tt.taxonomy,'" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "')";
- $pieces['orderby'] = str_replace( 'ORDER BY', "ORDER BY $sql,", $pieces['orderby'] );
- }
- // return
- return $pieces;
- }
- /**
- * acf_get_pretty_taxonomies
- *
- * Deprecated in favor of acf_get_taxonomy_labels() function.
- *
- * @date 7/10/13
- * @since 5.0.0
- * @deprecated 5.7.2
- */
- function acf_get_pretty_taxonomies( $taxonomies = array() ) {
- return acf_get_taxonomy_labels( $taxonomies );
- }
- /**
- * acf_get_term
- *
- * Similar to get_term() but with some extra functionality.
- *
- * @date 19/8/18
- * @since 5.7.3
- *
- * @param mixed $term_id The term ID or a string of "taxonomy:slug".
- * @param string $taxonomy The taxonomyname.
- * @return WP_Term
- */
- function acf_get_term( $term_id, $taxonomy = '' ) {
- // allow $term_id parameter to be a string of "taxonomy:slug" or "taxonomy:id"
- if ( is_string( $term_id ) && strpos( $term_id, ':' ) ) {
- list( $taxonomy, $term_id ) = explode( ':', $term_id );
- $term = get_term_by( 'slug', $term_id, $taxonomy );
- if ( $term ) {
- return $term;
- }
- }
- // return
- return get_term( $term_id, $taxonomy );
- }
- /**
- * acf_encode_term
- *
- * Returns a "taxonomy:slug" string for a given WP_Term.
- *
- * @date 27/8/18
- * @since 5.7.4
- *
- * @param WP_Term $term The term object.
- * @return string
- */
- function acf_encode_term( $term ) {
- return "{$term->taxonomy}:{$term->slug}";
- }
- /**
- * acf_decode_term
- *
- * Decodes a "taxonomy:slug" string into an array of taxonomy and slug.
- *
- * @date 27/8/18
- * @since 5.7.4
- *
- * @param WP_Term $term The term object.
- * @return string
- */
- function acf_decode_term( $string ) {
- if ( is_string( $string ) && strpos( $string, ':' ) ) {
- list( $taxonomy, $slug ) = explode( ':', $string );
- return compact( 'taxonomy', 'slug' );
- }
- return false;
- }
- /**
- * acf_get_encoded_terms
- *
- * Returns an array of WP_Term objects from an array of encoded strings
- *
- * @date 9/9/18
- * @since 5.7.5
- *
- * @param array $values The array of encoded strings.
- * @return array
- */
- function acf_get_encoded_terms( $values ) {
- // vars
- $terms = array();
- // loop over values
- foreach ( (array) $values as $value ) {
- // find term from string
- $term = acf_get_term( $value );
- // append
- if ( $term instanceof WP_Term ) {
- $terms[] = $term;
- }
- }
- // return
- return $terms;
- }
- /**
- * acf_get_choices_from_terms
- *
- * Returns an array of choices from the terms provided.
- *
- * @date 8/9/18
- * @since 5.7.5
- *
- * @param array $values and array of WP_Terms objects or encoded strings.
- * @param string $format The value format (term_id, slug).
- * @return array
- */
- function acf_get_choices_from_terms( $terms, $format = 'term_id' ) {
- // vars
- $groups = array();
- // get taxonomy lables
- $labels = acf_get_taxonomy_labels();
- // convert array of encoded strings to terms
- $term = reset( $terms );
- if ( ! $term instanceof WP_Term ) {
- $terms = acf_get_encoded_terms( $terms );
- }
- // loop over terms
- foreach ( $terms as $term ) {
- $group = $labels[ $term->taxonomy ];
- $choice = acf_get_choice_from_term( $term, $format );
- $groups[ $group ][ $choice['id'] ] = $choice['text'];
- }
- // return
- return $groups;
- }
- /**
- * acf_get_choices_from_grouped_terms
- *
- * Returns an array of choices from the grouped terms provided.
- *
- * @date 8/9/18
- * @since 5.7.5
- *
- * @param array $value A grouped array of WP_Terms objects.
- * @param string $format The value format (term_id, slug).
- * @return array
- */
- function acf_get_choices_from_grouped_terms( $value, $format = 'term_id' ) {
- // vars
- $groups = array();
- // loop over values
- foreach ( $value as $group => $terms ) {
- $groups[ $group ] = array();
- foreach ( $terms as $term_id => $term ) {
- $choice = acf_get_choice_from_term( $term, $format );
- $groups[ $group ][ $choice['id'] ] = $choice['text'];
- }
- }
- // return
- return $groups;
- }
- /**
- * acf_get_choice_from_term
- *
- * Returns an array containing the id and text for this item.
- *
- * @date 10/9/18
- * @since 5.7.6
- *
- * @param object $item The item object such as WP_Post or WP_Term.
- * @param string $format The value format (term_id, slug)
- * @return array
- */
- function acf_get_choice_from_term( $term, $format = 'term_id' ) {
- // vars
- $id = $term->term_id;
- $text = acf_get_term_title( $term );
- // return format
- if ( $format == 'slug' ) {
- $id = acf_encode_term( $term );
- }
- // return
- return array(
- 'id' => $id,
- 'text' => $text,
- );
- }
- /**
- * Returns a valid post_id string for a given term and taxonomy.
- * No longer needed since WP introduced the termmeta table in WP 4.4.
- *
- * @date 6/2/17
- * @since 5.5.6
- * @deprecated 5.9.2
- *
- * @param $taxonomy (string) The taxonomy type.
- * @param $term_id (int) The term ID.
- * @return (string)
- */
- function acf_get_term_post_id( $taxonomy, $term_id ) {
- _deprecated_function( __FUNCTION__, '5.9.2', 'string format term_%d' );
- return 'term_' . $term_id;
- }
|