Skip to content

A LearnDash Groups Filter for the BuddyBoss/BuddyPress Members Directory

demo learndash group selector for buddypress members
demo learndash group selector for buddypress members

The ajax filters that BuddyBoss supplies for the Members Directory – profile type and sort order – are both undependable to the point of dysfunction and difficult to modify to the point of dyspepsia at least.

All that we wanted was a simple selector allowing us to return members of particular LearnDash groups when viewing the directory. Using the bp_ajax_query_string filter turned out to be the key, but understanding its peculiar behavior and invisible background relationship (or disrelationship) with Profile Search also turned out to be critical.

/**
 * Add Simple Group Selection Filter to Members Directory 
 * @not-todo writing as BuddyBoss or javascript filter too time-consuming for simple requirement 
 */
add_action( 'bp_before_members_loop', 'ckm_add_members_group_filter' ) ;
function ckm_add_members_group_filter() { 
	
	$group_ids = get_posts( array( 
		
		'numberposts' 	=> -1,
		'fields'	=> 'ids',
		'post_type'	=> 'groups',
		'orderby'	=> 'name',
		'order'		=> 'ASC'
	) ) ;
	
	$referer = $_SERVER['HTTP_REFERER'] ; //find Group ID at end of url ("referer") because BuddyPress member filters bypass "$_GET"
	if ( strpos( $referer, 'group_id' ) ) {
			
		$selected = absint( substr( $referer, strpos( $referer, "=" ) + 1 ) ) ; 
			
	}
	
	?>
	<div id="member-group-filters" class="component-filters clearfix">
		<div id="member-group__select" class="filter">
			<form name="Filter" method="GET" action="" id="members-groups__form" class="members-groups__form">
				<select id="member-groups" name="group_id" style="max-width: 200px">
					<option value=""><?php _e( 'All Groups', 'buddyboss' ); ?></option><?php
					foreach ( $group_ids as $group_id ) {
						$attr = '' ; 
						$group_name = get_the_title( $group_id ) ;
						if ( $selected === $group_id ) {
							$attr = 'selected' ;
						} 
						?>
						<option class="member-group" value="<?php echo esc_attr( $group_id ); ?>" <?php echo $attr ; ?>>
							<?php echo esc_attr( $group_name ); ?>
						</option>
						<?php
					}
					?>
				</select>
				<input class="member-group__submit" type="submit" value="&gt;">
			</form>
		</div>
	</div>
	
<?php

	//add priority 200 because bps-search.php member filter at 99 throws error due to include of an array, and because already using priority 100 for local site members-only filter
	add_filter( 'bp_ajax_querystring', 'ckm_modify_member_query_string', 200, 2 ) ; 
	
}
function ckm_modify_member_query_string( $ajax_query_string, $object ) {
	
	if ( 'members' === $object ) {
		
		$referer = $_SERVER['HTTP_REFERER'] ; //find Group ID at end of url ("referer") because BuddyPress member filters bypass "$_GET"
		if ( strpos( $referer, 'group_id' ) ) {
			
			$group_id = absint( substr( $referer, strpos( $referer, "=" ) + 1 ) ) ; 
			
			if ( $group_id ) {
				
				$user_ids = learndash_get_groups_user_ids( $group_id ) ;
				$args = array( 'include' => $user_ids ) ;
				
				return $args ; 
				
			}
			
		}
		
		remove_filter( 'bp_ajax_querystring', 'ckm_modify_member_query_string' ) ; //allow normal filters and bps-search to function
		
	}
	
	return $ajax_query_string ; 
	
}

Leave a Reply