Ticket #17011: 17011.diff

File 17011.diff, 2.1 KB (added by greuben, 2 years ago)
Line 
1Index: wp-includes/query.php
2===================================================================
3--- wp-includes/query.php       (revision 17644)
4+++ wp-includes/query.php       (working copy)
5@@ -2478,6 +2478,7 @@
6                        $clauses = call_user_func_array( '_get_meta_sql', array( $q['meta_query'], 'post', $wpdb->posts, 'ID', &$this) );
7                        $join .= $clauses['join'];
8                        $where .= $clauses['where'];
9+                       $distinct = 'DISTINCT';
10                }
11 
12                // Apply filters on where and join prior to paging so that any
13Index: wp-includes/meta.php
14===================================================================
15--- wp-includes/meta.php        (revision 17644)
16+++ wp-includes/meta.php        (working copy)
17@@ -382,10 +382,18 @@
18 
19        $meta_id_column = esc_sql( $type . '_id' );
20 
21+       $relation = 'AND';
22+       if( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) {
23+               $relation = 'OR';
24+       } else {
25+               $meta_query['relation'] = '';
26+       }
27+       unset( $meta_query['relation'] );
28+
29        $join = '';
30-       $where = '';
31+       $where = array();
32        $i = 0;
33-       foreach ( $meta_query as $q ) {
34+       foreach ( $meta_query as $k => $q ) {
35                $meta_key = isset( $q['key'] ) ? trim( $q['key'] ) : '';
36                $meta_value = isset( $q['value'] ) ? $q['value'] : '';
37                $meta_compare = isset( $q['compare'] ) ? strtoupper( $q['compare'] ) : '=';
38@@ -411,7 +419,7 @@
39                $i++;
40 
41                if ( !empty( $meta_key ) )
42-                       $where .= $wpdb->prepare( " AND $alias.meta_key = %s", $meta_key );
43+                       $where[$k] = $wpdb->prepare( "($alias.meta_key = %s", $meta_key );
44 
45                if ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) {
46                        if ( ! is_array( $meta_value ) )
47@@ -439,8 +447,10 @@
48                if ( '_wp_zero_value' == $meta_value )
49                        $meta_value = 0;
50 
51-               $where .= $wpdb->prepare( " AND CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string}", $meta_value );
52+               $where[$k] .= $wpdb->prepare( " AND CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
53        }
54+       
55+       $where = ' AND ( '. implode( " $relation ", $where ) .' )';
56 
57        return apply_filters_ref_array( 'get_meta_sql', array( compact( 'join', 'where' ), $meta_query, $type, $primary_table, $primary_id_column, &$context ) );
58 }