Make WordPress Core


Ignore:
Timestamp:
06/04/2014 05:47:19 AM (10 years ago)
Author:
wonderboymusic
Message:

Fix SQL generation when meta_query has an 'relation' => 'OR' for its queries and wants to 'orderby' => 'meta_value'.

Adds unit test.

Props jackreichert.
Fixes #25538.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/meta.php

    r28522 r28659  
    973973        }
    974974
     975        $where_meta_key = array();
    975976        foreach ( $queries as $k => $q ) {
    976977            $meta_key = isset( $q['key'] ) ? trim( $q['key'] ) : '';
     
    10151016
    10161017            $where[$k] = '';
    1017             if ( !empty( $meta_key ) )
    1018                 $where[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key );
     1018            if ( ! empty( $meta_key ) ) {
     1019                if ( isset( $q['compare'] ) ) {
     1020                    $where_meta_key[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key );
     1021                } else {
     1022                    $where[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key );
     1023                }
     1024            }
    10191025
    10201026            if ( is_null( $meta_value ) ) {
    1021                 if ( empty( $where[$k] ) )
     1027                if ( empty( $where[$k] ) && empty( $where_meta_key ) ) {
    10221028                    unset( $join[$i] );
     1029                }
    10231030                continue;
    10241031            }
     
    10601067        else
    10611068            $where = ' AND (' . implode( "\n{$this->relation} ", $where ) . ' )';
     1069
     1070        if ( ! empty( $where_meta_key ) ) {
     1071            $where .= "\nAND " . implode( "\nAND ", $where_meta_key );
     1072        }
    10621073
    10631074        $join = implode( "\n", $join );
Note: See TracChangeset for help on using the changeset viewer.