WordPress.org

Make WordPress Core

Ticket #22212: 22212.3.patch

File 22212.3.patch, 6.7 KB (added by mordauk, 7 years ago)
  • src/wp-includes/user.php

     
    504504                if ( empty( $this->query_vars ) || ! empty( $query ) ) {
    505505                        $this->query_limit = null;
    506506                        $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'         => '',
    515515                                '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'            => ''
    523523                        ) );
    524524                }
    525525
     
    652652                        $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query
    653653                }
    654654
    655                 $role = '';
    656                 if ( isset( $qv['role'] ) )
    657                         $role = trim( $qv['role'] );
     655                $roles = array();
    658656
    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'] );
    666662                        }
     663                }
    667664
     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
    668692                        if ( empty( $qv['meta_query'] ) || ! in_array( $cap_meta_query, $qv['meta_query'], true ) ) {
    669693                                $qv['meta_query'][] = $cap_meta_query;
    670694                        }
    671695                }
    672696
     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
    673703                $meta_query = new WP_Meta_Query();
    674704                $meta_query->parse_query_vars( $qv );
    675705
  • tests/phpunit/tests/user/query.php

     
    137137                $query->prepare_query();
    138138                $this->assertEquals( $_query_vars, $query->query_vars );
    139139        }
     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
    140271}