Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
05/18/2022 05:32:26 AM (3 years ago)
Author:
imath
Message:

Improve group members count query performance

[13103] introduced a change in 10.0.0 that can be very time consuming when a group has a lot of members.

To keep the main improvements of the referenced commit (only refreshing group members count when a user joins or leaves a group) but optimize queries performance, we are introducing a new way to count group members in the BP_Group_Member_Query.

We are also introducing a way to defer group members count when adding a batch of members to a group. Using bp_groups_defer_group_members_count() avoids to refresh the count each time a member of this batch is added. For more information about how to use this function, you can have a look at how BuddyPress is using it into src/bp-groups/bp-groups-admin.php.

Props dd32, espellcaste

See #8688 (trunk)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-groups/bp-groups-functions.php

    r13195 r13280  
    36793679}
    36803680add_action( 'bp_init', 'bp_init_group_extensions', 11 );
     3681
     3682/**
     3683 * Updates a group members count when a user joined or left the group.
     3684 *
     3685 * @since 10.3.0
     3686 *
     3687 * @param BP_Groups_Member|int $groups_member The BP_Groups_Member object or the group member ID.
     3688 * @param int                  $group_id      The group's ID.
     3689 */
     3690function bp_groups_update_group_members_count( $groups_member, $group_id = 0 ) {
     3691    if ( $groups_member instanceof BP_Groups_Member ) {
     3692        $group_id = $groups_member->group_id;
     3693    }
     3694
     3695    BP_Groups_Member::refresh_total_member_count_for_group( (int) $group_id );
     3696}
     3697add_action( 'groups_member_after_save', 'bp_groups_update_group_members_count' );
     3698add_action( 'groups_member_after_remove', 'bp_groups_update_group_members_count' );
     3699add_action( 'bp_groups_member_after_delete', 'bp_groups_update_group_members_count', 10, 2 );
     3700
     3701/**
     3702 * Defers a group's counting to avoid updating it when batch adding/removing users to this group.
     3703 *
     3704 * @since 10.3.0
     3705 *
     3706 * @param bool $defer True to defer, false otherwise.
     3707 * @param int $group_id The group's ID.
     3708 */
     3709function bp_groups_defer_group_members_count( $defer = true, $group_id = 0 ) {
     3710    if ( $defer ) {
     3711        remove_action( 'groups_member_after_save', 'bp_groups_update_group_members_count' );
     3712        remove_action( 'groups_member_after_remove', 'bp_groups_update_group_members_count' );
     3713        remove_action( 'bp_groups_member_after_delete', 'bp_groups_update_group_members_count', 10, 2 );
     3714    } else {
     3715        add_action( 'groups_member_after_save', 'bp_groups_update_group_members_count' );
     3716        add_action( 'groups_member_after_remove', 'bp_groups_update_group_members_count' );
     3717        add_action( 'bp_groups_member_after_delete', 'bp_groups_update_group_members_count', 10, 2 );
     3718    }
     3719
     3720    if  ( $group_id ) {
     3721        bp_groups_update_group_members_count( 0, (int) $group_id );
     3722    }
     3723}
Note: See TracChangeset for help on using the changeset viewer.