Skip to:
Content

BuddyPress.org

Changeset 9210


Ignore:
Timestamp:
12/04/2014 01:47:49 AM (12 years ago)
Author:
boonebgorges
Message:

Introduce Member Types API.

BuddyPress member types are akin to WordPress's custom post types. Developers
can use bp_register_member_type() to register their types with BuddyPress,
and BP will automatically provide a number of pieces of functionality:

  • Mechanisms for storing and fetching member types (as a WP taxonomy term), with full cache support.
  • A 'member_type' argument for the bp_has_members()/BP_User_Query stack, which allows filtering member loops by member type.
  • Admin UI for changing member types on Dashboard > Users > Community Profile (appears when member types have been registered).

We'll continue to build out more core member type functionality in future
versions of BuddyPress. In the meantime, this is a good starting point for BP
site implementations to have a shared infrastructure for storing and retrieving
this data.

See #6006.

Location:
trunk
Files:
3 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-core/bp-core-actions.php

    r8610 r9210  
    6666 */
    6767add_action( 'bp_init', 'bp_core_set_uri_globals',    2  );
     68add_action( 'bp_init', 'bp_register_taxonomies',     3  );
    6869add_action( 'bp_init', 'bp_setup_globals',           4  );
    6970add_action( 'bp_init', 'bp_setup_canonical_stack',   5  );
  • trunk/src/bp-core/bp-core-classes.php

    r9178 r9210  
    3838 *                                              override all others; BP User objects will be constructed using these
    3939 *                                              IDs only. Default: false.
     40 *     @type array|string      $member_type     Array or comma-separated list of member types to limit results to.
    4041 *     @type string|bool       $meta_key        Limit results to users that have usermeta associated with this meta_key.
    4142 *                                              Usually used with $meta_value. Default: false.
     
    165166                                'exclude'         => false,
    166167                                'user_ids'        => false,
     168                                'member_type'     => '',
    167169                                'meta_key'        => false,
    168170                                'meta_value'      => false,
     
    400402                                $search_terms_space
    401403                        );
     404                }
     405
     406                // Member type.
     407                if ( ! empty( $member_type ) ) {
     408                        $member_types = array();
     409
     410                        if ( ! is_array( $member_type ) ) {
     411                                $member_type = preg_split( '/[,\s+]/', $member_type );
     412                        }
     413
     414                        foreach ( $member_type as $mt ) {
     415                                if ( ! bp_get_member_type_object( $mt ) ) {
     416                                        continue;
     417                                }
     418
     419                                $member_types[] = $mt;
     420                        }
     421
     422                        if ( ! empty( $member_types ) ) {
     423                                $member_type_tq = new WP_Tax_Query( array(
     424                                        array(
     425                                                'taxonomy' => 'bp_member_type',
     426                                                'field'    => 'name',
     427                                                'operator' => 'IN',
     428                                                'terms'    => $member_types,
     429                                        ),
     430                                ) );
     431
     432                                // Switch to the root blog, where member type taxonomies live.
     433                                switch_to_blog( bp_get_root_blog_id() );
     434
     435                                $member_type_sql_clauses = $member_type_tq->get_sql( 'u', $this->uid_name );
     436                                restore_current_blog();
     437
     438
     439                                // Grab the first term_relationships clause and convert to a subquery.
     440                                if ( preg_match( '/' . $wpdb->term_relationships . '\.term_taxonomy_id.*/', $member_type_sql_clauses['where'], $matches ) ) {
     441                                        $sql['where']['member_type'] = "u.{$this->uid_name} IN ( SELECT object_id FROM $wpdb->term_relationships WHERE {$matches[0]} )";
     442                                }
     443                        }
    402444                }
    403445
  • trunk/src/bp-core/bp-core-dependency.php

    r8610 r9210  
    3737function bp_setup_canonical_stack() {
    3838        do_action( 'bp_setup_canonical_stack' );
     39}
     40
     41/**
     42 * Fire the 'bp_register_taxonomies' action, where plugins should register taxonomies.
     43 *
     44 * @since BuddyPress (2.2.0)
     45 */
     46function bp_register_taxonomies() {
     47        do_action( 'bp_register_taxonomies' );
    3948}
    4049
  • trunk/src/bp-loader.php

    r9182 r9210  
    433433                require( $this->plugin_dir . 'bp-core/bp-core-options.php'    );
    434434                require( $this->plugin_dir . 'bp-core/bp-core-classes.php'    );
     435                require( $this->plugin_dir . 'bp-core/bp-core-taxonomy.php'   );
    435436                require( $this->plugin_dir . 'bp-core/bp-core-filters.php'    );
    436437                require( $this->plugin_dir . 'bp-core/bp-core-avatars.php'    );
  • trunk/src/bp-members/bp-members-admin.php

    r9190 r9210  
    186186                // Add user row actions for single site
    187187                add_filter( 'user_row_actions', array( $this, 'row_actions' ), 10, 2 );
     188
     189                // Process changes to member type.
     190                add_action( 'bp_members_admin_load', array( $this, 'process_member_type_update' ) );
    188191
    189192                /** Signups ***********************************************************/
     
    720723                        );
    721724
     725                        // Member Type metabox. Only added if member types have been registered.
     726                        $member_types = bp_get_member_types();
     727                        if ( ! empty( $member_types ) ) {
     728                                add_meta_box(
     729                                        'bp_members_admin_member_type',
     730                                        _x( 'Member Type', 'members user-admin edit screen', 'buddypress' ),
     731                                        array( $this, 'user_admin_member_type_metabox' ),
     732                                        get_current_screen()->id,
     733                                        'side',
     734                                        'core'
     735                                );
     736                        }
     737
    722738                        /**
    723739                         * Custom metabox ?
     
    9961012
    9971013                <?php
     1014        }
     1015
     1016        /**
     1017         * Render the Member Type metabox.
     1018         *
     1019         * @since BuddyPress (2.2.0)
     1020         * @access public
     1021         *
     1022         * @param WP_User $user The WP_User object to be edited.
     1023         */
     1024        public function user_admin_member_type_metabox( $user = null ) {
     1025
     1026                // Bail if no user ID.
     1027                if ( empty( $user->ID ) ) {
     1028                        return;
     1029                }
     1030
     1031                $types = bp_get_member_types( array(), 'objects' );
     1032                $current_type = bp_get_member_type( $user->ID );
     1033
     1034                /* translators: no option picked in select box */
     1035                $null_option = __( '----', 'buddypress' );
     1036
     1037                ?>
     1038                <select name="bp-members-profile-member-type">
     1039                        <option value="" <?php selected( '', $current_type ); ?>><?php esc_attr_e( $null_option ) ?></option>
     1040                        <?php foreach ( $types as $type ) : ?>
     1041                                <option value="<?php echo esc_attr( $type->name ) ?>" <?php selected( $type->name, $current_type ) ?>><?php echo esc_html( $type->labels['singular_name'] ) ?></option>
     1042                        <?php endforeach; ?>
     1043                </select>
     1044
     1045                <?php
     1046
     1047                wp_nonce_field( 'bp-member-type-change-' . $user->ID, 'bp-member-type-nonce' );
     1048        }
     1049
     1050        /**
     1051         * Process changes from the Member Type metabox.
     1052         *
     1053         * @since BuddyPress (2.2.0)
     1054         * @access public
     1055         */
     1056        public function process_member_type_update() {
     1057                if ( ! isset( $_POST['bp-member-type-nonce'] ) || ! isset( $_POST['bp-members-profile-member-type'] ) ) {
     1058                        return;
     1059                }
     1060
     1061                $user_id = $this->get_user_id();
     1062
     1063                check_admin_referer( 'bp-member-type-change-' . $user_id, 'bp-member-type-nonce' );
     1064
     1065                // Permission check.
     1066                if ( ! current_user_can( 'bp_moderate' ) && $user_id != bp_loggedin_user_id() ) {
     1067                        return;
     1068                }
     1069
     1070                // Member type string must either reference a valid member type, or be empty.
     1071                $member_type = stripslashes( $_POST['bp-members-profile-member-type'] );
     1072                if ( ! empty( $member_type ) && ! bp_get_member_type_object( $member_type ) ) {
     1073                        return;
     1074                }
     1075
     1076                /*
     1077                 * If an invalid member type is passed, someone's doing something
     1078                 * fishy with the POST request, so we can fail silently.
     1079                 */
     1080                if ( bp_set_member_type( $user_id, $member_type ) ) {
     1081                        // @todo Success messages can't be posted because other stuff happens on the pageload.
     1082                }
    9981083        }
    9991084
  • trunk/src/bp-members/bp-members-functions.php

    r9197 r9210  
    7979 *     Array of arguments. All are optional. See {@link BP_User_Query} for
    8080 *     a more complete description of arguments.
    81  *     @type string $type Sort order. Default: 'active'.
    82  *     @type int $user_id Limit results to friends of a user. Default: false.
    83  *     @type mixed $exclude IDs to exclude from results. Default: false.
    84  *     @type string $search_terms Limit to users matching search terms. Default: false.
    85  *     @type string $meta_key Limit to users with a meta_key. Default: false.
    86  *     @type string $meta_value Limit to users with a meta_value (with
    87  *           meta_key). Default: false.
     81 *     @type string       $type            Sort order. Default: 'active'.
     82 *     @type int          $user_id        Limit results to friends of a user. Default: false.
     83 *     @type mixed        $exclude        IDs to exclude from results. Default: false.
     84 *     @type string       $search_terms    Limit to users matching search terms. Default: false.
     85 *     @type string       $meta_key        Limit to users with a meta_key. Default: false.
     86 *     @type string       $meta_value      Limit to users with a meta_value (with meta_key). Default: false.
     87 *     @type array|string $member_type     Array or comma-separated string of member types.
    8888 *     @type mixed $include Limit results by user IDs. Default: false.
    89  *     @type int $per_page Results per page. Default: 20.
    90  *     @type int $page Page of results. Default: 1.
    91  *     @type bool $populate_extras Fetch optional extras. Default: true.
    92  *     @type string|bool $count_total How to do total user count.
    93  *           Default: 'count_query'.
     89 *     @type int          $per_page        Results per page. Default: 20.
     90 *     @type int          $page            Page of results. Default: 1.
     91 *     @type bool         $populate_extras Fetch optional extras. Default: true.
     92 *     @type string|bool  $count_total     How to do total user count. Default: 'count_query'.
    9493 * }
    9594 * @return array
     
    105104                'meta_key'        => false,        // Limit to users who have this piece of usermeta
    106105                'meta_value'      => false,        // With meta_key, limit to users where usermeta matches this value
     106                'member_type'     => '',
    107107                'include'         => false,        // Pass comma separated list of user_ids to limit to only these users
    108108                'per_page'        => 20,           // The number of results to return per page
     
    21492149}
    21502150add_action( 'login_form_bp-spam', 'bp_live_spammer_login_error' );
     2151
     2152/** Member Types *************************************************************/
     2153
     2154/**
     2155 * Register a member type.
     2156 *
     2157 * @since BuddyPress (2.2.0)
     2158 *
     2159 * @param string $member_type Unique string identifier for the member type.
     2160 * @param array  $args {
     2161 *     Array of arguments describing the member type.
     2162 *
     2163 *     @type array $labels {
     2164 *         Array of labels to use in various parts of the interface.
     2165 *
     2166 *         @type string $name          Default name. Should typically be plural.
     2167 *         @type string $singular_name Singular name.
     2168 *     }
     2169 * }
     2170 * @return object|WP_Error Member type object on success, WP_Error object on failure.
     2171 */
     2172function bp_register_member_type( $member_type, $args = array() ) {
     2173        $bp = buddypress();
     2174
     2175        if ( isset( $bp->members->types[ $member_type ] ) ) {
     2176                return new WP_Error( 'bp_member_type_exists', __( 'Member type already exists.', 'buddypress' ), $member_type );
     2177        }
     2178
     2179        $r = bp_parse_args( $args, array(
     2180                'labels' => array(),
     2181        ), 'register_member_type' );
     2182
     2183        $type = (object) $r;
     2184
     2185        // Store the post type name as data in the object (not just as the array key).
     2186        $type->name = $member_type;
     2187
     2188        // Make sure the relevant labels have been filled in.
     2189        $default_name = isset( $r['labels']['name'] ) ? $r['labels']['name'] : ucfirst( $type->name );
     2190        $r['labels'] = array_merge( array(
     2191                'name'          => $default_name,
     2192                'singular_name' => $default_name,
     2193        ), $r['labels'] );
     2194
     2195        $bp->members->types[ $member_type ] = $type;
     2196
     2197        /**
     2198         * Fires after a member type is registered.
     2199         *
     2200         * @since BuddyPress (2.2.0)
     2201         *
     2202         * @param string $member_type Member type identifier.
     2203         * @param object $type        Member type object.
     2204         */
     2205        do_action( 'bp_registered_member_type', $member_type, $type );
     2206
     2207        return $type;
     2208}
     2209
     2210/**
     2211 * Retrieve a member type object by name.
     2212 *
     2213 * @since BuddyPress (2.2.0)
     2214 *
     2215 * @param  string $post_type The name of the member type.
     2216 * @return object A member type object.
     2217 */
     2218function bp_get_member_type_object( $member_type ) {
     2219        $types = bp_get_member_types( array(), 'objects' );
     2220
     2221        if ( empty( $types[ $member_type ] ) ) {
     2222                return null;
     2223        }
     2224
     2225        return $types[ $member_type ];
     2226}
     2227
     2228/**
     2229 * Get a list of all registered member type objects.
     2230 *
     2231 * @since BuddyPress (2.2.0)
     2232 *
     2233 * @see bp_register_member_type() for accepted arguments.
     2234 *
     2235 * @param array|string $args     Optional. An array of key => value arguments to match against
     2236 *                               the member type objects. Default empty array.
     2237 * @param string       $output   Optional. The type of output to return. Accepts 'names'
     2238 *                               or 'objects'. Default 'names'.
     2239 * @param string       $operator Optional. The logical operation to perform. 'or' means only one
     2240 *                               element from the array needs to match; 'and' means all elements
     2241 *                               must match. Accepts 'or' or 'and'. Default 'and'.
     2242 * @return array A list of member type names or objects.
     2243 */
     2244function bp_get_member_types( $args = array(), $output = 'names', $operator = 'and' ) {
     2245        $types = buddypress()->members->types;
     2246
     2247        $field = 'names' == $output ? 'name' : false;
     2248
     2249        $types = wp_filter_object_list( $types, $args, $operator );
     2250
     2251        /**
     2252         * Filters the array of member type objects.
     2253         *
     2254         * This filter is run before the $output filter has been applied, so that
     2255         * filtering functions have access to the entire member type objects.
     2256         *
     2257         * @since BuddyPress (2.2.0)
     2258         *
     2259         * @param array  $types     Member type objects, keyed by name.
     2260         * @param array  $args      Array of key=>value arguments for filtering.
     2261         * @param string $operator 'or' to match any of $args, 'and' to require all.
     2262         */
     2263        $types = apply_filters( 'bp_get_member_types', $types, $args, $operator );
     2264
     2265        if ( 'names' === $output ) {
     2266                $types = wp_list_pluck( $types, 'name' );
     2267        }
     2268
     2269        return $types;
     2270}
     2271
     2272/**
     2273 * Set type for a member.
     2274 *
     2275 * @since BuddyPress (2.2.0)
     2276 *
     2277 * @param int    $user_id     ID of the user.
     2278 * @param string $member_type Member type.
     2279 * @param bool   $append      Optional. True to append this to existing types for user,
     2280 *                            false to replace. Default: false.
     2281 * @return See {@see bp_set_object_terms()}.
     2282 */
     2283function bp_set_member_type( $user_id, $member_type, $append = false ) {
     2284        // Pass an empty $member_type to remove a user's type.
     2285        if ( ! empty( $member_type ) && ! bp_get_member_type_object( $member_type ) ) {
     2286                return false;
     2287        }
     2288
     2289        $retval = bp_set_object_terms( $user_id, $member_type, 'bp_member_type', $append );
     2290
     2291        // Bust the cache if the type has been updated.
     2292        if ( ! is_wp_error( $retval ) ) {
     2293                wp_cache_delete( $user_id, 'bp_member_type' );
     2294
     2295                /**
     2296                 * Fires just after a user's member type has been changed.
     2297                 *
     2298                 * @since BuddyPress (2.2.0)
     2299                 *
     2300                 * @param int    $user_id     ID of the user whose member type has been updated.
     2301                 * @param string $member_type Member type.
     2302                 * @param bool   $append      Whether the type is being appended to existing types.
     2303                 */
     2304                do_action( 'bp_set_member_type', $user_id, $member_type, $append );
     2305        }
     2306
     2307        return $retval;
     2308}
     2309
     2310/**
     2311 * Get type for a member.
     2312 *
     2313 * @since BuddyPress (2.2.0)
     2314 *
     2315 * @param  int               $user_id ID of the user.
     2316 * @param  bool              $single  Optional. Whether to return a single type string. If multiple types are found
     2317 *                                    for the user, the oldest one will be returned. Default: true.
     2318 * @return string|array|bool On success, returns a single member type (if $single is true) or an array of member
     2319 *                           types (if $single is false). Returns false on failure.
     2320 */
     2321function bp_get_member_type( $user_id, $single = true ) {
     2322        $types = wp_cache_get( $user_id, 'bp_member_type' );
     2323
     2324        if ( false === $types ) {
     2325                $types = bp_get_object_terms( $user_id, 'bp_member_type'  );
     2326
     2327                if ( ! is_wp_error( $types ) ) {
     2328                        $types = wp_list_pluck( $types, 'name' );
     2329                        wp_cache_set( $user_id, $types, 'bp_member_type' );
     2330                }
     2331        }
     2332
     2333        $type = false;
     2334        if ( ! empty( $types ) ) {
     2335                if ( $single ) {
     2336                        $type = array_pop( $types );
     2337                } else {
     2338                        $type = $types;
     2339                }
     2340        }
     2341
     2342        /**
     2343         * Filters a user's member type(s).
     2344         *
     2345         * @since BuddyPress (2.2.0)
     2346         *
     2347         * @param string $type    Member type.
     2348         * @param int    $user_id ID of the user.
     2349         * @param bool   $single  Whether to return a single type string, or an array.
     2350         */
     2351        return apply_filters( 'bp_get_member_type', $type, $user_id, $single );
     2352}
     2353
     2354/**
     2355 * Delete a user's member type when the user when the user is deleted.
     2356 *
     2357 * @since BuddyPress (2.2.0)
     2358 *
     2359 * @param  int $user_id ID of the user.
     2360 * @return See {@see bp_set_member_type()}.
     2361 */
     2362function bp_remove_member_type_on_user_delete( $user_id ) {
     2363        return bp_set_member_type( $user_id, '' );
     2364}
     2365add_action( 'wpmu_delete_user', 'bp_remove_member_type_on_user_delete' );
     2366add_action( 'delete_user', 'bp_remove_member_type_on_user_delete' );
  • trunk/src/bp-members/bp-members-loader.php

    r8705 r9210  
    1212
    1313class BP_Members_Component extends BP_Component {
     14        /**
     15         * Member types.
     16         *
     17         * @see bp_register_member_type()
     18         *
     19         * @access public
     20         * @since  BuddyPress (2.2.0)
     21         * @var    array
     22         */
     23        public $types = array();
    1424
    1525        /**
     
    4656                        'template',
    4757                        'adminbar',
    48                         'functions'
     58                        'functions',
     59                        'cache',
    4960                );
    5061
  • trunk/src/bp-members/bp-members-template.php

    r9189 r9210  
    222222         * @see BP_User_Query for an in-depth description of parameters.
    223223         *
    224          * @param string $type Sort order.
    225          * @param int $page_number Page of results.
    226          * @param int $per_page Number of results per page.
    227          * @param int $max Max number of results to return.
    228          * @param int $user_id Limit to friends of a user.
    229          * @param string $search_terms Limit to users matching search terms.
    230          * @param array $include Limit results by these user IDs.
    231          * @param bool $populate_extras Fetch optional extras.
    232          * @param array $exclude Exclude these IDs from results.
    233          * @param array $meta_key Limit to users with a meta_key.
    234          * @param array $meta_value Limit to users with a meta_value (with meta_key).
    235          * @param array $page_arg Optional. The string used as a query
    236          *        parameter in pagination links. Default: 'upage'.
    237          */
    238         function __construct( $type, $page_number, $per_page, $max, $user_id, $search_terms, $include, $populate_extras, $exclude, $meta_key, $meta_value, $page_arg = 'upage' ) {
     224         * @param string       $type            Sort order.
     225         * @param int          $page_number     Page of results.
     226         * @param int          $per_page        Number of results per page.
     227         * @param int          $max             Max number of results to return.
     228         * @param int          $user_id         Limit to friends of a user.
     229         * @param string       $search_terms    Limit to users matching search terms.
     230         * @param array        $include         Limit results by these user IDs.
     231         * @param bool         $populate_extras Fetch optional extras.
     232         * @param array        $exclude         Exclude these IDs from results.
     233         * @param array        $meta_key        Limit to users with a meta_key.
     234         * @param array        $meta_value      Limit to users with a meta_value (with meta_key).
     235         * @param array        $page_arg        Optional. The string used as a query parameter in pagination links.
     236         *                                      Default: 'upage'.
     237         * @param array|string $member_type     Array or comma-separated string of member types to limit results to.
     238         */
     239        function __construct( $type, $page_number, $per_page, $max, $user_id, $search_terms, $include, $populate_extras, $exclude, $meta_key, $meta_value, $page_arg = 'upage', $member_type = '' ) {
    239240
    240241                $this->pag_page = !empty( $_REQUEST[$page_arg] ) ? intval( $_REQUEST[$page_arg] ) : (int) $page_number;
     
    245246                        $this->members = BP_Core_User::get_users_by_letter( $_REQUEST['letter'], $this->pag_num, $this->pag_page, $populate_extras, $exclude );
    246247                else
    247                         $this->members = bp_core_get_users( array( 'type' => $this->type, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'user_id' => $user_id, 'include' => $include, 'search_terms' => $search_terms, 'populate_extras' => $populate_extras, 'exclude' => $exclude, 'meta_key' => $meta_key, 'meta_value' => $meta_value ) );
     248                        $this->members = bp_core_get_users( array( 'type' => $this->type, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'user_id' => $user_id, 'include' => $include, 'search_terms' => $search_terms, 'populate_extras' => $populate_extras, 'exclude' => $exclude, 'meta_key' => $meta_key, 'meta_value' => $meta_value, 'member_type' => $member_type ) );
    248249
    249250                if ( !$max || $max >= (int) $this->members['total'] )
     
    399400 *     string (eg, 'user_id=4&per_page=3').
    400401 *
    401  *     @type int $type Sort order. 'active', 'random', 'newest', 'popular',
    402  *           'online', 'alphabetical'. Default: 'active'.
    403  *     @type int|bool $page Page of results to display. Default: 1.
    404  *     @type int|bool $per_page Number of results per page. Default: 20.
    405  *     @type int|bool $max Maximum number of results to return.
    406  *           Default: false (unlimited).
    407  *     @type string $page_arg The string used as a query parameter in
    408  *           pagination links. Default: 'bpage'.
    409  *     @type array|int|string|bool $include Limit results by a list of user
    410  *           IDs. Accepts an array, a single integer, a comma-separated list of
    411  *           IDs, or false (to disable this limiting). Default: false.
    412  *           'active', 'alphabetical', 'newest', or 'random'.
    413  *     @type array|int|string|bool $exclude Exclude users from results by ID.
    414  *           Accepts an array, a single integer, a comma-separated list of
    415  *           IDs, or false (to disable this limiting). Default: false.
    416  *     @type int $user_id If provided, results are limited to the friends of
    417  *           the specified user. When on a user's Friends page, defaults to
    418  *           the ID of the displayed user. Otherwise defaults to 0.
    419  *     @type string $search_terms Limit results by a search term. Default: null.
    420  *     @type string $meta_key Limit results by the presence of a usermeta key.
     402 *     @type int                   $type            Sort order. Accepts 'active', 'random', 'newest', 'popular',
     403 *                                                  'online', 'alphabetical'. Default: 'active'.
     404 *     @type int|bool              $page            Page of results to display. Default: 1.
     405 *     @type int|bool              $per_page        Number of results per page. Default: 20.
     406 *     @type int|bool              $max             Maximum number of results to return. Default: false (unlimited).
     407 *     @type string                $page_arg        The string used as a query parameter in pagination links.
     408 *                                                  Default: 'bpage'.
     409 *     @type array|int|string|bool $include         Limit results by a list of user IDs. Accepts an array, a
     410 *                                                  single integer, a comma-separated list of IDs, or false (to
     411 *                                                  disable this limiting). Accepts 'active', 'alphabetical',
     412 *                                                  'newest', or 'random'. Default: false.
     413 *     @type array|int|string|bool $exclude         Exclude users from results by ID. Accepts an array, a single
     414 *                                                  integer, a comma-separated list of IDs, or false (to disable
     415 *                                                  this limiting). Default: false.
     416 *     @type int                   $user_id         If provided, results are limited to the friends of the specified
     417 *                                                  user. When on a user's Friends page, defaults to the ID of the
     418 *                                                  displayed user. Otherwise defaults to 0.
     419 *     @type string|array          $member_type     Array or comma-separated list of member types to limit results to.
     420 *     @type string                $search_terms    Limit results by a search term. Default: null.
     421 *     @type string                $meta_key        Limit results by the presence of a usermeta key.
    421422 *           Default: false.
    422  *     @type mixed $meta_value When used with meta_key, limits results by the
     423 *     @type mixed                 $meta_value      When used with meta_key, limits results by the
    423424 *           a matching usermeta value. Default: false.
    424  *     @type bool $populate_extras Whether to fetch optional data, such as
     425 *     @type bool                  $populate_extras Whether to fetch optional data, such as
    425426 *           friend counts. Default: true.
    426427 * }
     
    451452
    452453                'user_id'         => $user_id, // Pass a user_id to only show friends of this user
     454                'member_type'     => '',
    453455                'search_terms'    => null,     // Pass search_terms to filter users by their profile data
    454456
     
    486488                $r['meta_key'],
    487489                $r['meta_value'],
    488                 $r['page_arg']
     490                $r['page_arg'],
     491                $r['member_type']
    489492        );
    490493
  • trunk/tests/phpunit/testcases/core/class-bp-user-query.php

    r9139 r9210  
    408408        }
    409409
     410        /**
     411         * @group member_types
     412         */
     413        public function test_member_type_single_value() {
     414                bp_register_member_type( 'foo' );
     415                bp_register_member_type( 'bar' );
     416                $users = $this->factory->user->create_many( 3 );
     417                bp_set_member_type( $users[0], 'foo' );
     418                bp_set_member_type( $users[1], 'bar' );
     419
     420                $q = new BP_User_Query( array(
     421                        'member_type' => 'bar',
     422                ) );
     423
     424                $found = array_values( wp_list_pluck( $q->results, 'ID' ) );
     425                $this->assertEquals( array( $users[1] ), $found );
     426        }
     427
     428        /**
     429         * @group member_types
     430         */
     431        public function test_member_type_array_with_single_value() {
     432                bp_register_member_type( 'foo' );
     433                bp_register_member_type( 'bar' );
     434                $users = $this->factory->user->create_many( 3 );
     435                bp_set_member_type( $users[0], 'foo' );
     436                bp_set_member_type( $users[1], 'bar' );
     437
     438                $q = new BP_User_Query( array(
     439                        'member_type' => array( 'bar' ),
     440                ) );
     441
     442                $found = array_values( wp_list_pluck( $q->results, 'ID' ) );
     443                $this->assertEquals( array( $users[1] ), $found );
     444        }
     445
     446        /**
     447         * @group member_types
     448         */
     449        public function test_member_type_comma_separated_values() {
     450                bp_register_member_type( 'foo' );
     451                bp_register_member_type( 'bar' );
     452                $users = $this->factory->user->create_many( 3 );
     453                bp_set_member_type( $users[0], 'foo' );
     454                bp_set_member_type( $users[1], 'bar' );
     455
     456                $q = new BP_User_Query( array(
     457                        'member_type' => 'foo, bar',
     458                ) );
     459
     460                $found = array_values( wp_list_pluck( $q->results, 'ID' ) );
     461                $this->assertEqualSets( array( $users[0], $users[1] ), $found );
     462        }
     463
     464        /**
     465         * @group member_types
     466         */
     467        public function test_member_type_array_with_multiple_values() {
     468                bp_register_member_type( 'foo' );
     469                bp_register_member_type( 'bar' );
     470                $users = $this->factory->user->create_many( 3 );
     471                bp_set_member_type( $users[0], 'foo' );
     472                bp_set_member_type( $users[1], 'bar' );
     473
     474                $q = new BP_User_Query( array(
     475                        'member_type' => array( 'foo', 'bar' ),
     476                ) );
     477
     478                $found = array_values( wp_list_pluck( $q->results, 'ID' ) );
     479                $this->assertEqualSets( array( $users[0], $users[1] ), $found );
     480        }
     481
     482        /**
     483         * @group member_types
     484         */
     485        public function test_member_type_comma_separated_values_should_discard_non_existent_taxonomies() {
     486                bp_register_member_type( 'foo' );
     487                bp_register_member_type( 'bar' );
     488                $users = $this->factory->user->create_many( 3 );
     489                bp_set_member_type( $users[0], 'foo' );
     490                bp_set_member_type( $users[1], 'bar' );
     491
     492                $q = new BP_User_Query( array(
     493                        'member_type' => 'foo, baz',
     494                ) );
     495
     496                $found = array_values( wp_list_pluck( $q->results, 'ID' ) );
     497                $this->assertEqualSets( array( $users[0] ), $found );
     498        }
     499
     500
     501        /**
     502         * @group cache
     503         * @group member_types
     504         */
     505        public function test_member_type_should_be_prefetched_into_cache_during_user_query() {
     506                bp_register_member_type( 'foo' );
     507                bp_register_member_type( 'bar' );
     508                $users = $this->factory->user->create_many( 4 );
     509                bp_set_member_type( $users[0], 'foo' );
     510                bp_set_member_type( $users[1], 'bar' );
     511                bp_set_member_type( $users[2], 'foo' );
     512
     513                $q = new BP_User_Query( array(
     514                        'include' => $users,
     515                ) );
     516
     517                $this->assertSame( 'foo', wp_cache_get( $users[0], 'bp_member_type' ) );
     518                $this->assertSame( 'bar', wp_cache_get( $users[1], 'bp_member_type' ) );
     519                $this->assertSame( 'foo', wp_cache_get( $users[2], 'bp_member_type' ) );
     520                $this->assertSame( '', wp_cache_get( $users[3], 'bp_member_type' ) );
     521        }
    410522}
  • trunk/tests/phpunit/testcases/members/template.php

    r9139 r9210  
    125125
    126126        /**
     127         * @group bp_has_members
     128         */
     129        public function test_bp_has_members_should_pass_member_type_param_to_query() {
     130                bp_register_member_type( 'foo' );
     131                bp_register_member_type( 'bar' );
     132                $users = $this->factory->user->create_many( 3 );
     133                bp_set_member_type( $users[0], 'foo' );
     134                bp_set_member_type( $users[1], 'bar' );
     135
     136                global $members_template;
     137                $old_members_template = $members_template;
     138
     139                bp_has_members( array(
     140                        'member_type' => 'bar',
     141                ) );
     142
     143                $members = is_array( $members_template->members ) ? array_values( $members_template->members ) : array();
     144                $member_ids = wp_list_pluck( $members, 'ID' );
     145                $this->assertEquals( array( $users[1]), $member_ids );
     146
     147                $GLOBALS['members_template'] = $old_members_template;
     148        }
     149
     150        /**
    127151         * @group bp_get_member_last_active
    128152         */
Note: See TracChangeset for help on using the changeset viewer.