WordPress.org

Make WordPress Core

Ticket #22212: 22212.patch

File 22212.patch, 5.6 KB (added by barrykooij, 5 years 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}