WordPress.org

Make WordPress Core

Ticket #10964: query.5.diff

File query.5.diff, 7.3 KB (added by willmot, 5 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 ) );