Skip to:
Content

BuddyPress.org

Ticket #6210: 6210-bp_get_user_groups_alt-03192019.diff

File 6210-bp_get_user_groups_alt-03192019.diff, 5.6 KB (added by dcavins, 6 years ago)

Alternative approach to bp_get_user_groups() as suggested by Boone.

  • 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 $ 
    254254add_action( 'groups_member_before_save', 'bp_groups_clear_user_group_cache_on_membership_save' );
    255255add_action( 'groups_member_before_remove', 'bp_groups_clear_user_group_cache_on_membership_save' );
    256256
     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 */
     266function 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}
     273add_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 */
     283function 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}
     295add_action( 'bp_invitation_before_delete', 'bp_groups_clear_user_group_cache_on_invitation_change' );
     296add_action( 'bp_invitation_before_update', 'bp_groups_clear_user_group_cache_on_invitation_change' );
     297
    257298/**
    258299 * Clear group memberships cache on miscellaneous actions not covered by the 'after_save' hook.
    259300 *
  • 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() ) { 
    949949
    950950        $user_id = intval( $user_id );
    951951
     952        // Standard memberships
    952953        $membership_ids = wp_cache_get( $user_id, 'bp_groups_memberships_for_user' );
    953954        if ( false === $membership_ids ) {
    954955                $membership_ids = BP_Groups_Member::get_membership_ids_for_user( $user_id );
    function bp_get_user_groups( $user_id, $args = array() ) { 
    965966                }
    966967        }
    967968
     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
    9681008        // Assemble filter array for use in `wp_list_filter()`.
    9691009        $filters = wp_array_slice_assoc( $r, array( 'is_confirmed', 'is_banned', 'is_admin', 'is_mod', 'invite_sent' ) );
    9701010        foreach ( $filters as $filter_name => $filter_value ) {
    function bp_get_user_groups( $user_id, $args = array() ) { 
    10061046                $groups[ $group_id ] = $membership;
    10071047        }
    10081048
     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
    10091079        // By default, results are ordered by membership id.
    10101080        if ( 'group_id' === $r['orderby'] ) {
    10111081                ksort( $groups );