Make WordPress Core

Ticket #24093: 24093.3.patch

File 24093.3.patch, 2.9 KB (added by vprat, 10 years ago)

Fixes the problem with ordering by meta_value

  • meta.php

     
    944944
    945945                $key_only_queries = array();
    946946                $queries = array();
    947 
     947               
    948948                // Split out the queries with empty arrays as value
    949949                foreach ( $this->queries as $k => $q ) {
    950950                        if ( isset( $q['value'] ) && is_array( $q['value'] ) && empty( $q['value'] ) ) {
     
    998998                                $meta_compare = '=';
    999999
    10001000                        $i = count( $join );
    1001                         $alias = $i ? 'mt' . $i : $meta_table;
     1001                        $alias = $i ? 'mt' . $i : 'mt0';
    10021002
    10031003                        if ( 'NOT EXISTS' == $meta_compare ) {
    10041004                                $join[$i]  = "LEFT JOIN $meta_table";
    1005                                 $join[$i] .= $i ? " AS $alias" : '';
     1005                                $join[$i] .= " AS $alias";
    10061006                                $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column AND $alias.meta_key = '$meta_key')";
    10071007
    10081008                                $where[$k] = ' ' . $alias . '.' . $meta_id_column . ' IS NULL';
     
    10101010                                continue;
    10111011                        }
    10121012
    1013                         $join[$i]  = "INNER JOIN $meta_table";
    1014                         $join[$i] .= $i ? " AS $alias" : '';
    1015                         $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
    1016 
     1013                        if ( !$i ) {
     1014                                $join[$i]  = "INNER JOIN $meta_table";
     1015                                $join[$i] .= $i ? " AS $alias" : ' AS mt0';
     1016                                $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
     1017                        }
     1018                       
    10171019                        $where[$k] = '';
    10181020                        if ( !empty( $meta_key ) )
    10191021                                $where[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key );
     
    10511053                        if ( ! empty( $where[$k] ) )
    10521054                                $where[$k] .= ' AND ';
    10531055
    1054                         $where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
     1056//                      $where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
     1057                       
     1058                        $where[$k] = ' ' . $primary_table . '.' . $primary_id_column . ' IN ('
     1059                                        . ' SELECT ' . $meta_id_column
     1060                                        . ' FROM ' . $meta_table . ' AS ' . $alias
     1061                                        . ' WHERE ' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string}", $meta_value )
     1062                                        . ')';
    10551063                }
    10561064
    10571065                $where = array_filter( $where );
  • query.php

     
    26542654                                        case 'meta_value':
    26552655                                                if ( isset( $q['meta_type'] ) ) {
    26562656                                                        $meta_type = $this->meta_query->get_cast_for_type( $q['meta_type'] );
    2657                                                         $orderby = "CAST($wpdb->postmeta.meta_value AS {$meta_type})";
     2657                                                        $orderby = "CAST(mt0.meta_value AS {$meta_type})";
    26582658                                                } else {
    2659                                                         $orderby = "$wpdb->postmeta.meta_value";
     2659                                                        $orderby = "mt0.meta_value";
    26602660                                                }
    26612661                                                break;
    26622662                                        case 'meta_value_num':
    2663                                                 $orderby = "$wpdb->postmeta.meta_value+0";
     2663                                                $orderby = "mt0.meta_value+0";
    26642664                                                break;
    26652665                                        case 'comment_count':
    26662666                                                $orderby = "$wpdb->posts.comment_count";