A filter to force BuddyPress's group search to work on a word-wise basis, instead of on exact matches using multiple words. In other words: out of the box, searching for "American History" will not return a group called "American Military History"; after this change, it will.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Modify BuddyPress group search to work on a word-wise basis | |
*/ | |
function openlab_group_search_breakup( $sql, $s ) { | |
global $bp; | |
if ( ! empty( $s['search'] ) ) { | |
// Get the search terms | |
preg_match( '/%%([^%]+)%%/', $s['search'], $matches ); | |
if ( ! empty( $matches[1] ) ) { | |
$search_terms = explode( ' ', $matches[1] ); | |
// No need to continue if there's only one term - BP's | |
// default SQL will work fine | |
if ( 1 === count( $search_terms ) ) { | |
return $sql; | |
} | |
// Assemble the new search clause | |
$match_clauses = array(); | |
foreach ( $search_terms as $search_term ) { | |
$search_term_clean = esc_sql( like_escape( $search_term ) ); | |
$match_clauses[] = "( g.name LIKE '%%{$search_term_clean}%%' OR g.description LIKE '%%{$search_term_clean}%%' )"; | |
} | |
$search_clause = ' AND ( ' . implode( ' AND ', $match_clauses ) . ' )'; | |
// Swap out the search clause in the SQL string as well | |
// as the array (in case other plugins have modified, | |
// or are going to further modify, the query) | |
// | |
// Though, on second thought, doesn't matter much since | |
// the array is not passed by reference | |
$s['search'] = $search_clause; | |
$sql = preg_replace( '/AND \( g.name LIKE \'%%[^%]+%%\' OR g.description LIKE \'%%[^%]+%%\' \)/', $search_clause, $sql ); | |
} | |
} | |
return $sql; | |
} | |
add_filter( 'bp_groups_get_paged_groups_sql', 'openlab_group_search_breakup', 10, 2 ); | |
add_filter( 'bp_groups_get_total_groups_sql', 'openlab_group_search_breakup', 10, 2 ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment