From 19970f2e52950f60cd02c2b010f8d9e105be97ab Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Sun, 15 Oct 2023 11:09:22 -0500 Subject: [PATCH] Clean up groups in PodsMeta::groups_get() by removing duplicate fields only when using custom groups Fixes #6317 --- classes/PodsMeta.php | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/classes/PodsMeta.php b/classes/PodsMeta.php index a6a50fe194..4cf66c2aa0 100644 --- a/classes/PodsMeta.php +++ b/classes/PodsMeta.php @@ -1021,6 +1021,10 @@ public function groups_get( $type, $name, $default_fields = null, $full_objects } if ( $has_custom_groups ) { + // Clean up the dynamic groups to prevent duplicate fields showing. + $this->groups_cleanup( $groups, self::$groups[ $type ][ $name ] ); + + // Now add our custom groups to those dynamic groups. $groups = array_merge( $groups, self::$groups[ $type ][ $name ] ); } } elseif ( $has_custom_groups ) { @@ -1060,6 +1064,50 @@ public function groups_get( $type, $name, $default_fields = null, $full_objects return $groups; } + /** + * Clean up the groups to prevent duplicate fields from showing based on reference groups. + * + * @since 3.0.7 + * + * @param array $groups The groups to clean up. + * @param array $reference_groups The groups to reference for fields that take precedence. + */ + public function groups_cleanup( array &$groups, array &$reference_groups ) { + $found_fields = []; + + // Remove duplicates fields from reference groups. + foreach ( $reference_groups as $group_key => $reference_group ) { + $group_fields = wp_list_pluck( $reference_group['fields'], 'name' ); + + foreach ( $group_fields as $field_key => $field_name ) { + // Remove duplicate fields. + if ( isset( $found_fields[ $field_name ] ) ) { + unset( $reference_groups[ $group_key ]['fields'][ $field_key ] ); + + continue; + } + + $found_fields[ $field_name ] = true; + } + } + + // Remove duplicates fields from groups. + foreach ( $groups as $group_key => $group ) { + $group_fields = wp_list_pluck( $group['fields'], 'name' ); + + foreach ( $group_fields as $field_key => $field_name ) { + // Remove duplicate fields. + if ( isset( $found_fields[ $field_name ] ) ) { + unset( $groups[ $group_key ]['fields'][ $field_key ] ); + + continue; + } + + $found_fields[ $field_name ] = true; + } + } + } + /** * @param $post_type * @param null $post