WordPress.org

Make WordPress Core

Ticket #27344: meta.27344.patch

File meta.27344.patch, 2.5 KB (added by digitty, 7 years ago)
  • meta.php

     
    829829                                        unset( $join[$i] );
    830830                                        continue;
    831831                                }
     832                        } elseif ( in_array( $meta_compare, array( 'LIKE', 'NOT LIKE' ) ) && is_array( $meta_value ) ) {
     833                                $mk = array_keys( $meta_value );
     834                                if ( 1 !== count( $mk ) || ! in_array( strtoupper( $mk[0] ), array( 'AND', 'OR' ) ) || ! is_array( $meta_value[ $mk[0] ] ) || empty( $meta_value[ $mk[0] ] ) ) {
     835                                        _doing_it_wrong( __METHOD__, sprintf( __( 'Meta queries having the %1$s or %2$s compare operators accept array values with this format: %3$s; possible operator values: %4$s.' ),
     836                                                '<code>LIKE</code>', '<code>NOT LIKE</code>', "<code>array( 'operator' => array( 'value 1', 'value 2', ... ) )</code>", "'<code>AND</code>', '<code>OR</code>'" ), '3.9' );
     837                                        unset( $join[$i] );
     838                                        continue;
     839                                }
     840
     841                                $like_compare_relation = strtoupper( $mk[0] );
     842                                $like_compare_values = $meta_value[ $mk[0] ];
    832843                        } else {
    833844                                $meta_value = trim( $meta_value );
    834845                        }
     
    839850                                $meta_value = array_slice( $meta_value, 0, 2 );
    840851                                $meta_compare_string = '%s AND %s';
    841852                        } elseif ( 'LIKE' == substr( $meta_compare, -4 ) ) {
    842                                 $meta_value = '%' . like_escape( $meta_value ) . '%';
    843                                 $meta_compare_string = '%s';
     853                                if ( ! isset( $like_compare_values ) ) {
     854                                        $meta_value = '%' . like_escape( $meta_value ) . '%';
     855                                        $meta_compare_string = '%s';
     856                                } else {
     857                                        $where_term = '';
     858                                        foreach ( $like_compare_values as $like_value ) {
     859                                                $like_value = '%' . like_escape( trim( $like_value ) ) . '%';
     860                                                $term = $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} %s", $like_value );
     861                                                if ( ! empty( $where_term ) ) {
     862                                                        $where_term .= " {$like_compare_relation} ";
     863                                                }
     864                                                $where_term .= $term;
     865                                        }
     866                                        $where_term = '(' . $where_term . ')';
     867                                }
    844868                        } else {
    845869                                $meta_compare_string = '%s';
    846870                        }
    847871
    848                         if ( ! empty( $where[$k] ) )
     872                        if ( ! empty( $where[$k] ) ) {
    849873                                $where[$k] .= ' AND ';
     874                        }
    850875
    851                         $where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
     876                        if ( ! isset( $where_term ) ) {
     877                                $where_term = $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string}", $meta_value );
     878                        }
     879
     880                        $where[$k] = ' (' . $where[$k] . $where_term . ')';
    852881                }
    853882
    854883                $where = array_filter( $where );