WordPress.org

Make WordPress Core

Ticket #22212: 22212.patch

File 22212.patch, 5.6 KB (added by barrykooij, 6 months ago)

user.php & unit tests

  • src/wp-includes/user.php

     
    362362                if ( !empty( $query ) ) { 
    363363                        $this->query_vars = wp_parse_args( $query, array( 
    364364                                'blog_id' => $GLOBALS['blog_id'], 
    365                                 'role' => '', 
     365                                'role' => array(), 
    366366                                'meta_key' => '', 
    367367                                'meta_value' => '', 
    368368                                'meta_compare' => '', 
     
    510510                        $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query 
    511511                } 
    512512 
    513                 $role = ''; 
    514                 if ( isset( $qv['role'] ) ) 
    515                         $role = trim( $qv['role'] ); 
     513                $roles = array(); 
    516514 
    517                 if ( $blog_id && ( $role || is_multisite() ) ) { 
    518                         $cap_meta_query = array(); 
    519                         $cap_meta_query['key'] = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities'; 
     515                if( isset( $qv[ 'role' ] ) ) { 
     516                        if( is_array( $qv[ 'role' ] ) ) { 
     517                                $roles = $qv[ 'role' ]; 
     518                        }else if( is_string( $qv[ 'role' ] ) && !empty( $qv[ 'role' ] ) ) { 
     519                                $roles = array( $qv[ 'role' ] ); 
     520                        } 
     521                } 
    520522 
    521                         if ( $role ) { 
    522                                 $cap_meta_query['value'] = '"' . $role . '"'; 
    523                                 $cap_meta_query['compare'] = 'like'; 
     523                if ( $blog_id && ( !empty( $roles ) || is_multisite() ) ) { 
     524 
     525                        if( !empty( $roles ) ) { 
     526                                $from = ''; 
     527                                $where = ' AND ( '; 
     528                                $roles_count = count($roles); 
     529 
     530                                for( $i = 0; $i < $roles_count; $i++ ) { 
     531 
     532                                        $alias = 'role_meta' . $i; 
     533                                        $from .= " INNER JOIN {$wpdb->usermeta} AS {$alias} ON ({$wpdb->users}.ID = {$alias}.user_id)"; 
     534 
     535                                        if( $i > 0 ) { 
     536                                                $where .= ' OR'; 
     537                                        } 
     538 
     539                                        $where .= " ( ({$alias}.meta_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities' AND CAST({$alias}.meta_value AS CHAR) LIKE  '%\"{$roles[$i]}\"%'  ) )"; 
     540 
     541                                } 
     542                                $where .= ' )'; 
     543 
     544                                $this->query_from .= $from; 
     545                                $this->query_where .= $where; 
     546                                $this->query_fields = 'DISTINCT ' . $wpdb->users . '.*'; 
     547 
    524548                        } 
    525549 
    526                         $qv['meta_query'][] = $cap_meta_query; 
     550                        // Add Multisite/Network check 
     551                        if( is_multisite() ) { 
     552                                $from = " INNER JOIN wp_usermeta AS network_meta ON (wp_users.ID = network_meta.user_id)"; 
     553                                $where = " AND ( (network_meta.meta_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities'  ) )"; 
     554                        } 
     555 
    527556                } 
    528557 
     558 
    529559                $meta_query = new WP_Meta_Query(); 
    530560                $meta_query->parse_query_vars( $qv ); 
    531561 
  • tests/phpunit/tests/user/query.php

     
    101101 
    102102                $this->assertEquals( $names, $values ); 
    103103        } 
     104 
     105        /** 
     106         * @ticket 22212 
     107         */ 
     108        function test_get_single_role_by_user_query() { 
     109                $this->factory->user->create_many( 2, array( 
     110                        'role' => 'subscriber' 
     111                ) ); 
     112 
     113                $wp_user_search = new WP_User_Query( array( 'role' => 'subscriber' ) ); 
     114                $users = $wp_user_search->get_results(); 
     115                $this->assertEquals( 2, count( $users ) ); 
     116        } 
     117 
     118        /** 
     119         * @ticket 22212 
     120         */ 
     121        function test_get_multiple_roles_by_user_query() { 
     122                $this->factory->user->create_many( 2, array( 
     123                        'role' => 'subscriber' 
     124                ) ); 
     125 
     126                $this->factory->user->create_many( 3, array( 
     127                        'role' => 'editor' 
     128                ) ); 
     129 
     130                $wp_user_search = new WP_User_Query( array( 'role' => array( 'subscriber', 'editor' ) ) ); 
     131                $users = $wp_user_search->get_results(); 
     132                $this->assertEquals( 5, count( $users ) ); 
     133        } 
     134 
     135        /** 
     136         * @ticket 22212 
     137         */ 
     138        function test_get_single_role_by_string() { 
     139                $this->factory->user->create_many( 2, array( 
     140                        'role' => 'subscriber' 
     141                ) ); 
     142 
     143                $users = get_users( array( 
     144                        'role' => 'subscriber' 
     145                ) ); 
     146 
     147                $this->assertEquals( 2, count( $users ) ); 
     148        } 
     149 
     150        /** 
     151         * @ticket 22212 
     152         */ 
     153        function test_get_single_role_by_array() { 
     154                $this->factory->user->create_many( 2, array( 
     155                        'role' => 'subscriber' 
     156                ) ); 
     157 
     158                $users = get_users( array( 
     159                        'role' => array( 'subscriber' ) 
     160                ) ); 
     161 
     162                $this->assertEquals( 2, count( $users ) ); 
     163        } 
     164 
     165        /** 
     166         * @ticket 22212 
     167         */ 
     168        function test_get_multiple_roles() { 
     169                $this->factory->user->create_many( 2, array( 
     170                        'role' => 'subscriber' 
     171                ) ); 
     172 
     173                $this->factory->user->create_many( 3, array( 
     174                        'role' => 'editor' 
     175                ) ); 
     176 
     177                $this->factory->user->create_many( 2, array( 
     178                        'role' => 'administrator' 
     179                ) ); 
     180 
     181                $users = new WP_User_Query( array( 'role' => array( 'subscriber', 'editor' ) ) ); 
     182                $users = $users->get_results(); 
     183 
     184                $this->assertEquals( 5, count( $users ) ); 
     185                foreach ( $users as $user ) { 
     186                        $this->assertInstanceOf( 'WP_User', $user ); 
     187                } 
     188        } 
     189 
     190        /** 
     191         * @ticket 22212 
     192         */ 
     193        function test_get_multiple_roles_with_meta() { 
     194 
     195                // Create administrator user + meta 
     196                $administrator_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); 
     197                update_user_meta( $administrator_id, 'mk1', 1 ); 
     198                update_user_meta( $administrator_id, 'mk2', 1 ); 
     199 
     200                // Create editor user + meta 
     201                $editor_id = $this->factory->user->create( array( 'role' => 'editor' ) ); 
     202                update_user_meta( $editor_id, 'mk1', 1 ); 
     203                update_user_meta( $editor_id, 'mk2', 2 ); 
     204 
     205                // Create subscriber user + meta 
     206                $subscriber_id = $this->factory->user->create( array( 'role' => 'subscriber' ) ); 
     207                update_user_meta( $subscriber_id, 'mk1', 1 ); 
     208                update_user_meta( $subscriber_id, 'mk2', 1 ); 
     209 
     210                // Fetch users 
     211                $users = get_users( array( 
     212                        'role' => array( 'administrator', 'editor', 'subscriber' ), 
     213                        'meta_query'   => array( 
     214                                'relation' => 'AND', 
     215                                array( 
     216                                        'key' => 'mk1', 
     217                                        'value' => '1', 
     218                                        'compare' => "=", 
     219                                        'type' => 'numeric' 
     220                                ), 
     221                                array( 
     222                                        'key' => 'mk2', 
     223                                        'value' =>  '2', 
     224                                        'compare' => "=", 
     225                                        'type' => 'numeric' 
     226                                ) 
     227                        ) 
     228                ) ); 
     229 
     230                // Check results 
     231                $this->assertEquals( 1, count( $users ) ); 
     232 
     233        } 
     234 
    104235}