Ticket #31045: 31045.patch
File 31045.patch, 4.5 KB (added by , 10 years ago) |
---|
-
src/wp-includes/meta.php
934 934 protected $table_aliases = array(); 935 935 936 936 /** 937 * A flat list of clauses, keyed by table aliases. 938 * 939 * @since 4.2.0 940 * @var array 941 */ 942 protected $clauses = array(); 943 944 /** 937 945 * Constructor. 938 946 * 939 947 * @since 3.2.0 … … 1374 1382 // Save the alias to this clause, for future siblings to find. 1375 1383 $clause['alias'] = $alias; 1376 1384 1385 // Determine the data type. 1386 $meta_type = $this->get_cast_for_type( isset( $clause['type'] ) ? $clause['type'] : '' ); 1387 $clause['cast'] = $meta_type; 1388 1389 // Store the clause in our flat array. 1390 $clause_name = isset( $clause['name'] ) ? $clause['name'] : $clause['alias']; 1391 $this->clauses[ $clause_name ] =& $clause; 1392 1377 1393 // Next, build the WHERE clause. 1378 1394 1379 1395 // meta_key. … … 1388 1404 // meta_value. 1389 1405 if ( array_key_exists( 'value', $clause ) ) { 1390 1406 $meta_value = $clause['value']; 1391 $meta_type = $this->get_cast_for_type( isset( $clause['type'] ) ? $clause['type'] : '' );1392 1407 1393 1408 if ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) { 1394 1409 if ( ! is_array( $meta_value ) ) { … … 1450 1465 return $sql_chunks; 1451 1466 } 1452 1467 1468 public function get_clauses() { 1469 return $this->clauses; 1470 } 1471 1453 1472 /** 1454 1473 * Identify an existing table alias that is compatible with the current 1455 1474 * query clause. -
src/wp-includes/query.php
2233 2233 2234 2234 $primary_meta_key = ''; 2235 2235 $primary_meta_query = false; 2236 if ( ! empty( $this->meta_query->queries ) ) { 2237 $primary_meta_query = reset( $this->meta_query->queries ); 2236 $meta_clauses = $this->meta_query->get_clauses(); 2237 if ( ! empty( $meta_clauses ) ) { 2238 $primary_meta_query = reset( $meta_clauses ); 2238 2239 2239 2240 if ( ! empty( $primary_meta_query['key'] ) ) { 2240 2241 $primary_meta_key = $primary_meta_query['key']; … … 2243 2244 2244 2245 $allowed_keys[] = 'meta_value'; 2245 2246 $allowed_keys[] = 'meta_value_num'; 2247 $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) ); 2246 2248 } 2247 2249 2248 2250 if ( ! in_array( $orderby, $allowed_keys ) ) { … … 2260 2262 case 'ID': 2261 2263 case 'menu_order': 2262 2264 case 'comment_count': 2263 $orderby = "$wpdb->posts.{$orderby}";2265 $orderby_clause = "$wpdb->posts.{$orderby}"; 2264 2266 break; 2265 2267 case 'rand': 2266 $orderby = 'RAND()';2268 $orderby_clause = 'RAND()'; 2267 2269 break; 2268 2270 case $primary_meta_key: 2269 2271 case 'meta_value': 2270 2272 if ( ! empty( $primary_meta_query['type'] ) ) { 2271 $sql_type = $this->meta_query->get_cast_for_type( $primary_meta_query['type'] ); 2272 $orderby = "CAST($wpdb->postmeta.meta_value AS {$sql_type})"; 2273 $orderby_clause = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; 2273 2274 } else { 2274 $orderby = "$wpdb->postmeta.meta_value";2275 $orderby_clause = "{$primary_meta_query['alias']}.meta_value"; 2275 2276 } 2276 2277 break; 2277 2278 case 'meta_value_num': 2278 $orderby = "$wpdb->postmeta.meta_value+0";2279 $orderby_clause = "{$primary_meta_query['alias']}.meta_value+0"; 2279 2280 break; 2280 2281 default: 2281 $orderby = "$wpdb->posts.post_" . $orderby; 2282 if( array_key_exists( $orderby, $meta_clauses ) ){ 2283 $meta_clause = $meta_clauses[ $orderby ]; 2284 $orderby_clause = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; 2285 } else { 2286 $orderby_clause = "$wpdb->posts.post_" . $orderby; 2287 } 2282 2288 break; 2283 2289 } 2284 2290 2285 return $orderby;2291 return apply_filters( 'parse_orderby', $orderby_clause, $orderby ); 2286 2292 } 2287 2293 2288 2294 /** … … 2813 2819 2814 2820 $where .= $search . $whichauthor . $whichmimetype; 2815 2821 2822 if ( ! empty( $this->meta_query->queries ) ) { 2823 $clauses = $this->meta_query->get_sql( 'post', $wpdb->posts, 'ID', $this ); 2824 $join .= $clauses['join']; 2825 $where .= $clauses['where']; 2826 } 2827 2816 2828 $rand = ( isset( $q['orderby'] ) && 'rand' === $q['orderby'] ); 2817 2829 if ( ! isset( $q['order'] ) ) { 2818 2830 $q['order'] = $rand ? '' : 'DESC'; … … 3030 3042 $where .= ')'; 3031 3043 } 3032 3044 3033 if ( !empty( $this->meta_query->queries ) ) {3034 $clauses = $this->meta_query->get_sql( 'post', $wpdb->posts, 'ID', $this );3035 $join .= $clauses['join'];3036 $where .= $clauses['where'];3037 }3038 3039 3045 /* 3040 3046 * Apply filters on where and join prior to paging so that any 3041 3047 * manipulations to them are reflected in the paging by day queries.