/**
 * Register our default taxonomies.
 *
 * @since 2.2.0
 */
function bp_register_default_taxonomies()
{
    // Member Type.
    register_taxonomy(bp_get_member_type_tax_name(), 'user', array('public' => false));
    // Email type.
    register_taxonomy(bp_get_email_tax_type(), bp_get_email_post_type(), apply_filters('bp_register_email_tax_type', array('description' => _x('BuddyPress email types', 'email type taxonomy description', 'buddypress'), 'labels' => bp_get_email_tax_type_labels(), 'meta_box_cb' => 'bp_email_tax_type_metabox', 'public' => false, 'query_var' => false, 'rewrite' => false, 'show_in_menu' => false, 'show_tagcloud' => false, 'show_ui' => bp_is_root_blog() && bp_current_user_can('bp_moderate'))));
}
/**
 * Pre-fetch member type data when initializing a Members loop.
 *
 * @since 2.2.0
 *
 * @param BP_User_Query $bp_user_query BP_User_Query object.
 */
function bp_members_prefetch_member_type(BP_User_Query $bp_user_query)
{
    $uncached_member_ids = bp_get_non_cached_ids($bp_user_query->user_ids, 'bp_member_member_type');
    $member_types = bp_get_object_terms($uncached_member_ids, bp_get_member_type_tax_name(), array('fields' => 'all_with_object_id'));
    // Rekey by user ID.
    $keyed_member_types = array();
    foreach ($member_types as $member_type) {
        if (!isset($keyed_member_types[$member_type->object_id])) {
            $keyed_member_types[$member_type->object_id] = array();
        }
        $keyed_member_types[$member_type->object_id][] = $member_type->name;
    }
    $cached_member_ids = array();
    foreach ($keyed_member_types as $user_id => $user_member_types) {
        wp_cache_set($user_id, $user_member_types, 'bp_member_member_type');
        $cached_member_ids[] = $user_id;
    }
    // Cache an empty value for users with no type.
    foreach (array_diff($uncached_member_ids, $cached_member_ids) as $no_type_id) {
        wp_cache_set($no_type_id, '', 'bp_member_member_type');
    }
}
 /**
  * Filter WP Admin users list table to include users of the specified type.
  *
  * @param WP_Query $query
  *
  * @since 2.7.0
  */
 public function users_table_filter_by_type($query)
 {
     global $pagenow;
     if (is_admin() && 'users.php' === $pagenow && !empty($_REQUEST['bp-member-type'])) {
         $type_slug = sanitize_text_field($_REQUEST['bp-member-type']);
         // Check that the type is registered.
         if (null == bp_get_member_type_object($type_slug)) {
             return;
         }
         // Get the list of users that are assigned to this member type.
         $type = bp_get_term_by('slug', $type_slug, bp_get_member_type_tax_name());
         if (empty($type->term_id)) {
             return;
         }
         $user_ids = bp_get_objects_in_term($type->term_id, bp_get_member_type_tax_name());
         if ($user_ids && !is_wp_error($user_ids)) {
             $query->set('include', (array) $user_ids);
         }
     }
 }
/**
 * Get type for a member.
 *
 * @since 2.2.0
 *
 * @param int  $user_id ID of the user.
 * @param bool $single  Optional. Whether to return a single type string. If multiple types are found
 *                      for the user, the oldest one will be returned. Default: true.
 * @return string|array|bool On success, returns a single member type (if $single is true) or an array of member
 *                           types (if $single is false). Returns false on failure.
 */
function bp_get_member_type($user_id, $single = true)
{
    $types = wp_cache_get($user_id, 'bp_member_member_type');
    if (false === $types) {
        $raw_types = bp_get_object_terms($user_id, bp_get_member_type_tax_name());
        if (!is_wp_error($raw_types)) {
            $types = array();
            // Only include currently registered group types.
            foreach ($raw_types as $mtype) {
                if (bp_get_member_type_object($mtype->name)) {
                    $types[] = $mtype->name;
                }
            }
            wp_cache_set($user_id, $types, 'bp_member_member_type');
        }
    }
    $type = false;
    if (!empty($types)) {
        if ($single) {
            $type = array_pop($types);
        } else {
            $type = $types;
        }
    }
    /**
     * Filters a user's member type(s).
     *
     * @since 2.2.0
     *
     * @param string $type    Member type.
     * @param int    $user_id ID of the user.
     * @param bool   $single  Whether to return a single type string, or an array.
     */
    return apply_filters('bp_get_member_type', $type, $user_id, $single);
}
 public function test_bp_get_member_type_should_not_return_unregistered_types()
 {
     $u1 = $this->factory->user->create();
     bp_register_member_type('foo');
     bp_set_member_type($u1, 'foo');
     // Directly set a type that hasn't been registered.
     bp_set_object_terms($u1, 'ugh', bp_get_member_type_tax_name(), true);
     $type = bp_get_member_type($u1, false);
     $this->assertEquals(array('foo'), $type);
 }
 /**
  * Get a SQL clause representing member_type include/exclusion.
  *
  * @since 2.4.0
  *
  * @param string|array $member_types Array or comma-separated list of member types.
  * @param string       $operator     'IN' or 'NOT IN'.
  * @return string
  */
 protected function get_sql_clause_for_member_types($member_types, $operator)
 {
     global $wpdb;
     // Sanitize.
     if ('NOT IN' !== $operator) {
         $operator = 'IN';
     }
     // Parse and sanitize types.
     if (!is_array($member_types)) {
         $member_types = preg_split('/[,\\s+]/', $member_types);
     }
     $types = array();
     foreach ($member_types as $mt) {
         if (bp_get_member_type_object($mt)) {
             $types[] = $mt;
         }
     }
     $tax_query = new WP_Tax_Query(array(array('taxonomy' => bp_get_member_type_tax_name(), 'field' => 'name', 'operator' => $operator, 'terms' => $types)));
     // Switch to the root blog, where member type taxonomies live.
     $site_id = bp_get_taxonomy_term_site_id(bp_get_member_type_tax_name());
     $switched = false;
     if ($site_id !== get_current_blog_id()) {
         switch_to_blog($site_id);
         $switched = true;
     }
     $sql_clauses = $tax_query->get_sql('u', $this->uid_name);
     $clause = '';
     // The no_results clauses are the same between IN and NOT IN.
     if (false !== strpos($sql_clauses['where'], '0 = 1')) {
         $clause = $this->no_results['where'];
         // The tax_query clause generated for NOT IN can be used almost as-is. We just trim the leading 'AND'.
     } elseif ('NOT IN' === $operator) {
         $clause = preg_replace('/^\\s*AND\\s*/', '', $sql_clauses['where']);
         // IN clauses must be converted to a subquery.
     } elseif (preg_match('/' . $wpdb->term_relationships . '\\.term_taxonomy_id IN \\([0-9, ]+\\)/', $sql_clauses['where'], $matches)) {
         $clause = "u.{$this->uid_name} IN ( SELECT object_id FROM {$wpdb->term_relationships} WHERE {$matches[0]} )";
     }
     if ($switched) {
         restore_current_blog();
     }
     return $clause;
 }