Ticket #6210: 6210-bp_get_user_groups_alt-03192019.diff
File 6210-bp_get_user_groups_alt-03192019.diff, 5.6 KB (added by , 6 years ago) |
---|
-
src/bp-groups/bp-groups-cache.php
diff --git src/bp-groups/bp-groups-cache.php src/bp-groups/bp-groups-cache.php index c0465cf89..87f57e121 100644
function bp_groups_clear_user_group_cache_on_membership_save( BP_Groups_Member $ 254 254 add_action( 'groups_member_before_save', 'bp_groups_clear_user_group_cache_on_membership_save' ); 255 255 add_action( 'groups_member_before_remove', 'bp_groups_clear_user_group_cache_on_membership_save' ); 256 256 257 /** 258 * Clear caches on saving a group invitation or request. 259 * The save action is called when inserting a new record or using the save() method 260 * to update an existing record. 261 * 262 * @since 5.0.0 263 * 264 * @param BP_Invitation object $invitation Characteristics of the invitation just saved. 265 */ 266 function bp_groups_clear_user_group_cache_on_invitation_save( BP_Invitation $invitation ) { 267 if ( sanitize_key( 'BP_Groups_Invitation_Manager' ) !== $invitation->class ) { 268 return; 269 } 270 271 wp_cache_delete( $invitation->id, 'bp_groups_invitations_as_memberships' ); 272 } 273 add_action( 'bp_invitation_after_save', 'bp_groups_clear_user_group_cache_on_invitation_save', 10, 2 ); 274 275 /** 276 * Clear caches on invitation deletion or update. 277 * This also catches changes like sending an invite or marking one as accepted. 278 * 279 * @since 5.0.0 280 * 281 * @param array $args Associative array of columns/values describing invitations about to be deleted. 282 */ 283 function bp_groups_clear_user_group_cache_on_invitation_change( $args ) { 284 // Will the delete request act on invitations? 285 if ( empty( $args['class'] ) || 'BP_Groups_Invitation_Manager' !== $args['class'] ) { 286 return; 287 } 288 289 $args['fields' ] = 'ids'; 290 $affected_invitation_ids = groups_get_invites( $args ); 291 foreach ( $affected_invitation_ids as $invitation_id ) { 292 wp_cache_delete( $invitation_id, 'bp_groups_invitations_as_memberships' ); 293 } 294 } 295 add_action( 'bp_invitation_before_delete', 'bp_groups_clear_user_group_cache_on_invitation_change' ); 296 add_action( 'bp_invitation_before_update', 'bp_groups_clear_user_group_cache_on_invitation_change' ); 297 257 298 /** 258 299 * Clear group memberships cache on miscellaneous actions not covered by the 'after_save' hook. 259 300 * -
src/bp-groups/bp-groups-functions.php
diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php index f697d1154..374585525 100644
function bp_get_user_groups( $user_id, $args = array() ) { 949 949 950 950 $user_id = intval( $user_id ); 951 951 952 // Standard memberships 952 953 $membership_ids = wp_cache_get( $user_id, 'bp_groups_memberships_for_user' ); 953 954 if ( false === $membership_ids ) { 954 955 $membership_ids = BP_Groups_Member::get_membership_ids_for_user( $user_id ); … … function bp_get_user_groups( $user_id, $args = array() ) { 965 966 } 966 967 } 967 968 969 // Prime the invitations- and requests-as-memberships cache 970 $invitation_ids = array(); 971 if ( true !== $r['is_confirmed'] || false !== $r['invite_sent'] ) { 972 $invitation_ids = groups_get_invites( array( 973 'user_id' => $user_id, 974 'invite_sent' => 'all', 975 'type' => 'all', 976 'fields' => 'ids' 977 ) ); 978 979 // Prime the invitations cache. 980 $uncached_invitation_ids = bp_get_non_cached_ids( $invitation_ids, 'bp_groups_invitations_as_memberships' ); 981 982 $uncached_invitations = groups_get_invites( array( 983 'ids' => $uncached_invitation_ids, 984 'invite_sent' => 'all', 985 'type' => 'all' 986 ) ); 987 foreach ( $uncached_invitations as $uncached_invitation ) { 988 // Reshape the result as a membership db entry. 989 $invitation = new StdClass; 990 $invitation->id = $uncached_invitation->id; 991 $invitation->group_id = $uncached_invitation->item_id; 992 $invitation->user_id = $uncached_invitation->user_id; 993 $invitation->inviter_id = $uncached_invitation->inviter_id; 994 $invitation->is_admin = false; 995 $invitation->is_mod = false; 996 $invitation->user_title = ''; 997 $invitation->date_modified = $uncached_invitation->date_modified; 998 $invitation->comments = $uncached_invitation->content; 999 $invitation->is_confirmed = false; 1000 $invitation->is_banned = false; 1001 $invitation->invite_sent = $uncached_invitation->invite_sent; 1002 wp_cache_set( $uncached_invitation->id, $invitation, 'bp_groups_invitations_as_memberships' ); 1003 } 1004 1005 } 1006 1007 968 1008 // Assemble filter array for use in `wp_list_filter()`. 969 1009 $filters = wp_array_slice_assoc( $r, array( 'is_confirmed', 'is_banned', 'is_admin', 'is_mod', 'invite_sent' ) ); 970 1010 foreach ( $filters as $filter_name => $filter_value ) { … … function bp_get_user_groups( $user_id, $args = array() ) { 1006 1046 $groups[ $group_id ] = $membership; 1007 1047 } 1008 1048 1049 // Populate group invitations array from cache, and normalize. 1050 foreach ( $invitation_ids as $invitation_id ) { 1051 $invitation = wp_cache_get( $invitation_id, 'bp_groups_invitations_as_memberships' ); 1052 1053 // Sanity check. 1054 if ( ! isset( $invitation->group_id ) ) { 1055 continue; 1056 } 1057 1058 // Integer values. 1059 foreach ( $int_keys as $index ) { 1060 $invitation->{$index} = intval( $invitation->{$index} ); 1061 } 1062 1063 // Boolean values. 1064 foreach ( $bool_keys as $index ) { 1065 $invitation->{$index} = (bool) $invitation->{$index}; 1066 } 1067 1068 foreach ( $filters as $filter_name => $filter_value ) { 1069 if ( ! isset( $invitation->{$filter_name} ) || $filter_value != $invitation->{$filter_name} ) { 1070 continue 2; 1071 } 1072 } 1073 1074 $group_id = (int) $invitation->group_id; 1075 1076 $groups[ $group_id ] = $invitation; 1077 } 1078 1009 1079 // By default, results are ordered by membership id. 1010 1080 if ( 'group_id' === $r['orderby'] ) { 1011 1081 ksort( $groups );