
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=">">
</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 ;
}
