WordPress.org

Make WordPress Core

Ticket #22212: 22212.2.patch

File 22212.2.patch, 6.6 KB (added by barrykooij, 8 years ago)
  • src/wp-includes/user.php

     
    503503                if ( empty( $this->query_vars ) || ! empty( $query ) ) {
    504504                        $this->query_limit = null;
    505505                        $this->query_vars = wp_parse_args( $query, array(
    506                                 'blog_id' => $GLOBALS['blog_id'],
    507                                 'role' => '',
    508                                 'meta_key' => '',
    509                                 'meta_value' => '',
    510                                 'meta_compare' => '',
    511                                 'include' => array(),
    512                                 'exclude' => array(),
    513                                 'search' => '',
    514                                 'search_columns' => array(),
    515                                 'orderby' => 'login',
    516                                 'order' => 'ASC',
    517                                 'offset' => '',
    518                                 'number' => '',
    519                                 'count_total' => true,
    520                                 'fields' => 'all',
    521                                 'who' => ''
     506                                        'blog_id'        => $GLOBALS['blog_id'],
     507                                        'role'           => array(),
     508                                        'meta_key'      => '',
     509                                        'meta_value'    => '',
     510                                        'meta_compare'  => '',
     511                                        'include'        => array(),
     512                                        'exclude'        => array(),
     513                                        'search'        => '',
     514                                        'search_columns' => array(),
     515                                        'orderby'        => 'login',
     516                                        'order'          => 'ASC',
     517                                        'offset'        => '',
     518                                        'number'        => '',
     519                                        'count_total'    => true,
     520                                        'fields'        => 'all',
     521                                        'who'            => ''
    522522                        ) );
    523523                }
    524524
     
    651651                        $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query
    652652                }
    653653
    654                 $role = '';
    655                 if ( isset( $qv['role'] ) )
    656                         $role = trim( $qv['role'] );
     654                $roles = array();
    657655
    658                 if ( $blog_id && ( $role || is_multisite() ) ) {
    659                         $cap_meta_query = array();
    660                         $cap_meta_query['key'] = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities';
     656                if ( isset( $qv['role'] ) ) {
     657                        if ( is_array( $qv['role'] ) ) {
     658                                $roles = $qv['role'];
     659                        } elseif ( is_string( $qv['role'] ) && ! empty( $qv['role'] ) ) {
     660                                $roles = array( $qv['role'] );
     661                        }
     662                }
    661663
    662                         if ( $role ) {
    663                                 $cap_meta_query['value'] = '"' . $role . '"';
    664                                 $cap_meta_query['compare'] = 'like';
     664                if ( $blog_id && ( ! empty( $roles ) || is_multisite() ) ) {
     665
     666                        if ( ! empty( $roles ) ) {
     667                                $from        = '';
     668                                $where       = ' AND ( ';
     669                                $roles_count = count( $roles );
     670
     671                                for ( $i = 0; $i < $roles_count; $i ++ ) {
     672
     673                                        $alias = 'role_meta' . $i;
     674                                        $from .= " INNER JOIN {$wpdb->usermeta} AS {$alias} ON ({$wpdb->users}.ID = {$alias}.user_id)";
     675
     676                                        if ( $i > 0 ) {
     677                                                $where .= ' OR';
     678                                        }
     679
     680                                        $where .= " ( ({$alias}.meta_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities' AND CAST({$alias}.meta_value AS CHAR) LIKE  '%\"{$roles[$i]}\"%'  ) )";
     681
     682                                }
     683                                $where .= ' )';
     684
     685                                $this->query_from .= $from;
     686                                $this->query_where .= $where;
     687                                $this->query_fields = 'DISTINCT ' . $wpdb->users . '.*';
     688
    665689                        }
    666690
    667                         $qv['meta_query'][] = $cap_meta_query;
     691                        // Add Multisite/Network check
     692                        if ( is_multisite() ) {
     693                                $from  = " INNER JOIN wp_usermeta AS network_meta ON (wp_users.ID = network_meta.user_id)";
     694                                $where = " AND ( (network_meta.meta_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities'  ) )";
     695                        }
     696
    668697                }
    669698
    670699                $meta_query = new WP_Meta_Query();
  • tests/phpunit/tests/user/query.php

     
    134134                $query->prepare_query();
    135135                $this->assertEquals( $_query_vars, $query->query_vars );
    136136        }
     137
     138        /**
     139         * @ticket 22212
     140         */
     141        function test_get_single_role_by_user_query() {
     142                $this->factory->user->create_many( 2, array(
     143                                'role' => 'subscriber'
     144                ) );
     145
     146                $wp_user_search = new WP_User_Query( array( 'role' => 'subscriber' ) );
     147                $users          = $wp_user_search->get_results();
     148                $this->assertEquals( 2, count( $users ) );
     149        }
     150
     151        /**
     152         * @ticket 22212
     153         */
     154        function test_get_multiple_roles_by_user_query() {
     155                $this->factory->user->create_many( 2, array(
     156                                'role' => 'subscriber'
     157                ) );
     158
     159                $this->factory->user->create_many( 3, array(
     160                                'role' => 'editor'
     161                ) );
     162
     163                $wp_user_search = new WP_User_Query( array( 'role' => array( 'subscriber', 'editor' ) ) );
     164                $users          = $wp_user_search->get_results();
     165                $this->assertEquals( 5, count( $users ) );
     166        }
     167
     168        /**
     169         * @ticket 22212
     170         */
     171        function test_get_single_role_by_string() {
     172                $this->factory->user->create_many( 2, array(
     173                                'role' => 'subscriber'
     174                ) );
     175
     176                $users = get_users( array(
     177                                'role' => 'subscriber'
     178                ) );
     179
     180                $this->assertEquals( 2, count( $users ) );
     181        }
     182
     183        /**
     184         * @ticket 22212
     185         */
     186        function test_get_single_role_by_array() {
     187                $this->factory->user->create_many( 2, array(
     188                                'role' => 'subscriber'
     189                ) );
     190
     191                $users = get_users( array(
     192                                'role' => array( 'subscriber' )
     193                ) );
     194
     195                $this->assertEquals( 2, count( $users ) );
     196        }
     197
     198        /**
     199         * @ticket 22212
     200         */
     201        function test_get_multiple_roles() {
     202                $this->factory->user->create_many( 2, array(
     203                                'role' => 'subscriber'
     204                ) );
     205
     206                $this->factory->user->create_many( 3, array(
     207                                'role' => 'editor'
     208                ) );
     209
     210                $this->factory->user->create_many( 2, array(
     211                                'role' => 'administrator'
     212                ) );
     213
     214                $users = new WP_User_Query( array( 'role' => array( 'subscriber', 'editor' ) ) );
     215                $users = $users->get_results();
     216
     217                $this->assertEquals( 5, count( $users ) );
     218                foreach ( $users as $user ) {
     219                        $this->assertInstanceOf( 'WP_User', $user );
     220                }
     221        }
     222
     223        /**
     224         * @ticket 22212
     225         */
     226        function test_get_multiple_roles_with_meta() {
     227
     228                // Create administrator user + meta
     229                $administrator_id = $this->factory->user->create( array( 'role' => 'administrator' ) );
     230                update_user_meta( $administrator_id, 'mk1', 1 );
     231                update_user_meta( $administrator_id, 'mk2', 1 );
     232
     233                // Create editor user + meta
     234                $editor_id = $this->factory->user->create( array( 'role' => 'editor' ) );
     235                update_user_meta( $editor_id, 'mk1', 1 );
     236                update_user_meta( $editor_id, 'mk2', 2 );
     237
     238                // Create subscriber user + meta
     239                $subscriber_id = $this->factory->user->create( array( 'role' => 'subscriber' ) );
     240                update_user_meta( $subscriber_id, 'mk1', 1 );
     241                update_user_meta( $subscriber_id, 'mk2', 1 );
     242
     243                // Fetch users
     244                $users = get_users( array(
     245                                'role'       => array( 'administrator', 'editor', 'subscriber' ),
     246                                'meta_query' => array(
     247                                                'relation' => 'AND',
     248                                                array(
     249                                                                'key'     => 'mk1',
     250                                                                'value'   => '1',
     251                                                                'compare' => "=",
     252                                                                'type'    => 'numeric'
     253                                                ),
     254                                                array(
     255                                                                'key'     => 'mk2',
     256                                                                'value'   => '2',
     257                                                                'compare' => "=",
     258                                                                'type'    => 'numeric'
     259                                                )
     260                                )
     261                ) );
     262
     263                // Check results
     264                $this->assertEquals( 1, count( $users ) );
     265
     266        }
     267
    137268}