Make WordPress Core

Ticket #18707: multiplelikes.18707.diff

File multiplelikes.18707.diff, 1.7 KB (added by robmiller, 12 years ago)

First go at allowing multiple LIKE values in a meta query

  • wp-includes/meta.php

    diff --git wp-includes/meta.php wp-includes/meta.php
    index 9db1de3..569b951 100644
    class WP_Meta_Query { 
    795795                                        continue;
    796796                                }
    797797                        } else {
    798                                 $meta_value = trim( $meta_value );
     798                                if ( ! is_array( $meta_value ) )
     799                                        $meta_value = trim( $meta_value );
    799800                        }
    800801
    801802                        if ( 'IN' == substr( $meta_compare, -2) ) {
    class WP_Meta_Query { 
    804805                                $meta_value = array_slice( $meta_value, 0, 2 );
    805806                                $meta_compare_string = '%s AND %s';
    806807                        } elseif ( 'LIKE' == substr( $meta_compare, -4 ) ) {
    807                                 $meta_value = '%' . like_escape( $meta_value ) . '%';
     808                                if ( ! is_array( $meta_value ) )
     809                                        $meta_value = '%' . like_escape( $meta_value ) . '%';
    808810                                $meta_compare_string = '%s';
    809811                        } else {
    810812                                $meta_compare_string = '%s';
    class WP_Meta_Query { 
    813815                        if ( ! empty( $where[$k] ) )
    814816                                $where[$k] .= ' AND ';
    815817
    816                         $where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
     818                        if ( 'LIKE' == substr( $meta_compare, -4 ) && is_array($meta_value) ) {
     819                                $like_where = '';
     820                                foreach ( (array) $meta_value as $_meta_value ) {
     821                                        $_meta_value = '%' . like_escape( $_meta_value ) . '%';
     822                                        $like_where .= ' OR (' . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $_meta_value );
     823                                }
     824                                $where[$k] = substr( $like_where, 4 );
     825                        } else {
     826                                $where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
     827                        }
    817828                }
    818829
    819830                $where = array_filter( $where );