Ticket #6418: member_type__not_in.diff
File member_type__not_in.diff, 7.8 KB (added by , 10 years ago) |
---|
-
src/bp-core/classes/class-bp-user-query.php
38 38 * override all others; BP User objects will be constructed using these 39 39 * IDs only. Default: false. 40 40 * @type array|string $member_type Array or comma-separated list of member types to limit results to. 41 * @type array|string $member_type__not_in Array or comma-separated list of member types that will be 42 * excluded from results. 41 43 * @type string|bool $meta_key Limit results to users that have usermeta associated with this meta_key. 42 44 * Usually used with $meta_value. Default: false. 43 45 * @type string|bool $meta_value When used with $meta_key, limits results to users whose usermeta value … … 166 168 'exclude' => false, 167 169 'user_ids' => false, 168 170 'member_type' => '', 171 'member_type__not_in' => '', 169 172 'meta_key' => false, 170 173 'meta_value' => false, 171 174 'xprofile_query' => false, … … 466 469 } 467 470 } 468 471 472 // Member type NOT IN. 473 if ( ! empty( $member_type__not_in ) ) { 474 $member_types__not_in = array(); 475 476 if ( ! is_array( $member_type__not_in ) ) { 477 $member_type__not_in = preg_split( '/[,\s+]/', $member_type__not_in ); 478 } 479 480 foreach ( $member_type__not_in as $mtni ) { 481 if ( ! bp_get_member_type_object( $mtni ) ) { 482 continue; 483 } 484 485 $member_types__not_in[] = $mtni; 486 } 487 if ( ! empty( $member_types__not_in ) ) { 488 $member_type__not_in_tq = new WP_Tax_Query( array( 489 array( 490 'taxonomy' => 'bp_member_type', 491 'field' => 'name', 492 'operator' => 'NOT IN', 493 'terms' => $member_types__not_in, 494 ), 495 ) ); 496 497 // Switch to the root blog, where member type taxonomies live. 498 $switched = false; 499 if ( ! bp_is_root_blog() ) { 500 switch_to_blog( bp_get_root_blog_id() ); 501 $switched = true; 502 } 503 504 $member_type__not_in_sql_clauses = $member_type__not_in_tq->get_sql( 'u', $this->uid_name ); 505 506 if ( $switched ) { 507 restore_current_blog(); 508 } 509 510 // Grab the first term_relationships clause and convert to a subquery. 511 if ( preg_match( '/term_taxonomy_id IN \([0-9, ]+\)/', $member_type__not_in_sql_clauses['where'], $matches ) ) { 512 $sql['where']['member_type__not_in'] = "u.{$this->uid_name} NOT IN ( SELECT object_id FROM $wpdb->term_relationships WHERE {$matches[0]} )"; 513 } elseif ( false !== strpos( $member_type__not_in_sql_clauses['where'], '0 = 1' ) ) { 514 $sql['where']['member_type__not_in'] = $this->no_results['where']; 515 } 516 } 517 } 518 469 519 // 'meta_key', 'meta_value' allow usermeta search 470 520 // To avoid global joins, do a separate query 471 521 if ( false !== $meta_key ) { -
src/bp-members/bp-members-functions.php
85 85 * @type string $meta_key Limit to users with a meta_key. Default: false. 86 86 * @type string $meta_value Limit to users with a meta_value (with meta_key). Default: false. 87 87 * @type array|string $member_type Array or comma-separated string of member types. 88 * @type array|string $member_type__not_in Array or comma-separated string of member types to be excluded 88 89 * @type mixed $include Limit results by user IDs. Default: false. 89 90 * @type int $per_page Results per page. Default: 20. 90 91 * @type int $page Page of results. Default: 1. … … 104 105 'meta_key' => false, // Limit to users who have this piece of usermeta 105 106 'meta_value' => false, // With meta_key, limit to users where usermeta matches this value 106 107 'member_type' => '', 108 'member_type__not_in' => '', 107 109 'include' => false, // Pass comma separated list of user_ids to limit to only these users 108 110 'per_page' => 20, // The number of results to return per page 109 111 'page' => 1, // The page to return if limiting per page -
src/bp-members/bp-members-template.php
289 289 * @param array $page_arg Optional. The string used as a query parameter in pagination links. 290 290 * Default: 'upage'. 291 291 * @param array|string $member_type Array or comma-separated string of member types to limit results to. 292 * @param array|string $member_type__not_in Array or comma-separated string of member types to exclude from results. 292 293 */ 293 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 = '' ) {294 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 = '', $member_type__not_in = '' ) { 294 295 295 296 $this->pag_arg = sanitize_key( $page_arg ); 296 297 $this->pag_page = bp_sanitize_pagination_arg( $this->pag_arg, $page_number ); … … 300 301 if ( !empty( $_REQUEST['letter'] ) ) 301 302 $this->members = BP_Core_User::get_users_by_letter( $_REQUEST['letter'], $this->pag_num, $this->pag_page, $populate_extras, $exclude ); 302 303 else 303 $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 ) );304 $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, 'member_type__not_in' => $member_type__not_in ) ); 304 305 305 306 if ( !$max || $max >= (int) $this->members['total'] ) 306 307 $this->total_member_count = (int) $this->members['total']; … … 494 495 * user. When on a user's Friends page, defaults to the ID of the 495 496 * displayed user. Otherwise defaults to 0. 496 497 * @type string|array $member_type Array or comma-separated list of member types to limit results to. 498 * @type string|array $member_type__not_in Array or comma-separated list of member types to exclude from results. 497 499 * @type string $search_terms Limit results by a search term. Default: null. 498 500 * @type string $meta_key Limit results by the presence of a usermeta key. 499 501 * Default: false. … … 539 541 540 542 'user_id' => $user_id, // Pass a user_id to only show friends of this user 541 543 'member_type' => $member_type, 544 'member_type__not_in' => '', 542 545 'search_terms' => null, // Pass search_terms to filter users by their profile data 543 546 544 547 'meta_key' => false, // Only return users with this usermeta … … 575 578 $r['meta_key'], 576 579 $r['meta_value'], 577 580 $r['page_arg'], 578 $r['member_type'] 581 $r['member_type'], 582 $r['member_type__not_in'] 579 583 ); 580 584 581 585 /**