WordPress.org

Make WordPress Core

Ticket #14645: query.diff

File query.diff, 2.6 KB (added by joehoyle, 8 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'] ) {