Make WordPress Core

Ticket #36696: 36696.patch

File 36696.patch, 1.9 KB (added by gitlost, 9 years ago)

Patch based on wonderboy's 27272.2.diff.

  • src/wp-includes/class-wp-meta-query.php

     
    594594                                $meta_value = trim( $meta_value );
    595595                        }
    596596
     597                        if ( 'SIGNED' === $meta_type ) {
     598                                $cast_string = '%d';
     599                        } elseif ( 'UNSIGNED' === $meta_type ) {
     600                                $cast_string = '%u';
     601                        } else {
     602                                $cast_string = '%s';
     603                        }
     604
    597605                        switch ( $meta_compare ) {
    598606                                case 'IN' :
    599607                                case 'NOT IN' :
    600                                         $meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')';
     608                                        $meta_compare_string = '(' . substr( str_repeat( ',' . $cast_string, count( $meta_value ) ), 1 ) . ')';
    601609                                        $where = $wpdb->prepare( $meta_compare_string, $meta_value );
    602610                                        break;
    603611
     
    604612                                case 'BETWEEN' :
    605613                                case 'NOT BETWEEN' :
    606614                                        $meta_value = array_slice( $meta_value, 0, 2 );
    607                                         $where = $wpdb->prepare( '%s AND %s', $meta_value );
     615                                        $where = $wpdb->prepare( $cast_string . ' AND ' . $cast_string, $meta_value );
    608616                                        break;
    609617
    610618                                case 'LIKE' :
    611619                                case 'NOT LIKE' :
    612620                                        $meta_value = '%' . $wpdb->esc_like( $meta_value ) . '%';
    613                                         $where = $wpdb->prepare( '%s', $meta_value );
     621                                        $where = $wpdb->prepare( '%s', $meta_value ); // Ignore $cast_string.
    614622                                        break;
    615623
    616624                                // EXISTS with a value is interpreted as '='.
    617625                                case 'EXISTS' :
    618626                                        $meta_compare = '=';
    619                                         $where = $wpdb->prepare( '%s', $meta_value );
     627                                        $where = $wpdb->prepare( $cast_string, $meta_value );
    620628                                        break;
    621629
    622630                                // 'value' is ignored for NOT EXISTS.
     
    625633                                        break;
    626634
    627635                                default :
    628                                         $where = $wpdb->prepare( '%s', $meta_value );
     636                                        $where = $wpdb->prepare( $cast_string, $meta_value );
    629637                                        break;
    630638
    631639                        }
    632640
    633                         if ( $where ) {
     641                        if ( '' !== $where ) {
    634642                                $sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}";
    635643                        }
    636644                }