From 57c4fe34bd8b3ffabb2678c4366e8b377a07d60f Mon Sep 17 00:00:00 2001 From: dd32 Date: Sun, 28 Feb 2010 12:49:10 +0000 Subject: [PATCH] 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 --- wp-includes/query.php | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/wp-includes/query.php b/wp-includes/query.php index 859685ef9..463840b55 100644 --- a/wp-includes/query.php +++ b/wp-includes/query.php @@ -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 ) {