Ticket #17065: 17065.diff

File 17065.diff, 4.1 KB (added by dd32, 2 years ago)
Line 
1Index: wp-includes/query.php
2===================================================================
3--- wp-includes/query.php       (revision 17692)
4+++ wp-includes/query.php       (working copy)
5@@ -2290,33 +2290,49 @@
6 
7                $where .= $search . $whichauthor . $whichmimetype;
8 
9-               if ( empty($q['order']) || ((strtoupper($q['order']) != 'ASC') && (strtoupper($q['order']) != 'DESC')) )
10+               if ( empty($q['order']) || !in_array( strtoupper($q['order']), array('ASC', 'DESC') ) )
11                        $q['order'] = 'DESC';
12 
13                // Order by
14-               if ( empty($q['orderby']) ) {
15-                       $orderby = "$wpdb->posts.post_date " . $q['order'];
16-               } elseif ( 'none' == $q['orderby'] ) {
17+               if ( empty($q['orderby']) )
18+                       $q_orderby = array();
19+               elseif ( is_array( $q['orderby'] ) )
20+                       $q_orderby = $q['orderby'];
21+               else
22+                       $q_orderby = explode(' ', $q['orderby']);
23+
24+               // Used to filter values
25+               $allowed_keys = array('author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count');
26+               $orderby_array = array();
27+
28+               foreach ( $q_orderby as $_order ) {
29+                       if ( empty($_order) )
30+                               continue;
31                        $orderby = '';
32-               } else {
33-                       // Used to filter values
34-                       $allowed_keys = array('author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count');
35-                       if ( !empty($q['meta_key']) ) {
36-                               $allowed_keys[] = $q['meta_key'];
37-                               $allowed_keys[] = 'meta_value';
38-                               $allowed_keys[] = 'meta_value_num';
39-                       }
40-                       $q['orderby'] = urldecode($q['orderby']);
41-                       $q['orderby'] = addslashes_gpc($q['orderby']);
42+                       $order = '';
43+                       $field = '';
44+                       $meta_key = '';
45+                       $value = null;
46 
47-                       $orderby_array = array();
48-                       foreach ( explode( ' ', $q['orderby'] ) as $i => $orderby ) {
49-                               // Only allow certain values for safety
50-                               if ( ! in_array($orderby, $allowed_keys) )
51+                       if ( ! is_array( $_order ) )
52+                               $field = urldecode($_order);
53+                       else
54+                               extract($_order, EXTR_OVERWRITE);
55+
56+                       // Skip over empty data sets.
57+                       if ( empty( $field ) ) {
58+                               if ( '' === $meta_key )
59                                        continue;
60+                               $field = 'meta_value';
61+                       }
62 
63-                               switch ( $orderby ) {
64+                       if ( empty( $order ) || !in_array( strtoupper($order), array('ASC', 'DESC') ) )
65+                               $order = $q['order'];
66+
67+                       if ( in_array($field, $allowed_keys) ) {
68+                               switch ( $field ) {
69                                        case 'menu_order':
70+                                               $orderby = "$wpdb->posts.menu_order";
71                                                break;
72                                        case 'ID':
73                                                $orderby = "$wpdb->posts.ID";
74@@ -2324,29 +2340,43 @@
75                                        case 'rand':
76                                                $orderby = 'RAND()';
77                                                break;
78-                                       case $q['meta_key']:
79-                                       case 'meta_value':
80-                                               $orderby = "$wpdb->postmeta.meta_value";
81-                                               break;
82-                                       case 'meta_value_num':
83-                                               $orderby = "$wpdb->postmeta.meta_value+0";
84-                                               break;
85                                        case 'comment_count':
86                                                $orderby = "$wpdb->posts.comment_count";
87                                                break;
88-                                       default:
89-                                               $orderby = "$wpdb->posts.post_" . $orderby;
90+                                       default: // author, date, title, modified, parent
91+                                               $orderby = "$wpdb->posts.post_" . $wpdb->escape( $field );
92                                }
93+                       } elseif ( ! empty( $q['meta_query'] ) ) {
94+                               $i = 0;
95+                               foreach ( (array) $q['meta_query'] as $mq ) {
96+                                       if ( empty($mq['key']) )
97+                                               continue;
98 
99+                                       // Fieldnames *may* be a queried meta_key
100+                                       if ( '' === $meta_key && $field == $mq['key'] )
101+                                               $meta_key = $field;
102+
103+                                       if ( $meta_key == $mq['key'] ) {
104+                                               $alias = $i ? 'mt' . $i : $wpdb->postmeta; // See wp-includes/meta.php _get_meta_sql() for alias names
105+                                               if ( 'meta_value' == $field )
106+                                                       $orderby = "$alias.meta_value";
107+                                               elseif ( 'meta_value_num' == $field )
108+                                                       $orderby = "$alias.meta_value+0";
109+                                               break; // out of the foreach
110+                                       }
111+                                       $i++;
112+                               }
113+                       }
114+                       if ( !empty($orderby) ) {
115+                               if ( null !== $value )
116+                                       $orderby = $wpdb->prepare("($orderby = %s)", $value);
117+                               $orderby .= ' ' . $order;
118                                $orderby_array[] = $orderby;
119                        }
120-                       $orderby = implode( ',', $orderby_array );
121-
122-                       if ( empty( $orderby ) )
123-                               $orderby = "$wpdb->posts.post_date ".$q['order'];
124-                       else
125-                               $orderby .= " {$q['order']}";
126                }
127+               $orderby = implode( ', ', $orderby_array );
128+               if ( empty( $orderby ) )
129+                       $orderby = "$wpdb->posts.post_date " . $q['order'];
130 
131                if ( is_array( $post_type ) ) {
132                        $post_type_cap = 'multiple_post_type';