Ajouter un groupe de champs ACF selon la catégorie de premier niveau d’un article
Avec ACF il est possible de localiser un groupe de champs selon la catégorie de l’article, mais pas selon la catégorie parente de celle(s) sélectionnée(s).
Nous pouvons par exemple sélectionner un terme sans sélectionner son parent, et dans ce cas le groupe ACF ne sera pas affiché.
Pour remédier à cela, il est possible de déclarer une nouvelle règle de localisation, en étendant la classe native d’ACF.
Ici, nous affichons le groupe de champs selon la catégorie de premier niveau attachée aux termes sélectionnés :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
class Ancestor_Category_Location extends ACF_Location{ function initialize() { $this->name = 'ancestor_category'; $this->label = __("Ancestor category of post"); $this->category = 'post'; $this->public = true; $this->object_type = 'post'; } public static function get_operators( $rule ) { return array( '==' => __( "is equal to", 'acf' ), ); } public function get_values( $rule ) { $terms = get_terms(array( 'taxonomy' => 'category', 'hide_empty' => false, 'parent' => 0, )); $choices = array(); foreach($terms as $term){ $choices[$term->term_id] = $term->name; } return $choices; } public function get_object_subtype( $rule ) { return 'category'; } function match($rule, $screen, $field_group) { // Check screen args. if ( isset( $screen['post_id'] ) ) { $post_id = $screen['post_id']; } else { return false; } // Get WP_Term from rule value. $term = acf_get_term( $rule['value'], 'category' ); if ( ! $term || is_wp_error( $term ) ) { return false; } // Get terms connected to post. if ( isset( $screen['post_terms'] ) ) { $post_terms = acf_maybe_get( $screen['post_terms'], $term->taxonomy, array() ); } else { $post_terms = wp_get_post_terms( $post_id, $term->taxonomy, array( 'fields' => 'ids' ) ); } // If no post terms are found, and we are dealing with the "category" taxonomy, treat as default "Uncategorized" category. if ( ! $post_terms && $term->taxonomy == 'category' ) { $post_terms = array( 1 ); } $category_found = false; foreach( $post_terms as $term_id ){ // If is the term if( $term_id == $term->term_id ){ return true; } // If one ancestor is the term $ancestors_ids = get_ancestors( $term_id, 'category', 'taxonomy' ); if( in_array( $term->term_id, $ancestors_ids ) ){ return true; } } return false; } } |
Pour avoir accès à cette nouvelle règle de localisation, il vous faudra également l’enregistrer au hook acf/init
:
1 2 3 4 5 6 |
add_action('acf/init', 'my_acf_init_location_types'); function my_acf_init_location_types() { if( function_exists('acf_register_location_type') ) { acf_register_location_type( 'Ancestor_Category_Location' ); } } |