BP_Groups_Group::get( array $args = array() )
Query for groups.
Description
See also
- WP_Meta_Query::queries: for a description of the ‘meta_query’ parameter format.
Parameters
- $args
-
(Optional) Array of parameters. All items are optional.
- 'type'
(string) Optional. Shorthand for certain orderby/order combinations. 'newest', 'active', 'popular', 'alphabetical', 'random'. When present, will override orderby and order params. Default: null. - 'orderby'
(string) Optional. Property to sort by. 'date_created', 'last_activity', 'total_member_count', 'name', 'random', 'meta_id'. Default: 'date_created'. - 'order'
(string) Optional. Sort order. 'ASC' or 'DESC'. Default: 'DESC'. - 'per_page'
(int) Optional. Number of items to return per page of results. Default: null (no limit). - 'page'
(int) Optional. Page offset of results to return. Default: null (no limit). - 'user_id'
(int) Optional. If provided, results will be limited to groups of which the specified user is a member. Default: null. - 'slug'
(array|string) Optional. Array or comma-separated list of group slugs to limit results to. Default: false. - 'search_terms'
(string) Optional. If provided, only groups whose names or descriptions match the search terms will be returned. Allows specifying the wildcard position using a '*' character before or after the string or both. Works in concert with $search_columns. Default: false. - 'search_columns'
(string) Optional. If provided, only apply the search terms to the specified columns. Works in concert with $search_terms. Default: empty array. - 'group_type'
(array|string) Array or comma-separated list of group types to limit results to. - 'group_type__in'
(array|string) Array or comma-separated list of group types to limit results to. - 'group_type__not_in'
(array|string) Array or comma-separated list of group types that will be excluded from results. - 'meta_query'
(array) Optional. An array of meta_query conditions. See WP_Meta_Query::queries for description. - 'value'
(array|string) Optional. Array or comma-separated list of group IDs. Results will be limited to groups within the list. Default: false. - 'parent_id'
(array|string) Optional. Array or comma-separated list of group IDs. Results will be limited to children of the specified groups. Default: null. - 'exclude'
(array|string) Optional. Array or comma-separated list of group IDs. Results will exclude the listed groups. Default: false. - 'update_meta_cache'
(bool) Whether to pre-fetch groupmeta for the returned groups. Default: true. - 'update_admin_cache'
(bool) Whether to pre-fetch administrator IDs for the returned groups. Default: false. - 'show_hidden'
(bool) Whether to include hidden groups in results. Default: false. - 'status'
(array|string) Optional. Array or comma-separated list of group statuses to limit results to. If specified, $show_hidden is ignored. Default: empty array. - 'fields'
(string) Which fields to return. Specify 'ids' to fetch a list of IDs. Default: 'all' (return BP_Groups_Group objects). If set, meta and admin caches will not be prefetched.
Default value: array()
- 'type'
Return
(array)
- 'groups'
(array) Array of group objects returned by the paginated query. (IDs only iffields
is set toids
.) - 'total'
(int) Total count of all groups matching non- paginated query params.
Source
File: bp-groups/classes/class-bp-groups-group.php
public static function get( $args = array() ) { global $wpdb; // Backward compatibility with old method of passing arguments. if ( ! is_array( $args ) || func_num_args() > 1 ) { _deprecated_argument( __METHOD__, '1.7', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddyboss' ), __METHOD__, __FILE__ ) ); $old_args_keys = array( 0 => 'type', 1 => 'per_page', 2 => 'page', 3 => 'user_id', 4 => 'search_terms', 5 => 'include', 6 => 'populate_extras', 7 => 'exclude', 8 => 'show_hidden', ); $args = bp_core_parse_args_array( $old_args_keys, func_get_args() ); } $defaults = array( 'type' => null, 'orderby' => 'date_created', 'order' => 'DESC', 'per_page' => null, 'page' => null, 'user_id' => 0, 'slug' => array(), 'search_terms' => false, 'search_columns' => array(), 'group_type' => '', 'group_type__in' => '', 'group_type__not_in' => '', 'meta_query' => false, 'include' => false, 'parent_id' => null, 'update_meta_cache' => true, 'update_admin_cache' => false, 'exclude' => false, 'show_hidden' => false, 'status' => array(), 'fields' => 'all', ); $r = bp_parse_args( $args, $defaults, 'bp_groups_group_get' ); $bp = buddypress(); $sql = array( 'select' => "SELECT DISTINCT g.id", 'from' => "{$bp->groups->table_name} g", 'where' => '', 'orderby' => '', 'pagination' => '', ); if ( ! empty( $r['user_id'] ) ) { $sql['from'] .= " JOIN {$bp->groups->table_name_members} m ON ( g.id = m.group_id )"; } $where_conditions = array(); if ( ! empty( $r['status'] ) ) { if ( ! is_array( $r['status'] ) ) { $r['status'] = preg_split( '/[\s,]+/', $r['status'] ); } $r['status'] = array_map( 'sanitize_title', $r['status'] ); $status_in = "'" . implode( "','", $r['status'] ) . "'"; $where_conditions['status'] = "g.status IN ({$status_in})"; } elseif ( empty( $r['show_hidden'] ) ) { $where_conditions['hidden'] = "g.status != 'hidden'"; } if ( ! empty( $r['slug'] ) ) { if ( ! is_array( $r['slug'] ) ) { $r['slug'] = preg_split( '/[\s,]+/', $r['slug'] ); } $r['slug'] = array_map( 'sanitize_title', $r['slug'] ); $slug_in = "'" . implode( "','", $r['slug'] ) . "'"; $where_conditions['slug'] = "g.slug IN ({$slug_in})"; } $search = ''; if ( isset( $r['search_terms'] ) ) { $search = trim( $r['search_terms'] ); } if ( $search ) { $leading_wild = ( ltrim( $search, '*' ) != $search ); $trailing_wild = ( rtrim( $search, '*' ) != $search ); if ( $leading_wild && $trailing_wild ) { $wild = 'both'; } elseif ( $leading_wild ) { $wild = 'leading'; } elseif ( $trailing_wild ) { $wild = 'trailing'; } else { // Default is to wrap in wildcard characters. $wild = 'both'; } $search = trim( $search, '*' ); $searches = array(); $leading_wild = ( 'leading' == $wild || 'both' == $wild ) ? '%' : ''; $trailing_wild = ( 'trailing' == $wild || 'both' == $wild ) ? '%' : ''; $wildcarded = $leading_wild . bp_esc_like( $search ) . $trailing_wild; $search_columns = array( 'name', 'description' ); if ( $r['search_columns'] ) { $search_columns = array_intersect( $r['search_columns'], $search_columns ); } foreach ( $search_columns as $search_column ) { $searches[] = $wpdb->prepare( "$search_column LIKE %s", $wildcarded ); } $where_conditions['search'] = '(' . implode(' OR ', $searches) . ')'; } $meta_query_sql = self::get_meta_query_sql( $r['meta_query'] ); if ( ! empty( $meta_query_sql['join'] ) ) { $sql['from'] .= $meta_query_sql['join']; } if ( ! empty( $meta_query_sql['where'] ) ) { $where_conditions['meta'] = $meta_query_sql['where']; } // Only use 'group_type__in', if 'group_type' is not set. if ( empty( $r['group_type'] ) && ! empty( $r['group_type__in']) ) { $r['group_type'] = $r['group_type__in']; } // Group types to exclude. This has priority over inclusions. if ( ! empty( $r['group_type__not_in'] ) ) { $group_type_clause = self::get_sql_clause_for_group_types( $r['group_type__not_in'], 'NOT IN' ); // Group types to include. } elseif ( ! empty( $r['group_type'] ) ) { $group_type_clause = self::get_sql_clause_for_group_types( $r['group_type'], 'IN' ); } if ( ! empty( $group_type_clause ) ) { $where_conditions['group_type'] = $group_type_clause; } if ( ! empty( $r['user_id'] ) ) { $where_conditions['user'] = $wpdb->prepare( "m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $r['user_id'] ); } if ( ! empty( $r['include'] ) ) { $include = implode( ',', wp_parse_id_list( $r['include'] ) ); $where_conditions['include'] = "g.id IN ({$include})"; } if ( ! is_null( $r['parent_id'] ) ) { // For legacy reasons, `false` means groups with no parent. if ( false === $r['parent_id'] ) { $parent_id = 0; } else { $parent_id = implode( ',', wp_parse_id_list( $r['parent_id'] ) ); } $where_conditions['parent_id'] = "g.parent_id IN ({$parent_id})"; } if ( ! empty( $r['exclude'] ) ) { $exclude = implode( ',', wp_parse_id_list( $r['exclude'] ) ); $where_conditions['exclude'] = "g.id NOT IN ({$exclude})"; } /* Order/orderby ********************************************/ $order = $r['order']; $orderby = $r['orderby']; // If a 'type' parameter was passed, parse it and overwrite // 'order' and 'orderby' params passed to the function. if ( ! empty( $r['type'] ) ) { /** * Filters the 'type' parameter used to overwrite 'order' and 'orderby' values. * * @since BuddyPress 2.1.0 * * @param array $value Converted 'type' value for order and orderby. * @param string $value Parsed 'type' value for the get method. */ $order_orderby = apply_filters( 'bp_groups_get_orderby', self::convert_type_to_order_orderby( $r['type'] ), $r['type'] ); // If an invalid type is passed, $order_orderby will be // an array with empty values. In this case, we stick // with the default values of $order and $orderby. if ( ! empty( $order_orderby['order'] ) ) { $order = $order_orderby['order']; } if ( ! empty( $order_orderby['orderby'] ) ) { $orderby = $order_orderby['orderby']; } } // 'total_member_count' and 'last_activity' sorts require additional table joins. if ( 'total_member_count' === $orderby ) { $sql['from'] .= " JOIN {$bp->groups->table_name_groupmeta} gm_total_member_count ON ( g.id = gm_total_member_count.group_id )"; $where_conditions['total_member_count'] = "gm_total_member_count.meta_key = 'total_member_count'"; } elseif ( 'last_activity' === $orderby ) { $sql['from'] .= " JOIN {$bp->groups->table_name_groupmeta} gm_last_activity on ( g.id = gm_last_activity.group_id )"; $where_conditions['last_activity'] = "gm_last_activity.meta_key = 'last_activity'"; } // If 'meta_id' is the requested order, and there's no meta query, fall back to the default. if ( 'meta_id' === $orderby && empty( $meta_query_sql['join'] ) ) { $orderby = 'date_created'; } // Sanitize 'order'. $order = bp_esc_sql_order( $order ); /** * Filters the converted 'orderby' term. * * @since BuddyPress 2.1.0 * * @param string $value Converted 'orderby' term. * @param string $orderby Original orderby value. * @param string $value Parsed 'type' value for the get method. */ $orderby = apply_filters( 'bp_groups_get_orderby_converted_by_term', self::convert_orderby_to_order_by_term( $orderby ), $orderby, $r['type'] ); // Random order is a special case. if ( 'rand()' === $orderby ) { $sql['orderby'] = "ORDER BY rand()"; } else { $sql['orderby'] = "ORDER BY {$orderby} {$order}"; } if ( ! empty( $r['per_page'] ) && ! empty( $r['page'] ) && $r['per_page'] != -1 ) { $sql['pagination'] = $wpdb->prepare( "LIMIT %d, %d", intval( ( $r['page'] - 1 ) * $r['per_page']), intval( $r['per_page'] ) ); } $where = ''; if ( ! empty( $where_conditions ) ) { $sql['where'] = implode( ' AND ', $where_conditions ); $where = "WHERE {$sql['where']}"; } $paged_groups_sql = "{$sql['select']} FROM {$sql['from']} {$where} {$sql['orderby']} {$sql['pagination']}"; /** * Filters the pagination SQL statement. * * @since BuddyPress 1.5.0 * * @param string $value Concatenated SQL statement. * @param array $sql Array of SQL parts before concatenation. * @param array $r Array of parsed arguments for the get method. */ $paged_groups_sql = apply_filters( 'bp_groups_get_paged_groups_sql', $paged_groups_sql, $sql, $r ); $cached = bp_core_get_incremented_cache( $paged_groups_sql, 'bp_groups' ); if ( false === $cached ) { $paged_group_ids = $wpdb->get_col( $paged_groups_sql ); bp_core_set_incremented_cache( $paged_groups_sql, 'bp_groups', $paged_group_ids ); } else { $paged_group_ids = $cached; } if ( 'ids' === $r['fields'] ) { // We only want the IDs. $paged_groups = array_map( 'intval', $paged_group_ids ); } else { $uncached_group_ids = bp_get_non_cached_ids( $paged_group_ids, 'bp_groups' ); if ( $uncached_group_ids ) { $group_ids_sql = implode( ',', array_map( 'intval', $uncached_group_ids ) ); $group_data_objects = $wpdb->get_results( "SELECT g.* FROM {$bp->groups->table_name} g WHERE g.id IN ({$group_ids_sql})" ); foreach ( $group_data_objects as $group_data_object ) { wp_cache_set( $group_data_object->id, $group_data_object, 'bp_groups' ); } } $paged_groups = array(); foreach ( $paged_group_ids as $paged_group_id ) { $paged_groups[] = new BP_Groups_Group( $paged_group_id ); } $group_ids = array(); foreach ( (array) $paged_groups as $group ) { $group_ids[] = $group->id; } // Grab all groupmeta. if ( ! empty( $r['update_meta_cache'] ) ) { bp_groups_update_meta_cache( $group_ids ); } // Prefetch all administrator IDs, if requested. if ( $r['update_admin_cache'] ) { BP_Groups_Member::prime_group_admins_mods_cache( $group_ids ); } // Set up integer properties needing casting. $int_props = array( 'id', 'creator_id', 'enable_forum' ); // Integer casting. foreach ( $paged_groups as $key => $g ) { foreach ( $int_props as $int_prop ) { $paged_groups[ $key ]->{$int_prop} = (int) $paged_groups[ $key ]->{$int_prop}; } } } // Find the total number of groups in the results set. $total_groups_sql = "SELECT COUNT(DISTINCT g.id) FROM {$sql['from']} $where"; /** * Filters the SQL used to retrieve total group results. * * @since BuddyPress 1.5.0 * * @param string $t_sql Concatenated SQL statement used for retrieving total group results. * @param array $total_sql Array of SQL parts for the query. * @param array $r Array of parsed arguments for the get method. */ $total_groups_sql = apply_filters( 'bp_groups_get_total_groups_sql', $total_groups_sql, $sql, $r ); $cached = bp_core_get_incremented_cache( $total_groups_sql, 'bp_groups' ); if ( false === $cached ) { $total_groups = (int) $wpdb->get_var( $total_groups_sql ); bp_core_set_incremented_cache( $total_groups_sql, 'bp_groups', $total_groups ); } else { $total_groups = (int) $cached; } return array( 'groups' => $paged_groups, 'total' => $total_groups ); }
Changelog
Version | Description |
---|---|
BuddyPress 1.6.0 | Introduced. |
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.