WordPress.org

Make WordPress Core

Ticket #17065: 17065.diff

File 17065.diff, 4.1 KB (added by dd32, 9 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';