Ticket #6418: member_type__not_in_3.diff
File member_type__not_in_3.diff, 15.4 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__in Array or comma-separated list of member types to limit results to. 42 * @type array|string $member_type__not_in Array or comma-separated list of member types that will be 43 * excluded from results. 41 44 * @type string|bool $meta_key Limit results to users that have usermeta associated with this meta_key. 42 45 * Usually used with $meta_value. Default: false. 43 46 * @type string|bool $meta_value When used with $meta_key, limits results to users whose usermeta value … … 166 169 'exclude' => false, 167 170 'user_ids' => false, 168 171 'member_type' => '', 172 'member_type__in' => '', 173 'member_type__not_in' => '', 169 174 'meta_key' => false, 170 175 'meta_value' => false, 171 176 'xprofile_query' => false, … … 418 423 ); 419 424 } 420 425 421 // Member type. 422 if ( ! empty( $member_type ) ) { 426 // If member_type is empty and member_type__in has a value asign 427 // member_type__in to member_type 428 if ( empty( $member_type ) && ! empty( $member_type__in ) ) { 429 $member_type = $member_type__in; 430 } 431 432 // Member types. 433 if ( ! empty( $member_type ) || ! empty( $member_type__not_in ) ) { 423 434 $member_types = array(); 435 $member_types__not_in = array(); 424 436 425 437 if ( ! is_array( $member_type ) ) { 426 438 $member_type = preg_split( '/[,\s+]/', $member_type ); 427 439 } 440 if ( ! is_array( $member_type__not_in ) ) { 441 $member_type__not_in = preg_split( '/[,\s+]/', $member_type__not_in ); 442 } 428 443 429 444 foreach ( $member_type as $mt ) { 430 445 if ( ! bp_get_member_type_object( $mt ) ) { … … 433 448 434 449 $member_types[] = $mt; 435 450 } 451 foreach ( $member_type__not_in as $mtni ) { 452 if ( ! bp_get_member_type_object( $mtni ) ) { 453 continue; 454 } 436 455 456 $member_types__not_in[] = $mtni; 457 } 458 437 459 if ( ! empty( $member_types ) ) { 438 $member_type_tq = new WP_Tax_Query( array( 439 array( 440 'taxonomy' => 'bp_member_type', 441 'field' => 'name', 442 'operator' => 'IN', 443 'terms' => $member_types, 444 ), 460 $member_type_tq = array( 461 'taxonomy' => 'bp_member_type', 462 'field' => 'name', 463 'operator' => 'IN', 464 'terms' => $member_types, 465 ); 466 } 467 if ( ! empty( $member_types__not_in ) ) { 468 $member_type__not_in_tq = array( 469 'taxonomy' => 'bp_member_type', 470 'field' => 'name', 471 'operator' => 'NOT IN', 472 'terms' => $member_types__not_in, 473 ); 474 } 475 476 if ( isset( $member_type_tq ) || isset( $member_type__not_in_tq ) ) { 477 $member_type_query = new WP_Tax_Query( array( 478 isset( $member_type_tq ) ? $member_type_tq : '', 479 isset( $member_type__not_in_tq ) ? $member_type__not_in_tq : '', 445 480 ) ); 446 481 447 482 // Switch to the root blog, where member type taxonomies live. … … 451 486 $switched = true; 452 487 } 453 488 454 $member_type_sql_clauses = $member_type_ tq->get_sql( 'u', $this->uid_name );489 $member_type_sql_clauses = $member_type_query->get_sql( 'u', $this->uid_name ); 455 490 456 491 if ( $switched ) { 457 492 restore_current_blog(); … … 463 498 } elseif ( false !== strpos( $member_type_sql_clauses['where'], '0 = 1' ) ) { 464 499 $sql['where']['member_type'] = $this->no_results['where']; 465 500 } 501 if ( preg_match( '/WHERE term_taxonomy_id IN \([0-9, ]+\)/', $member_type_sql_clauses['where'], $matches ) ) { 502 $sql['where']['member_type__not_in'] = "u.{$this->uid_name} NOT IN ( SELECT object_id FROM $wpdb->term_relationships {$matches[0]} )"; 503 } elseif ( false !== strpos( $member_type_sql_clauses['where'], '0 = 1' ) ) { 504 $sql['where']['member_type__not_in'] = $this->no_results['where']; 505 } 466 506 } 467 507 } 468 508 -
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__in Array or comma-separated string of member types. 89 * @type array|string $member_type__not_in Array or comma-separated string of member types to be excluded 88 90 * @type mixed $include Limit results by user IDs. Default: false. 89 91 * @type int $per_page Results per page. Default: 20. 90 92 * @type int $page Page of results. Default: 1. … … 104 106 'meta_key' => false, // Limit to users who have this piece of usermeta 105 107 'meta_value' => false, // With meta_key, limit to users where usermeta matches this value 106 108 'member_type' => '', 109 'member_type__in' => '', 110 'member_type__not_in' => '', 107 111 'include' => false, // Pass comma separated list of user_ids to limit to only these users 108 112 'per_page' => 20, // The number of results to return per page 109 113 '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__in Array or comma-separated string of member types to limit results to. 293 * @param array|string $member_type__not_in Array or comma-separated string of member types to exclude from results. 292 294 */ 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 = '' ) {295 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__in = '', $member_type__not_in = '' ) { 294 296 295 297 $this->pag_arg = sanitize_key( $page_arg ); 296 298 $this->pag_page = bp_sanitize_pagination_arg( $this->pag_arg, $page_number ); … … 300 302 if ( !empty( $_REQUEST['letter'] ) ) 301 303 $this->members = BP_Core_User::get_users_by_letter( $_REQUEST['letter'], $this->pag_num, $this->pag_page, $populate_extras, $exclude ); 302 304 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 ) );305 $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__in' => $member_type__in, 'member_type__not_in' => $member_type__not_in ) ); 304 306 305 307 if ( !$max || $max >= (int) $this->members['total'] ) 306 308 $this->total_member_count = (int) $this->members['total']; … … 494 496 * user. When on a user's Friends page, defaults to the ID of the 495 497 * displayed user. Otherwise defaults to 0. 496 498 * @type string|array $member_type Array or comma-separated list of member types to limit results to. 499 * @type string|array $member_type__in Array or comma-separated list of member types to limit results to. 500 * @type string|array $member_type__not_in Array or comma-separated list of member types to exclude from results. 497 501 * @type string $search_terms Limit results by a search term. Default: null. 498 502 * @type string $meta_key Limit results by the presence of a usermeta key. 499 503 * Default: false. … … 539 543 540 544 'user_id' => $user_id, // Pass a user_id to only show friends of this user 541 545 'member_type' => $member_type, 546 'member_type__in' => '', 547 'member_type__not_in' => '', 542 548 'search_terms' => null, // Pass search_terms to filter users by their profile data 543 549 544 550 'meta_key' => false, // Only return users with this usermeta … … 575 581 $r['meta_key'], 576 582 $r['meta_value'], 577 583 $r['page_arg'], 578 $r['member_type'] 584 $r['member_type'], 585 $r['member_type__in'], 586 $r['member_type__not_in'] 579 587 ); 580 588 581 589 /** -
tests/phpunit/testcases/core/class-bp-user-query.php
499 499 } 500 500 501 501 /** 502 * @group member_types 503 */ 504 public function test_member_type__in_single_value() { 505 bp_register_member_type( 'foo' ); 506 bp_register_member_type( 'bar' ); 507 $users = $this->factory->user->create_many( 3 ); 508 bp_set_member_type( $users[0], 'foo' ); 509 bp_set_member_type( $users[1], 'bar' ); 510 511 $q = new BP_User_Query( array( 512 'member_type__in' => 'bar', 513 ) ); 514 515 $found = array_values( wp_list_pluck( $q->results, 'ID' ) ); 516 $this->assertEquals( array( $users[1] ), $found ); 517 } 518 519 /** 520 * @group member_types 521 */ 522 public function test_member_type__in_array_with_single_value() { 523 bp_register_member_type( 'foo' ); 524 bp_register_member_type( 'bar' ); 525 $users = $this->factory->user->create_many( 3 ); 526 bp_set_member_type( $users[0], 'foo' ); 527 bp_set_member_type( $users[1], 'bar' ); 528 529 $q = new BP_User_Query( array( 530 'member_type__in' => array( 'bar' ), 531 ) ); 532 533 $found = array_values( wp_list_pluck( $q->results, 'ID' ) ); 534 $this->assertEquals( array( $users[1] ), $found ); 535 } 536 537 /** 538 * @group member_types 539 */ 540 public function test_member_type__in_comma_separated_values() { 541 bp_register_member_type( 'foo' ); 542 bp_register_member_type( 'bar' ); 543 $users = $this->factory->user->create_many( 3 ); 544 bp_set_member_type( $users[0], 'foo' ); 545 bp_set_member_type( $users[1], 'bar' ); 546 547 $q = new BP_User_Query( array( 548 'member_type__in' => 'foo, bar', 549 ) ); 550 551 $found = array_values( wp_list_pluck( $q->results, 'ID' ) ); 552 $this->assertEqualSets( array( $users[0], $users[1] ), $found ); 553 } 554 555 /** 556 * @group member_types 557 */ 558 public function test_member_type__in_array_with_multiple_values() { 559 bp_register_member_type( 'foo' ); 560 bp_register_member_type( 'bar' ); 561 $users = $this->factory->user->create_many( 3 ); 562 bp_set_member_type( $users[0], 'foo' ); 563 bp_set_member_type( $users[1], 'bar' ); 564 565 $q = new BP_User_Query( array( 566 'member_type__in' => array( 'foo', 'bar' ), 567 ) ); 568 569 $found = array_values( wp_list_pluck( $q->results, 'ID' ) ); 570 $this->assertEqualSets( array( $users[0], $users[1] ), $found ); 571 } 572 573 /** 574 * @group member_types 575 */ 576 public function test_member_type__in_comma_separated_values_should_discard_non_existent_taxonomies() { 577 bp_register_member_type( 'foo' ); 578 bp_register_member_type( 'bar' ); 579 $users = $this->factory->user->create_many( 3 ); 580 bp_set_member_type( $users[0], 'foo' ); 581 bp_set_member_type( $users[1], 'bar' ); 582 583 $q = new BP_User_Query( array( 584 'member_type__in' => 'foo, baz', 585 ) ); 586 587 $found = array_values( wp_list_pluck( $q->results, 'ID' ) ); 588 $this->assertEqualSets( array( $users[0] ), $found ); 589 } 590 591 /** 592 * @group member_types 593 */ 594 public function test_should_return_no_results_when_no_users_match_the_specified_member_type__in() { 595 bp_register_member_type( 'foo' ); 596 $users = $this->factory->user->create_many( 3 ); 597 598 $q = new BP_User_Query( array( 599 'member_type__in' => 'foo, baz', 600 ) ); 601 602 $this->assertEmpty( $q->results ); 603 } 604 605 /** 606 * @group member_types 607 */ 608 public function test_member_type_should_take_precedence_over_member_type__in() { 609 bp_register_member_type( 'foo' ); 610 bp_register_member_type( 'bar' ); 611 $users = $this->factory->user->create_many( 3 ); 612 bp_set_member_type( $users[0], 'foo' ); 613 bp_set_member_type( $users[1], 'bar' ); 614 615 $q = new BP_User_Query( array( 616 'member_type__in' => 'foo', 617 'member_type' => 'bar' 618 ) ); 619 620 $found = array_values( wp_list_pluck( $q->results, 'ID' ) ); 621 $this->assertEqualSets( array( $users[1] ), $found ); 622 } 623 624 /** 625 * @group member_types 626 */ 627 public function test_member_type__not_in_returns_members_from_other_types_and_members_with_no_types() { 628 bp_register_member_type( 'foo' ); 629 bp_register_member_type( 'bar' ); 630 $users = $this->factory->user->create_many( 3 ); 631 bp_set_member_type( $users[0], 'foo' ); 632 bp_set_member_type( $users[1], 'bar' ); 633 634 $q = new BP_User_Query( array( 635 'member_type__not_in' => 'foo', 636 ) ); 637 638 $found = array_values( wp_list_pluck( $q->results, 'ID' ) ); 639 $this->assertEqualSets( array( $users[1], $users[2] ), $found ); 640 } 641 642 /** 643 * @group member_types 644 */ 645 public function test_should_return_no_results_when_all_users_match_the_specified_member_type__not_in() { 646 bp_register_member_type( 'foo' ); 647 $users = $this->factory->user->create_many( 3 ); 648 bp_set_member_type( $users[0], 'foo' ); 649 bp_set_member_type( $users[1], 'foo' ); 650 bp_set_member_type( $users[2], 'foo' ); 651 652 $q = new BP_User_Query( array( 653 'member_type__not_in' => 'foo', 654 ) ); 655 656 $this->assertEmpty( $q->results ); 657 } 658 659 /** 660 * @group member_types 661 */ 662 public function test_member_type__not_in_takes_precedence_over_member_type() { 663 bp_register_member_type( 'foo' ); 664 $users = $this->factory->user->create_many( 3 ); 665 bp_set_member_type( $users[0], 'foo' ); 666 bp_set_member_type( $users[1], 'foo' ); 667 bp_set_member_type( $users[2], 'foo' ); 668 669 $q = new BP_User_Query( array( 670 'member_type__not_in' => 'foo', 671 'member_type' => 'foo' 672 ) ); 673 674 $this->assertEmpty( $q->results ); 675 } 676 677 /** 678 * @group member_types 679 */ 680 public function test_member_type__not_in_takes_precedence_over_member_type__in() { 681 bp_register_member_type( 'foo' ); 682 $users = $this->factory->user->create_many( 3 ); 683 bp_set_member_type( $users[0], 'foo' ); 684 bp_set_member_type( $users[1], 'foo' ); 685 bp_set_member_type( $users[2], 'foo' ); 686 687 $q = new BP_User_Query( array( 688 'member_type__not_in' => 'foo', 689 'member_type__in' => 'foo' 690 ) ); 691 692 $this->assertEmpty( $q->results ); 693 } 694 695 /** 502 696 * @group cache 503 697 * @group member_types 504 698 */