Ticket #22212: 22212.3.patch
File 22212.3.patch, 6.7 KB (added by , 9 years ago) |
---|
-
src/wp-includes/user.php
504 504 if ( empty( $this->query_vars ) || ! empty( $query ) ) { 505 505 $this->query_limit = null; 506 506 $this->query_vars = wp_parse_args( $query, array( 507 'blog_id' => $GLOBALS['blog_id'],508 'role' => '',509 'meta_key' => '',510 'meta_value' => '',511 'meta_compare' => '',512 'include' => array(),513 'exclude' => array(),514 'search' => '',507 'blog_id' => $GLOBALS['blog_id'], 508 'role' => array(), 509 'meta_key' => '', 510 'meta_value' => '', 511 'meta_compare' => '', 512 'include' => array(), 513 'exclude' => array(), 514 'search' => '', 515 515 'search_columns' => array(), 516 'orderby' => 'login',517 'order' => 'ASC',518 'offset' => '',519 'number' => '',520 'count_total' => true,521 'fields' => 'all',522 'who' => ''516 'orderby' => 'login', 517 'order' => 'ASC', 518 'offset' => '', 519 'number' => '', 520 'count_total' => true, 521 'fields' => 'all', 522 'who' => '' 523 523 ) ); 524 524 } 525 525 … … 652 652 $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query 653 653 } 654 654 655 $role = ''; 656 if ( isset( $qv['role'] ) ) 657 $role = trim( $qv['role'] ); 655 $roles = array(); 658 656 659 if ( $blog_id && ( $role || is_multisite() ) ) { 660 $cap_meta_query = array(); 661 $cap_meta_query['key'] = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities'; 662 663 if ( $role ) { 664 $cap_meta_query['value'] = '"' . $role . '"'; 665 $cap_meta_query['compare'] = 'like'; 657 if ( isset( $qv['role'] ) ) { 658 if ( is_array( $qv['role'] ) ) { 659 $roles = $qv['role']; 660 } elseif ( is_string( $qv['role'] ) && ! empty( $qv['role'] ) ) { 661 $roles = array( $qv['role'] ); 666 662 } 663 } 667 664 665 if ( $blog_id && ( ! empty( $roles ) || is_multisite() ) ) { 666 667 if ( ! empty( $roles ) ) { 668 $from = ''; 669 $where = ' AND ( '; 670 $roles_count = count( $roles ); 671 672 for ( $i = 0; $i < $roles_count; $i ++ ) { 673 674 $alias = 'role_meta' . $i; 675 $from .= " INNER JOIN {$wpdb->usermeta} AS {$alias} ON ({$wpdb->users}.ID = {$alias}.user_id)"; 676 677 if ( $i > 0 ) { 678 $where .= ' OR'; 679 } 680 681 $where .= " ( ({$alias}.meta_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities' AND CAST({$alias}.meta_value AS CHAR) LIKE '%\"{$roles[$i]}\"%' ) )"; 682 683 } 684 $where .= ' )'; 685 686 $this->query_from .= $from; 687 $this->query_where .= $where; 688 $this->query_fields = 'DISTINCT ' . $wpdb->users . '.*'; 689 690 } 691 668 692 if ( empty( $qv['meta_query'] ) || ! in_array( $cap_meta_query, $qv['meta_query'], true ) ) { 669 693 $qv['meta_query'][] = $cap_meta_query; 670 694 } 671 695 } 672 696 697 // Add Multisite/Network check 698 if ( is_multisite() ) { 699 $from = " INNER JOIN wp_usermeta AS network_meta ON (wp_users.ID = network_meta.user_id)"; 700 $where = " AND ( (network_meta.meta_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities' ) )"; 701 } 702 673 703 $meta_query = new WP_Meta_Query(); 674 704 $meta_query->parse_query_vars( $qv ); 675 705 -
tests/phpunit/tests/user/query.php
137 137 $query->prepare_query(); 138 138 $this->assertEquals( $_query_vars, $query->query_vars ); 139 139 } 140 141 /** 142 * @ticket 22212 143 */ 144 function test_get_single_role_by_user_query() { 145 $this->factory->user->create_many( 2, array( 146 'role' => 'subscriber' 147 ) ); 148 149 $wp_user_search = new WP_User_Query( array( 'role' => 'subscriber' ) ); 150 $users = $wp_user_search->get_results(); 151 $this->assertEquals( 2, count( $users ) ); 152 } 153 154 /** 155 * @ticket 22212 156 */ 157 function test_get_multiple_roles_by_user_query() { 158 $this->factory->user->create_many( 2, array( 159 'role' => 'subscriber' 160 ) ); 161 162 $this->factory->user->create_many( 3, array( 163 'role' => 'editor' 164 ) ); 165 166 $wp_user_search = new WP_User_Query( array( 'role' => array( 'subscriber', 'editor' ) ) ); 167 $users = $wp_user_search->get_results(); 168 $this->assertEquals( 5, count( $users ) ); 169 } 170 171 /** 172 * @ticket 22212 173 */ 174 function test_get_single_role_by_string() { 175 $this->factory->user->create_many( 2, array( 176 'role' => 'subscriber' 177 ) ); 178 179 $users = get_users( array( 180 'role' => 'subscriber' 181 ) ); 182 183 $this->assertEquals( 2, count( $users ) ); 184 } 185 186 /** 187 * @ticket 22212 188 */ 189 function test_get_single_role_by_array() { 190 $this->factory->user->create_many( 2, array( 191 'role' => 'subscriber' 192 ) ); 193 194 $users = get_users( array( 195 'role' => array( 'subscriber' ) 196 ) ); 197 198 $this->assertEquals( 2, count( $users ) ); 199 } 200 201 /** 202 * @ticket 22212 203 */ 204 function test_get_multiple_roles() { 205 $this->factory->user->create_many( 2, array( 206 'role' => 'subscriber' 207 ) ); 208 209 $this->factory->user->create_many( 3, array( 210 'role' => 'editor' 211 ) ); 212 213 $this->factory->user->create_many( 2, array( 214 'role' => 'administrator' 215 ) ); 216 217 $users = new WP_User_Query( array( 'role' => array( 'subscriber', 'editor' ) ) ); 218 $users = $users->get_results(); 219 220 $this->assertEquals( 5, count( $users ) ); 221 foreach ( $users as $user ) { 222 $this->assertInstanceOf( 'WP_User', $user ); 223 } 224 } 225 226 /** 227 * @ticket 22212 228 */ 229 function test_get_multiple_roles_with_meta() { 230 231 // Create administrator user + meta 232 $administrator_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); 233 update_user_meta( $administrator_id, 'mk1', 1 ); 234 update_user_meta( $administrator_id, 'mk2', 1 ); 235 236 // Create editor user + meta 237 $editor_id = $this->factory->user->create( array( 'role' => 'editor' ) ); 238 update_user_meta( $editor_id, 'mk1', 1 ); 239 update_user_meta( $editor_id, 'mk2', 2 ); 240 241 // Create subscriber user + meta 242 $subscriber_id = $this->factory->user->create( array( 'role' => 'subscriber' ) ); 243 update_user_meta( $subscriber_id, 'mk1', 1 ); 244 update_user_meta( $subscriber_id, 'mk2', 1 ); 245 246 // Fetch users 247 $users = get_users( array( 248 'role' => array( 'administrator', 'editor', 'subscriber' ), 249 'meta_query' => array( 250 'relation' => 'AND', 251 array( 252 'key' => 'mk1', 253 'value' => '1', 254 'compare' => "=", 255 'type' => 'numeric' 256 ), 257 array( 258 'key' => 'mk2', 259 'value' => '2', 260 'compare' => "=", 261 'type' => 'numeric' 262 ) 263 ) 264 ) ); 265 266 // Check results 267 $this->assertEquals( 1, count( $users ) ); 268 269 } 270 140 271 }