/** * 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; }