Ticket #31045: meta-query.patch
File meta-query.patch, 3.5 KB (added by , 10 years ago) |
---|
-
meta.php
932 932 * @var array 933 933 */ 934 934 protected $table_aliases = array(); 935 936 /** 937 * A flat list of ORDER BY clauses with aliases as the keys. 938 * 939 * @since 4.2.0 940 * @var array 941 */ 942 public $orderby_clauses = array(); 935 943 936 944 /** 937 945 * Constructor. … … 1351 1359 // We prefer to avoid joins if possible. Look for an existing join compatible with this clause. 1352 1360 $alias = $this->find_compatible_table_alias( $clause, $parent_query ); 1353 1361 if ( false === $alias ) { 1354 $i = count( $this->table_aliases ); 1355 $alias = $i ? 'mt' . $i : $this->meta_table; 1362 if( empty( $clause['alias'] ) ){ 1363 $i = count( $this->table_aliases ); 1364 $alias = $i ? 'mt' . $i : $this->meta_table; 1365 } else { 1366 $alias = $clause['alias']; 1367 } 1356 1368 1357 1369 // JOIN clauses for NOT EXISTS have their own syntax. 1358 1370 if ( 'NOT EXISTS' === $meta_compare ) { … … 1373 1385 1374 1386 // Save the alias to this clause, for future siblings to find. 1375 1387 $clause['alias'] = $alias; 1388 1389 //Build the ORDER BY clause 1390 if ( ! empty( $primary_meta_query['type'] ) ) { 1391 $meta_type = $this->meta_query->get_cast_for_type( $clause['type'] ); 1392 $this->orderby_clauses[$alias] = "CAST($alias.meta_value AS {$meta_type})"; 1393 } else { 1394 $this->orderby_clauses[$alias] = "$alias.meta_value"; 1395 } 1376 1396 1377 1397 // Next, build the WHERE clause. 1378 1398 -
query.php
2230 2230 'post_parent', 'post_type', 'name', 'author', 'date', 'title', 'modified', 2231 2231 'parent', 'type', 'ID', 'menu_order', 'comment_count', 'rand', 2232 2232 ); 2233 2234 $allowed_keys = apply_filters( 'allowed_orderby_keys', $allowed_keys ); 2233 2235 2234 2236 $primary_meta_key = ''; 2235 2237 $primary_meta_query = false; … … 2244 2246 $allowed_keys[] = 'meta_value'; 2245 2247 $allowed_keys[] = 'meta_value_num'; 2246 2248 } 2249 2250 if ( ! empty( $this->meta_query->table_aliases ) ) { 2251 $aliases = (array) $this->meta_query->table_aliases; 2252 } 2247 2253 2248 2254 if ( ! in_array( $orderby, $allowed_keys ) ) { 2249 2255 return false; … … 2260 2266 case 'ID': 2261 2267 case 'menu_order': 2262 2268 case 'comment_count': 2263 $orderby = "$wpdb->posts.{$orderby}";2269 $orderby_clause = "$wpdb->posts.{$orderby}"; 2264 2270 break; 2265 2271 case 'rand': 2266 $orderby = 'RAND()';2272 $orderby_clause = 'RAND()'; 2267 2273 break; 2268 2274 case $primary_meta_key: 2269 2275 case 'meta_value': 2270 2276 if ( ! empty( $primary_meta_query['type'] ) ) { 2271 2277 $sql_type = $this->meta_query->get_cast_for_type( $primary_meta_query['type'] ); 2272 $orderby = "CAST($wpdb->postmeta.meta_value AS {$sql_type})";2278 $orderby_clause = "CAST($wpdb->postmeta.meta_value AS {$sql_type})"; 2273 2279 } else { 2274 $orderby = "$wpdb->postmeta.meta_value";2280 $orderby_clause = "$wpdb->postmeta.meta_value"; 2275 2281 } 2276 2282 break; 2277 2283 case 'meta_value_num': 2278 $orderby = "$wpdb->postmeta.meta_value+0";2284 $orderby_clause = "$wpdb->postmeta.meta_value+0"; 2279 2285 break; 2286 case array_key_exists( $orderby, $this->meta_query->orderby_clauses ): 2287 $orderby_clause = $this->meta_query->orderby_clauses[$orderby]; 2288 break; 2280 2289 default: 2281 $orderby = "$wpdb->posts.post_" . $orderby;2290 $orderby_clause = "$wpdb->posts.post_" . $orderby; 2282 2291 break; 2283 2292 } 2284 2285 return $orderby;2293 2294 return apply_filters( 'parse_orderby', $orderby_clause, $orderby ); 2286 2295 } 2287 2296 2288 2297 /**