Ticket #17065: 17065.diff
File 17065.diff, 4.1 KB (added by , 14 years ago) |
---|
-
wp-includes/query.php
2290 2290 2291 2291 $where .= $search . $whichauthor . $whichmimetype; 2292 2292 2293 if ( empty($q['order']) || ((strtoupper($q['order']) != 'ASC') && (strtoupper($q['order']) != 'DESC')) )2293 if ( empty($q['order']) || !in_array( strtoupper($q['order']), array('ASC', 'DESC') ) ) 2294 2294 $q['order'] = 'DESC'; 2295 2295 2296 2296 // Order by 2297 if ( empty($q['orderby']) ) { 2298 $orderby = "$wpdb->posts.post_date " . $q['order']; 2299 } elseif ( 'none' == $q['orderby'] ) { 2297 if ( empty($q['orderby']) ) 2298 $q_orderby = array(); 2299 elseif ( is_array( $q['orderby'] ) ) 2300 $q_orderby = $q['orderby']; 2301 else 2302 $q_orderby = explode(' ', $q['orderby']); 2303 2304 // Used to filter values 2305 $allowed_keys = array('author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count'); 2306 $orderby_array = array(); 2307 2308 foreach ( $q_orderby as $_order ) { 2309 if ( empty($_order) ) 2310 continue; 2300 2311 $orderby = ''; 2301 } else { 2302 // Used to filter values 2303 $allowed_keys = array('author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count'); 2304 if ( !empty($q['meta_key']) ) { 2305 $allowed_keys[] = $q['meta_key']; 2306 $allowed_keys[] = 'meta_value'; 2307 $allowed_keys[] = 'meta_value_num'; 2308 } 2309 $q['orderby'] = urldecode($q['orderby']); 2310 $q['orderby'] = addslashes_gpc($q['orderby']); 2312 $order = ''; 2313 $field = ''; 2314 $meta_key = ''; 2315 $value = null; 2311 2316 2312 $orderby_array = array(); 2313 foreach ( explode( ' ', $q['orderby'] ) as $i => $orderby ) { 2314 // Only allow certain values for safety 2315 if ( ! in_array($orderby, $allowed_keys) ) 2317 if ( ! is_array( $_order ) ) 2318 $field = urldecode($_order); 2319 else 2320 extract($_order, EXTR_OVERWRITE); 2321 2322 // Skip over empty data sets. 2323 if ( empty( $field ) ) { 2324 if ( '' === $meta_key ) 2316 2325 continue; 2326 $field = 'meta_value'; 2327 } 2317 2328 2318 switch ( $orderby ) { 2329 if ( empty( $order ) || !in_array( strtoupper($order), array('ASC', 'DESC') ) ) 2330 $order = $q['order']; 2331 2332 if ( in_array($field, $allowed_keys) ) { 2333 switch ( $field ) { 2319 2334 case 'menu_order': 2335 $orderby = "$wpdb->posts.menu_order"; 2320 2336 break; 2321 2337 case 'ID': 2322 2338 $orderby = "$wpdb->posts.ID"; … … 2324 2340 case 'rand': 2325 2341 $orderby = 'RAND()'; 2326 2342 break; 2327 case $q['meta_key']:2328 case 'meta_value':2329 $orderby = "$wpdb->postmeta.meta_value";2330 break;2331 case 'meta_value_num':2332 $orderby = "$wpdb->postmeta.meta_value+0";2333 break;2334 2343 case 'comment_count': 2335 2344 $orderby = "$wpdb->posts.comment_count"; 2336 2345 break; 2337 default: 2338 $orderby = "$wpdb->posts.post_" . $ orderby;2346 default: // author, date, title, modified, parent 2347 $orderby = "$wpdb->posts.post_" . $wpdb->escape( $field ); 2339 2348 } 2349 } elseif ( ! empty( $q['meta_query'] ) ) { 2350 $i = 0; 2351 foreach ( (array) $q['meta_query'] as $mq ) { 2352 if ( empty($mq['key']) ) 2353 continue; 2340 2354 2355 // Fieldnames *may* be a queried meta_key 2356 if ( '' === $meta_key && $field == $mq['key'] ) 2357 $meta_key = $field; 2358 2359 if ( $meta_key == $mq['key'] ) { 2360 $alias = $i ? 'mt' . $i : $wpdb->postmeta; // See wp-includes/meta.php _get_meta_sql() for alias names 2361 if ( 'meta_value' == $field ) 2362 $orderby = "$alias.meta_value"; 2363 elseif ( 'meta_value_num' == $field ) 2364 $orderby = "$alias.meta_value+0"; 2365 break; // out of the foreach 2366 } 2367 $i++; 2368 } 2369 } 2370 if ( !empty($orderby) ) { 2371 if ( null !== $value ) 2372 $orderby = $wpdb->prepare("($orderby = %s)", $value); 2373 $orderby .= ' ' . $order; 2341 2374 $orderby_array[] = $orderby; 2342 2375 } 2343 $orderby = implode( ',', $orderby_array );2344 2345 if ( empty( $orderby ) )2346 $orderby = "$wpdb->posts.post_date ".$q['order'];2347 else2348 $orderby .= " {$q['order']}";2349 2376 } 2377 $orderby = implode( ', ', $orderby_array ); 2378 if ( empty( $orderby ) ) 2379 $orderby = "$wpdb->posts.post_date " . $q['order']; 2350 2380 2351 2381 if ( is_array( $post_type ) ) { 2352 2382 $post_type_cap = 'multiple_post_type';