WordPress.org

Make WordPress Core

Ticket #17065: 17065.diff

File 17065.diff, 4.1 KB (added by dd32, 3 years ago)
  • wp-includes/query.php

     
    22902290 
    22912291                $where .= $search . $whichauthor . $whichmimetype; 
    22922292 
    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') ) ) 
    22942294                        $q['order'] = 'DESC'; 
    22952295 
    22962296                // 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; 
    23002311                        $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; 
    23112316 
    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 ) 
    23162325                                        continue; 
     2326                                $field = 'meta_value'; 
     2327                        } 
    23172328 
    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 ) { 
    23192334                                        case 'menu_order': 
     2335                                                $orderby = "$wpdb->posts.menu_order"; 
    23202336                                                break; 
    23212337                                        case 'ID': 
    23222338                                                $orderby = "$wpdb->posts.ID"; 
     
    23242340                                        case 'rand': 
    23252341                                                $orderby = 'RAND()'; 
    23262342                                                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; 
    23342343                                        case 'comment_count': 
    23352344                                                $orderby = "$wpdb->posts.comment_count"; 
    23362345                                                break; 
    2337                                         default: 
    2338                                                 $orderby = "$wpdb->posts.post_" . $orderby; 
     2346                                        default: // author, date, title, modified, parent 
     2347                                                $orderby = "$wpdb->posts.post_" . $wpdb->escape( $field ); 
    23392348                                } 
     2349                        } elseif ( ! empty( $q['meta_query'] ) ) { 
     2350                                $i = 0; 
     2351                                foreach ( (array) $q['meta_query'] as $mq ) { 
     2352                                        if ( empty($mq['key']) ) 
     2353                                                continue; 
    23402354 
     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; 
    23412374                                $orderby_array[] = $orderby; 
    23422375                        } 
    2343                         $orderby = implode( ',', $orderby_array ); 
    2344  
    2345                         if ( empty( $orderby ) ) 
    2346                                 $orderby = "$wpdb->posts.post_date ".$q['order']; 
    2347                         else 
    2348                                 $orderby .= " {$q['order']}"; 
    23492376                } 
     2377                $orderby = implode( ', ', $orderby_array ); 
     2378                if ( empty( $orderby ) ) 
     2379                        $orderby = "$wpdb->posts.post_date " . $q['order']; 
    23502380 
    23512381                if ( is_array( $post_type ) ) { 
    23522382                        $post_type_cap = 'multiple_post_type';