WordPress.org

Make WordPress Core

Ticket #27272: 27272_meta3.diff

File 27272_meta3.diff, 2.0 KB (added by gitlost, 4 years ago)

Refresh for 4.5.

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

     
    597597                                $meta_value = trim( $meta_value );
    598598                        }
    599599
     600                        switch ( $meta_type ) {
     601                                case 'SIGNED':
     602                                        $cast_string = '%d';
     603                                        break;
     604                                case 'UNSIGNED':
     605                                        $cast_string = '%u';
     606                                        break;
     607                                default:
     608                                        $cast_string = '%s';
     609                                        break;
     610                        }
     611
    600612                        switch ( $meta_compare ) {
    601613                                case 'IN' :
    602614                                case 'NOT IN' :
    603                                         $meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')';
     615                                        $meta_compare_string = '(' . substr( str_repeat( ',' . $cast_string, count( $meta_value ) ), 1 ) . ')';
    604616                                        $where = $wpdb->prepare( $meta_compare_string, $meta_value );
    605617                                        break;
    606618
     
    607619                                case 'BETWEEN' :
    608620                                case 'NOT BETWEEN' :
    609621                                        $meta_value = array_slice( $meta_value, 0, 2 );
    610                                         $where = $wpdb->prepare( '%s AND %s', $meta_value );
     622                                        $where = $wpdb->prepare( $cast_string . ' AND ' . $cast_string, $meta_value );
    611623                                        break;
    612624
    613625                                case 'LIKE' :
    614626                                case 'NOT LIKE' :
    615627                                        $meta_value = '%' . $wpdb->esc_like( $meta_value ) . '%';
    616                                         $where = $wpdb->prepare( '%s', $meta_value );
     628                                        $where = $wpdb->prepare( $cast_string, $meta_value );
    617629                                        break;
    618630
    619631                                // EXISTS with a value is interpreted as '='.
    620632                                case 'EXISTS' :
    621633                                        $meta_compare = '=';
    622                                         $where = $wpdb->prepare( '%s', $meta_value );
     634                                        $where = $wpdb->prepare( $cast_string, $meta_value );
    623635                                        break;
    624636
    625637                                // 'value' is ignored for NOT EXISTS.
     
    628640                                        break;
    629641
    630642                                default :
    631                                         $where = $wpdb->prepare( '%s', $meta_value );
     643                                        $where = $wpdb->prepare( $cast_string, $meta_value );
    632644                                        break;
    633645
    634646                        }
    635647
    636                         if ( $where ) {
     648                        if ( $where !== '' ) {
    637649                                $sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}";
    638650                        }
    639651                }