WordPress.org

Make WordPress Core

Ticket #14645: query.diff

File query.diff, 2.6 KB (added by joehoyle, 5 years ago)
  • wp-includes/query.php

     
    12661266                $qv['cat'] = preg_replace( '|[^0-9,-]|', '', $qv['cat'] ); // comma separated list of positive or negative integers 
    12671267                $qv['pagename'] = trim( $qv['pagename'] ); 
    12681268                $qv['name'] = trim( $qv['name'] ); 
     1269                $qv['meta_key'] = (array) $qv['meta_key']; 
     1270                $qv['meta_value'] = (array) $qv['meta_value']; 
     1271                $qv['meta_compare'] = (array) $qv['meta_compare']; 
    12691272                if ( '' !== $qv['hour'] ) $qv['hour'] = absint($qv['hour']); 
    12701273                if ( '' !== $qv['minute'] ) $qv['minute'] = absint($qv['minute']); 
    12711274                if ( '' !== $qv['second'] ) $qv['second'] = absint($qv['second']); 
    1272  
     1275                 
    12731276                // Compat.  Map subpost to attachment. 
    12741277                if ( '' != $qv['subpost'] ) 
    12751278                        $qv['attachment'] = $qv['subpost']; 
     
    22962299                } 
    22972300 
    22982301                // postmeta queries 
    2299                 if ( ! empty($q['meta_key']) || ! empty($q['meta_value']) ) 
    2300                         $join .= " JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) "; 
    2301                 if ( ! empty($q['meta_key']) ) 
    2302                         $where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s ", $q['meta_key']); 
     2302                $meta_table_aliases = array(); 
     2303                if ( ! empty($q['meta_key']) || ! empty($q['meta_value']) ) { 
     2304                        foreach( $q['meta_key'] as $key => $value ) { 
     2305                                $meta_table_aliases[$key] = $wpdb->postmeta . ( $key ? '_' . $key : '' );                         
     2306                                $join .= " JOIN $wpdb->postmeta " . ( $meta_table_aliases[$key] != $wpdb->postmeta ? "as {$meta_table_aliases[$key]} " : '' ) . "ON ($wpdb->posts.ID = {$meta_table_aliases[$key]}.post_id) "; 
     2307                        } 
     2308                } 
     2309                if ( ! empty($q['meta_key']) ) { 
     2310                        foreach( $q['meta_key'] as $key => $value ) { 
     2311                                $where .= $wpdb->prepare(" AND {$meta_table_aliases[$key]}.meta_key = %s ", $value); 
     2312                        } 
     2313                } 
     2314                                 
    23032315                if ( ! empty($q['meta_value']) ) { 
    2304                         if ( empty($q['meta_compare']) || ! in_array($q['meta_compare'], array('=', '!=', '>', '>=', '<', '<=')) ) 
    2305                                 $q['meta_compare'] = '='; 
    2306  
    2307                         $where .= $wpdb->prepare("AND $wpdb->postmeta.meta_value {$q['meta_compare']} %s ", $q['meta_value']); 
     2316                        foreach( $q['meta_key'] as $key => $value ) { 
     2317                                if ( empty($q['meta_compare'][$key]) || ! in_array($q['meta_compare'][$key], array('=', '!=', '>', '>=', '<', '<=')) ) 
     2318                                        $q['meta_compare'][$key] = '='; 
     2319                                $where .= $wpdb->prepare("AND {$meta_table_aliases[$key]}.meta_value {$q['meta_compare'][$key]} %s ", $q['meta_value'][$key]); 
     2320                        } 
    23082321                } 
    2309  
     2322                 
    23102323                // Apply filters on where and join prior to paging so that any 
    23112324                // manipulations to them are reflected in the paging by day queries. 
    23122325                if ( !$q['suppress_filters'] ) {