WordPress.org

Make WordPress Core

Ticket #22212: user.php.2.patch

File user.php.2.patch, 2.1 KB (added by barrykooij, 16 months ago)
  • wp-includes/user.php

     
    360360                if ( !empty( $query ) ) { 
    361361                        $this->query_vars = wp_parse_args( $query, array( 
    362362                                'blog_id' => $GLOBALS['blog_id'], 
    363                                 'role' => '', 
     363                                'role' => array(), 
    364364                                'meta_key' => '', 
    365365                                'meta_value' => '', 
    366366                                'meta_compare' => '', 
     
    492492                        $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query 
    493493                } 
    494494 
    495                 $role = trim( $qv['role'] ); 
     495                $roles = array(); 
     496                if( is_array( $qv[ 'role' ] ) ) { 
     497                        $roles = $qv[ 'role' ]; 
     498                }else if( is_string( $qv[ 'role' ] ) && !empty( $qv[ 'role' ] ) ) { 
     499                        $roles = array( $qv[ 'role' ] ); 
     500                } 
    496501 
    497                 if ( $blog_id && ( $role || is_multisite() ) ) { 
    498                         $cap_meta_query = array(); 
    499                         $cap_meta_query['key'] = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities'; 
     502                if ( $blog_id && ( !empty( $roles ) || is_multisite() ) ) { 
    500503 
    501                         if ( $role ) { 
    502                                 $cap_meta_query['value'] = '"' . $role . '"'; 
    503                                 $cap_meta_query['compare'] = 'like'; 
     504                        // Add Roles query 
     505                        if( !empty( $roles ) ) { 
     506 
     507                                $from = ''; 
     508                                $where = ' AND ( '; 
     509                                $roles_count = count($roles); 
     510                                for( $i = 0; $i < $roles_count; $i++ ) { 
     511                                        $alias = 'role_meta' . $i; 
     512                                        $from .= " INNER JOIN wp_usermeta AS {$alias} ON (wp_users.ID = {$alias}.user_id)"; 
     513                                        if( $i > 0 ) { 
     514                                                $where .= ' OR'; 
     515                                        } 
     516                                        $where .= " ( ({$alias}.meta_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities' AND CAST({$alias}.meta_value AS CHAR) LIKE  '%\"{$roles[$i]}\"%'  ) )"; 
     517                                } 
     518                                $where .= ' )'; 
     519 
     520                                $this->query_from .= $from; 
     521                                $this->query_where .= $where; 
     522                                $this->query_fields = 'DISTINCT ' . $wpdb->users . '.*'; 
     523 
    504524                        } 
    505525 
    506                         $qv['meta_query'][] = $cap_meta_query; 
     526                        // Add Multisite/Network check 
     527                        if( is_multisite() ) { 
     528                                $from = " INNER JOIN wp_usermeta AS network_meta ON (wp_users.ID = network_meta.user_id)"; 
     529                                $where = " AND ( (network_meta.meta_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities'  ) )"; 
     530                        } 
     531 
    507532                } 
    508533 
    509534                $meta_query = new WP_Meta_Query();