WordPress.org

Make WordPress Core

Ticket #22212: user.php.2.patch

File user.php.2.patch, 2.1 KB (added by barrykooij, 5 years 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();