WordPress.org

Make WordPress Core

Ticket #27272: 27272_meta2.diff

File 27272_meta2.diff, 2.0 KB (added by gitlost, 5 years ago)

Refresh for 4.4.

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

     
    587587                                $meta_value = trim( $meta_value );
    588588                        }
    589589
     590                        switch ( $meta_type ) {
     591                                case 'SIGNED':
     592                                        $cast_string = '%d';
     593                                        break;
     594                                case 'UNSIGNED':
     595                                        $cast_string = '%u';
     596                                        break;
     597                                default:
     598                                        $cast_string = '%s';
     599                                        break;
     600                        }
     601
    590602                        switch ( $meta_compare ) {
    591603                                case 'IN' :
    592604                                case 'NOT IN' :
    593                                         $meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')';
     605                                        $meta_compare_string = '(' . substr( str_repeat( ',' . $cast_string, count( $meta_value ) ), 1 ) . ')';
    594606                                        $where = $wpdb->prepare( $meta_compare_string, $meta_value );
    595607                                        break;
    596608
     
    597609                                case 'BETWEEN' :
    598610                                case 'NOT BETWEEN' :
    599611                                        $meta_value = array_slice( $meta_value, 0, 2 );
    600                                         $where = $wpdb->prepare( '%s AND %s', $meta_value );
     612                                        $where = $wpdb->prepare( $cast_string . ' AND ' . $cast_string, $meta_value );
    601613                                        break;
    602614
    603615                                case 'LIKE' :
    604616                                case 'NOT LIKE' :
    605617                                        $meta_value = '%' . $wpdb->esc_like( $meta_value ) . '%';
    606                                         $where = $wpdb->prepare( '%s', $meta_value );
     618                                        $where = $wpdb->prepare( $cast_string, $meta_value );
    607619                                        break;
    608620
    609621                                // EXISTS with a value is interpreted as '='.
    610622                                case 'EXISTS' :
    611623                                        $meta_compare = '=';
    612                                         $where = $wpdb->prepare( '%s', $meta_value );
     624                                        $where = $wpdb->prepare( $cast_string, $meta_value );
    613625                                        break;
    614626
    615627                                // 'value' is ignored for NOT EXISTS.
     
    618630                                        break;
    619631
    620632                                default :
    621                                         $where = $wpdb->prepare( '%s', $meta_value );
     633                                        $where = $wpdb->prepare( $cast_string, $meta_value );
    622634                                        break;
    623635
    624636                        }
    625637
    626                         if ( $where ) {
     638                        if ( $where !== '' ) {
    627639                                $sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}";
    628640                        }
    629641                }