| 1 | Index: wp-includes/functions.php |
|---|
| 2 | =================================================================== |
|---|
| 3 | --- wp-includes/functions.php (revision 15686) |
|---|
| 4 | +++ wp-includes/functions.php (working copy) |
|---|
| 5 | @@ -4279,10 +4279,11 @@ |
|---|
| 6 | $i = 0; |
|---|
| 7 | foreach ( $queries as $q ) { |
|---|
| 8 | $meta_key = isset( $q['meta_key'] ) ? trim( $q['meta_key'] ) : ''; |
|---|
| 9 | - $meta_value = isset( $q['meta_value'] ) ? trim( $q['meta_value'] ) : ''; |
|---|
| 10 | + $meta_value = isset( $q['meta_value'] ) ? $q['meta_value'] : ''; |
|---|
| 11 | $meta_compare = isset( $q['meta_compare'] ) ? $q['meta_compare'] : '='; |
|---|
| 12 | + $meta_compare = strtoupper( $meta_compare ); |
|---|
| 13 | |
|---|
| 14 | - if ( !in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'like' ) ) ) |
|---|
| 15 | + if ( !in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'IN', 'BETWEEN' ) ) ) |
|---|
| 16 | $meta_compare = '='; |
|---|
| 17 | |
|---|
| 18 | if ( empty( $meta_key ) && empty( $meta_value ) ) |
|---|
| 19 | @@ -4299,14 +4300,31 @@ |
|---|
| 20 | if ( !empty( $meta_key ) ) |
|---|
| 21 | $where .= $wpdb->prepare( " AND $alias.meta_key = %s", $meta_key ); |
|---|
| 22 | |
|---|
| 23 | + if ( in_array( $meta_compare, array( 'IN', 'BETWEEN' ) ) ) { |
|---|
| 24 | + if ( !is_array( $meta_value ) ) |
|---|
| 25 | + $meta_value = preg_split( '/[,\s]+/', $meta_value ); |
|---|
| 26 | + } else { |
|---|
| 27 | + $meta_value = trim( $meta_value ); |
|---|
| 28 | + } |
|---|
| 29 | + |
|---|
| 30 | if ( empty( $meta_value ) ) |
|---|
| 31 | continue; |
|---|
| 32 | |
|---|
| 33 | - if ( 'like' == $meta_compare ) { |
|---|
| 34 | - $where .= $wpdb->prepare( " AND $alias.meta_value LIKE %s", '%' . like_escape( $meta_value ) . '%' ); |
|---|
| 35 | + if ( 'IN' == $meta_compare ) { |
|---|
| 36 | + $meta_field_types = substr( str_repeat( ',%s', count( $meta_value ) ), 1 ); |
|---|
| 37 | + $meta_compare_string = "($meta_field_types)"; |
|---|
| 38 | + unset( $meta_field_types ); |
|---|
| 39 | + } elseif ( 'BETWEEN' == $meta_compare ) { |
|---|
| 40 | + $meta_value = array_slice( $meta_value, 0, 2 ); |
|---|
| 41 | + $meta_compare_string = '%s AND %s'; |
|---|
| 42 | + } elseif ( 'LIKE' == $meta_compare ) { |
|---|
| 43 | + $meta_value = '%' . like_escape( $meta_value ) . '%'; |
|---|
| 44 | + $meta_compare_string = '%s'; |
|---|
| 45 | } else { |
|---|
| 46 | - $where .= $wpdb->prepare( " AND $alias.meta_value $meta_compare %s", $meta_value ); |
|---|
| 47 | + $meta_compare_string = '%s'; |
|---|
| 48 | } |
|---|
| 49 | + $where .= $wpdb->prepare( " AND $alias.meta_value {$meta_compare} {$meta_compare_string}", $meta_value ); |
|---|
| 50 | + unset($meta_compare_string); |
|---|
| 51 | } |
|---|
| 52 | |
|---|
| 53 | return array( $join, $where ); |
|---|