Bp_Search_Groups
BuddyPress Global Search – search groups class
Description
Source
File: bp-search/classes/class-bp-search-groups.php
class Bp_Search_Groups extends Bp_Search_Type { private $type = 'groups'; /** * Insures that only one instance of Class exists in memory at any * one time. Also prevents needing to define globals all over the place. * @since BuddyBoss 1.0.0 * * @return object Bp_Search_Groups */ public static function instance() { // Store the instance locally to avoid private static replication static $instance = null; // Only run these methods if they haven't been run previously if (null === $instance) { $instance = new Bp_Search_Groups(); } // Always return the instance return $instance; } /** * A dummy constructor to prevent this class from being loaded more than once. * * @since BuddyBoss 1.0.0 */ private function __construct() { /* Do nothing here */ } public function sql( $search_term, $only_totalrow_count=false ){ /* an example UNION query :- ----------------------------------------------------- ( SELECT DISTINCT g.id, 'groups' as type, g.name LIKE '%ho%' AS relevance, gm2.meta_value as entry_date FROM wp_bp_groups_groupmeta gm1, wp_bp_groups_groupmeta gm2, wp_bp_groups g WHERE 1=1 AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND ( g.name LIKE '%ho%' OR g.description LIKE '%ho%' ) ) ---------------------------------------------------- */ global $wpdb, $bp; $query_placeholder = array(); $sql = " SELECT "; if ( $only_totalrow_count ) { $sql .= " COUNT( DISTINCT g.id ) "; } else { $sql .= " DISTINCT g.id, 'groups' as type, g.name LIKE %s AS relevance, gm2.meta_value as entry_date "; $query_placeholder[] = '%'.$wpdb->esc_like( $search_term ).'%'; } $sql .= " FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name} g WHERE 1=1 AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND ( g.name LIKE %s OR g.description LIKE %s ) "; $query_placeholder[] = '%'.$wpdb->esc_like( $search_term ).'%'; $query_placeholder[] = '%'.$wpdb->esc_like( $search_term ).'%'; /** LOCATION AUTOCOMPLETE SEARCH ************************************************/ if (function_exists('bp_bpla') && 'yes' == bp_bpla()->option('enable-for-groups') ) { $split_search_term = explode(' ', $search_term ); $sql .= "OR g.id IN ( SELECT group_id FROM {$bp->groups->table_name_groupmeta} WHERE meta_key = 'bbgs_group_search_string' AND "; foreach ( $split_search_term as $k => $sterm ) { if ( $k == 0 ) { $sql .= "meta_value LIKE %s"; $query_placeholder[] = '%'.$wpdb->esc_like( $sterm ) . '%'; } else { $sql .= "AND meta_value LIKE %s"; $query_placeholder[] = '%'.$wpdb->esc_like( $sterm ) .'%'; } } $sql .= " ) "; } /** * Properly handle hidden groups. * For guest users - exclude all hidden groups. * For members - include only those hidden groups where current user is a member. * For admins - include all hidden groups ( do nothing extra ). * @since 1.1.0 */ if( is_user_logged_in() ){ if( !current_user_can( 'level_10' ) ){ //get all hidden groups where i am a member of $hidden_groups_sql = $wpdb->prepare( "SELECT DISTINCT gm.group_id FROM {$bp->groups->table_name_members} gm JOIN {$bp->groups->table_name} g ON gm.group_id = g.id WHERE gm.user_id = %d AND gm.is_confirmed = 1 AND gm.is_banned = 0 AND g.status='hidden' ", bp_loggedin_user_id() ); $hidden_groups_ids = $wpdb->get_col( $hidden_groups_sql ); if( empty( $hidden_groups_ids ) ){ $hidden_groups_ids = array( 99999999 );//arbitrarily large number } $hidden_groups_ids_csv = implode( ',', $hidden_groups_ids ); //either gruops which are not hidden, //or if hidden, only those where i am a member. $sql .= " AND ( g.status != 'hidden' OR g.id IN ( {$hidden_groups_ids_csv} ) ) "; } } else { $sql .= " AND g.status != 'hidden' "; } $sql = $wpdb->prepare( $sql, $query_placeholder ); return apply_filters( 'Bp_Search_Groups_sql', $sql, array( 'search_term' => $search_term, 'only_totalrow_count' => $only_totalrow_count, ) ); } protected function generate_html( $template_type='' ){ $group_ids = array(); foreach( $this->search_results['items'] as $item_id=>$item_html ){ $group_ids[] = $item_id; } //now we have all the posts //lets do a groups loop $args = array( 'include'=>$group_ids, 'per_page'=>count($group_ids), 'search_terms' => false ); if( is_user_logged_in() ){ $args['show_hidden'] = true; } if (function_exists('bp_bpla') ) { $args['search_terms'] = ' '; } do_action( 'bp_before_search_groups_html' ); if( bp_has_groups( $args ) ){ while ( bp_groups() ){ bp_the_group(); $result = array( 'id' => bp_get_group_id(), 'type' => $this->type, 'title' => bp_get_group_name(), 'html' => bp_search_buffer_template_part( 'loop/group', $template_type, false ), ); $this->search_results['items'][bp_get_group_id()] = $result; } } do_action( 'bp_after_search_groups_html' ); } }
Methods
- __construct — A dummy constructor to prevent this class from being loaded more than once.
- generate_html
- instance — Insures that only one instance of Class exists in memory at any one time. Also prevents needing to define globals all over the place.
- sql
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.