Add meta_value_num meta_key ordering for WP_Query. Allows Natural numeric ordering of results. Props stencil & scribu for cleanups. Fixes #10649

git-svn-id: http://svn.automattic.com/wordpress/trunk@13501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
dd32 2010-02-28 12:49:10 +00:00
parent 93e2940943
commit 57c4fe34bd

View File

@ -2056,16 +2056,18 @@ class WP_Query {
if ( !empty($q['meta_key']) ) {
$allowed_keys[] = $q['meta_key'];
$allowed_keys[] = 'meta_value';
$allowed_keys[] = 'meta_value_num';
}
$q['orderby'] = urldecode($q['orderby']);
$q['orderby'] = addslashes_gpc($q['orderby']);
$orderby_array = explode(' ',$q['orderby']);
if ( empty($orderby_array) )
$orderby_array[] = $q['orderby'];
$orderby_array = explode(' ', $q['orderby']);
$q['orderby'] = '';
for ($i = 0; $i < count($orderby_array); $i++) {
foreach ( $orderby_array as $i => $orderby ) {
// Only allow certain values for safety
$orderby = $orderby_array[$i];
if ( ! in_array($orderby, $allowed_keys) )
continue;
switch ($orderby) {
case 'menu_order':
break;
@ -2079,15 +2081,19 @@ class WP_Query {
case 'meta_value':
$orderby = "$wpdb->postmeta.meta_value";
break;
case 'meta_value_num':
$orderby = "$wpdb->postmeta.meta_value+0";
break;
case 'comment_count':
$orderby = "$wpdb->posts.comment_count";
break;
default:
$orderby = "$wpdb->posts.post_" . $orderby;
}
if ( in_array($orderby_array[$i], $allowed_keys) )
$q['orderby'] .= (($i == 0) ? '' : ',') . $orderby;
$q['orderby'] .= (($i == 0) ? '' : ',') . $orderby;
}
// append ASC or DESC at the end
if ( !empty($q['orderby']))
$q['orderby'] .= " {$q['order']}";
@ -2644,7 +2650,7 @@ class WP_Query {
} elseif ( $this->is_tax ) {
$tax = $this->get('taxonomy');
$slug = $this->get('term');
$term = &get_terms($tax, array('slug'=>$slug));
$term = &get_terms($tax, array( 'slug' => $slug ) );
if ( is_wp_error($term) || empty($term) )
return NULL;
$term = $term[0];
@ -2656,7 +2662,7 @@ class WP_Query {
} elseif ( $this->is_single ) {
$this->queried_object = $this->post;
$this->queried_object_id = (int) $this->post->ID;
} elseif ( $this->is_page ) {
} elseif ( $this->is_page && !is_null($this->post) ) {
$this->queried_object = $this->post;
$this->queried_object_id = (int) $this->post->ID;
} elseif ( $this->is_author ) {