WordPress.org

Make WordPress Core

Ticket #10964: query.5.diff

File query.5.diff, 7.3 KB (added by willmot, 8 years ago)

Fixes orderby issues

  • query.php

     
    16081608
    16091609                // First let's clear some variables
    16101610                $distinct = '';
     1611                $quick_distinct = '';
     1612                $fields = "$wpdb->posts.ID"; // see #10964
     1613                $quick_fields = "$wpdb->posts.*";
    16111614                $whichcat = '';
    16121615                $whichauthor = '';
    16131616                $whichmimetype = '';
     1617                $search = '';
     1618                $join = '';
     1619                $quick_join = '';
    16141620                $where = '';
     1621                $quick_where = '';
     1622                $groupby = '';
     1623                $quick_groupby = '';
     1624                $orderby = '';
    16151625                $limits = '';
    1616                 $join = '';
    1617                 $search = '';
    1618                 $groupby = '';
    1619                 $fields = "$wpdb->posts.*";
    16201626                $post_status_join = false;
    16211627                $page = 1;
    16221628
     
    23572363                // Apply post-paging filters on where and join.  Only plugins that
    23582364                // manipulate paging queries should use these hooks.
    23592365                if ( !$q['suppress_filters'] ) {
    2360                         $where          = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) );
    2361                         $groupby        = apply_filters_ref_array( 'posts_groupby',             array( $groupby, &$this ) );
    2362                         $join           = apply_filters_ref_array( 'posts_join_paged',  array( $join, &$this ) );
    2363                         $orderby        = apply_filters_ref_array( 'posts_orderby',             array( $orderby, &$this ) );
    2364                         $distinct       = apply_filters_ref_array( 'posts_distinct',    array( $distinct, &$this ) );
    2365                         $limits         = apply_filters_ref_array( 'post_limits',               array( $limits, &$this ) );
    2366                         $fields         = apply_filters_ref_array( 'posts_fields',              array( $fields, &$this ) );
     2366                        $distinct = apply_filters_ref_array('posts_distinct', array( $distinct, &$this ) );
     2367                        $quick_distinct = apply_filters_ref_array('posts_distinct', array( $quick_distinct, &$this ) );
     2368
     2369                        $fields = apply_filters_ref_array('posts_fields', array( $fields, &$this ) );
     2370                        $quick_fields = apply_filters_ref_array('posts_fields', array( $quick_fields, &$this ) );
     2371
     2372                        $join = apply_filters_ref_array('posts_join_paged', array( $join, &$this ) );
     2373                        $quick_join = apply_filters_ref_array('posts_join_paged', array( $quick_join, &$this) );
     2374
     2375                        $where = apply_filters_ref_array('posts_where_paged', array( $where, &$this ) );
     2376                        $quick_where = apply_filtersref_array('posts_where_paged', array( $quick_where, &$this ) );
     2377
     2378                        $groupby = apply_filters_ref_array('posts_groupby', array( $groupby, &$this ) );
     2379                        $quick_groupby = apply_filters_ref_array('posts_groupby', $quick_groupby,  &$this ) );
     2380
     2381                        $orderby = apply_filters_ref_array('posts_orderby', array( $orderby, &$this ) );
     2382                        $limits = apply_filters_ref_array( 'post_limits', array( $limits, &$this )  );
    23672383                }
    23682384
    23692385                // Announce current selection parameters.  For use by caching plugins.
     
    23712387
    23722388                // Filter again for the benefit of caching plugins.  Regular plugins should use the hooks above.
    23732389                if ( !$q['suppress_filters'] ) {
    2374                         $where          = apply_filters_ref_array( 'posts_where_request',       array( $where, &$this ) );
    2375                         $groupby        = apply_filters_ref_array( 'posts_groupby_request',             array( $groupby, &$this ) );
    2376                         $join           = apply_filters_ref_array( 'posts_join_request',        array( $join, &$this ) );
    2377                         $orderby        = apply_filters_ref_array( 'posts_orderby_request',             array( $orderby, &$this ) );
    2378                         $distinct       = apply_filters_ref_array( 'posts_distinct_request',    array( $distinct, &$this ) );
    2379                         $fields         = apply_filters_ref_array( 'posts_fields_request',              array( $fields, &$this ) );
    2380                         $limits         = apply_filters_ref_array( 'post_limits_request',               array( $limits, &$this ) );
     2390                        $distinct = apply_filters_ref_array('posts_distinct_request', array( $distinct, &$this ) );
     2391                        $quick_distinct = apply_filters_ref_array('posts_distinct_request', $array( quick_distinct, &$this ) );
     2392
     2393                        $fields = apply_filters_ref_array('posts_fields_request', array( $fields, &$this ) );
     2394                        $quick_fields = apply_filters_ref_array('posts_fields_request', array( $quick_fields, &$this ) );
     2395
     2396                        $join = apply_filters_ref_array('posts_join_request', array( $join, &$this ) );
     2397                        $quick_join = apply_filters_ref_array('posts_join_request', array( $quick_join, &$this ) );
     2398
     2399                        $where = apply_filters_ref_array('posts_where_request', array( $where, &$this ) );
     2400                        $quick_where = apply_filters_ref_array('posts_where_request', array( $quick_where, &$this ) );
     2401
     2402                        $groupby = apply_filters_ref_array('posts_groupby_request', array( $groupby, &$this ) );
     2403                        $quick_groupby = apply_filters_ref_array('posts_groupby_request', array( $quick_groupby, &$this ) );
     2404
     2405                        $orderby = apply_filters_ref_array('posts_orderby_request', array( $orderby, &$this ) );
     2406                        $limits = apply_filters_ref_array( 'post_limits_request', array( $limits, &$this ) );
    23812407                }
    23822408
    23832409                if ( ! empty($groupby) )
     
    23882414                if ( !$q['no_found_rows'] && !empty($limits) )
    23892415                        $found_rows = 'SQL_CALC_FOUND_ROWS';
    23902416
     2417                if ( empty($limits) ) {
     2418                        // do a direct query, as there is no benefit in fetching a huge load of IDs in an IN clause
     2419                        $this->request = " SELECT $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby";
     2420                        $this->quick_request = " SELECT $distinct $quick_fields FROM $wpdb->posts $quick_join WHERE 1=1 $where $quick_groupby $orderby";
     2421
     2422                        if ( !$q['suppress_filters'] ) {
     2423                                $this->request = apply_filters('posts_request', $this->request, false);
     2424                                $this->quick_request = apply_filters('posts_request', $this->quick_request, true);
     2425                        }
     2426
     2427                        $this->posts = $wpdb->get_results($this->quick_request);
     2428
     2429                        $this->found_posts = count($this->posts);
     2430                        $this->found_posts = apply_filters( 'found_posts', $this->found_posts );
     2431                        $this->max_num_pages = ceil($this->found_posts / $q['posts_per_page']);
     2432                } else {
    23912433                $this->request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits";
    23922434                if ( !$q['suppress_filters'] )
    23932435                        $this->request = apply_filters_ref_array('posts_request', array( $this->request, &$this ) );
     2436                     
     2437                       $post_ids = $wpdb->get_col($this->request);
    23942438
    2395                 $this->posts = $wpdb->get_results($this->request);
     2439                        if ( !$post_ids ) {
     2440                                $this->found_posts = 0;
     2441                                $this->found_posts = apply_filters( 'found_posts', $this->found_posts );
     2442                                $this->max_num_pages = ceil($this->found_posts / $q['posts_per_page']);
     2443
     2444                                $this->quick_request = " SELECT $distinct $quick_fields FROM $wpdb->posts $quick_join WHERE 1=1 $quick_where $quick_groupby $orderby";
     2445                                if ( !$q['suppress_filters'] )
     2446                                        $this->quick_request = apply_filters('posts_request', $this->quick_request, true);
     2447                                $this->posts = array(); // no point in querying, since there are no posts
     2448                        } else {
     2449                                $found_posts_query = apply_filters( 'found_posts_query', 'SELECT FOUND_ROWS()' );
     2450                                $this->found_posts = $wpdb->get_var( $found_posts_query );
     2451                                $this->found_posts = apply_filters( 'found_posts', $this->found_posts );
     2452                                $this->max_num_pages = ceil($this->found_posts / $q['posts_per_page']);
     2453
     2454                                $this->quick_request = " SELECT $quick_distinct * FROM $wpdb->posts $quick_join WHERE 1 = 1 $quick_where AND $wpdb->posts.ID IN ( " . implode(',', $post_ids) . " ) $quick_groupby ORDER BY FIELD( $wpdb->posts.ID, " . implode(',', $post_ids) . ") ";
     2455                               
     2456                                if ( !$q['suppress_filters'] )
     2457                                        $this->quick_request = apply_filters('posts_request', $this->quick_request, true);
     2458
     2459                                $this->posts = $wpdb->get_results($this->quick_request);
     2460                        }
     2461                }
    23962462                // Raw results filter.  Prior to status checks.
    23972463                if ( !$q['suppress_filters'] )
    23982464                        $this->posts = apply_filters_ref_array('posts_results', array( $this->posts, &$this ) );