WordPress.org

Make WordPress Core

Ticket #10964: query.php.r17389.diff

File query.php.r17389.diff, 9.8 KB (added by kawauso, 3 years ago)

Patch against r17389, haven't implemented nacin's suggestion, fixed !$post_ids check

  • query.php

     
    878878        var $request; 
    879879 
    880880        /** 
     881         * Get quick post database query. 
     882         * 
     883         * @since 3.1 
     884         * @access public 
     885         * @var string 
     886         */ 
     887        var $quick_request; 
     888 
     889        /** 
    881890         * List of posts. 
    882891         * 
    883892         * @since 1.5.0 
     
    18871896                $join = ''; 
    18881897                $search = ''; 
    18891898                $groupby = ''; 
    1890                 $fields = ''; 
     1899                $fields = "$wpdb->posts.ID"; // see #10964 
     1900                $quick_fields = "$wpdb->posts.*"; 
    18911901                $post_status_join = false; 
    18921902                $page = 1; 
    18931903 
     
    25062516 
    25072517                $orderby = $q['orderby']; 
    25082518 
     2519                // Set up quick_* defaults from the standard placeholders, before filtering 
     2520                $quick_distinct = $distinct; 
     2521                $quick_where = $where; 
     2522                $quick_join = $join; 
     2523                $quick_groupby = $groupby; 
     2524 
    25092525                $pieces = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' ); 
    25102526 
    25112527                // Apply post-paging filters on where and join.  Only plugins that 
    25122528                // manipulate paging queries should use these hooks. 
    25132529                if ( !$q['suppress_filters'] ) { 
    2514                         $where          = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) ); 
    2515                         $groupby        = apply_filters_ref_array( 'posts_groupby',             array( $groupby, &$this ) ); 
    2516                         $join           = apply_filters_ref_array( 'posts_join_paged',  array( $join, &$this ) ); 
    2517                         $orderby        = apply_filters_ref_array( 'posts_orderby',             array( $orderby, &$this ) ); 
    2518                         $distinct       = apply_filters_ref_array( 'posts_distinct',    array( $distinct, &$this ) ); 
    2519                         $limits         = apply_filters_ref_array( 'post_limits',               array( $limits, &$this ) ); 
    2520                         $fields         = apply_filters_ref_array( 'posts_fields',              array( $fields, &$this ) ); 
     2530                        $where          = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this, false ) ); 
     2531                        $groupby        = apply_filters_ref_array( 'posts_groupby',             array( $groupby, &$this, false ) ); 
     2532                        $join           = apply_filters_ref_array( 'posts_join_paged',  array( $join, &$this, false ) ); 
     2533                        $orderby        = apply_filters_ref_array( 'posts_orderby',             array( $orderby, &$this, false ) ); 
     2534                        $distinct       = apply_filters_ref_array( 'posts_distinct',    array( $distinct, &$this, false ) ); 
     2535                        $limits         = apply_filters_ref_array( 'post_limits',               array( $limits, &$this, false ) ); 
     2536                        $fields         = apply_filters_ref_array( 'posts_fields',              array( $fields, &$this, false ) ); 
    25212537 
     2538                        $quick_where    = apply_filters_ref_array( 'posts_where_paged', array( $quick_where, &$this, true ) ); 
     2539                        $quick_groupby  = apply_filters_ref_array( 'posts_groupby',             array( $quick_groupby, &$this, true ) ); 
     2540                        $quick_join             = apply_filters_ref_array( 'posts_join_paged',  array( $quick_join, &$this, true ) ); 
     2541                        $quick_orderby  = apply_filters_ref_array( 'posts_orderby',             array( $quick_orderby, &$this, true ) ); 
     2542                        $quick_distinct = apply_filters_ref_array( 'posts_distinct',    array( $quick_distinct, &$this, true ) ); 
     2543                        $quick_limits   = apply_filters_ref_array( 'post_limits',               array( $quick_limits, &$this, true ) ); 
     2544                        $quick_fields   = apply_filters_ref_array( 'posts_fields',              array( $quick_fields, &$this, true ) ); 
     2545 
    25222546                        // Filter all clauses at once, for convenience 
    25232547                        $clauses = (array) apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &$this ) ); 
    25242548                        foreach ( $pieces as $piece ) 
     
    25302554 
    25312555                // Filter again for the benefit of caching plugins.  Regular plugins should use the hooks above. 
    25322556                if ( !$q['suppress_filters'] ) { 
    2533                         $where          = apply_filters_ref_array( 'posts_where_request',               array( $where, &$this ) ); 
    2534                         $groupby        = apply_filters_ref_array( 'posts_groupby_request',             array( $groupby, &$this ) ); 
    2535                         $join           = apply_filters_ref_array( 'posts_join_request',                array( $join, &$this ) ); 
    2536                         $orderby        = apply_filters_ref_array( 'posts_orderby_request',             array( $orderby, &$this ) ); 
    2537                         $distinct       = apply_filters_ref_array( 'posts_distinct_request',    array( $distinct, &$this ) ); 
    2538                         $fields         = apply_filters_ref_array( 'posts_fields_request',              array( $fields, &$this ) ); 
    2539                         $limits         = apply_filters_ref_array( 'post_limits_request',               array( $limits, &$this ) ); 
     2557                        $where          = apply_filters_ref_array( 'posts_where_request',               array( $where, &$this, false ) ); 
     2558                        $groupby        = apply_filters_ref_array( 'posts_groupby_request',             array( $groupby, &$this, false ) ); 
     2559                        $join           = apply_filters_ref_array( 'posts_join_request',                array( $join, &$this, false ) ); 
     2560                        $orderby        = apply_filters_ref_array( 'posts_orderby_request',             array( $orderby, &$this, false ) ); 
     2561                        $distinct       = apply_filters_ref_array( 'posts_distinct_request',    array( $distinct, &$this, false ) ); 
     2562                        $fields         = apply_filters_ref_array( 'posts_fields_request',              array( $fields, &$this, false ) ); 
     2563                        $limits         = apply_filters_ref_array( 'post_limits_request',               array( $limits, &$this, false ) ); 
    25402564 
     2565                        $quick_where    = apply_filters_ref_array( 'posts_where_request',               array( $quick_where, &$this, true ) ); 
     2566                        $quick_groupby  = apply_filters_ref_array( 'posts_groupby_request',             array( $quick_groupby, &$this, true ) ); 
     2567                        $quick_join             = apply_filters_ref_array( 'posts_join_request',                array( $quick_join, &$this, true ) ); 
     2568                        $quick_orderby  = apply_filters_ref_array( 'posts_orderby_request',             array( $quick_orderby, &$this, true ) ); 
     2569                        $quick_distinct = apply_filters_ref_array( 'posts_distinct_request',    array( $quick_distinct, &$this, true ) ); 
     2570                        $quick_fields   = apply_filters_ref_array( 'posts_fields_request',              array( $quick_fields, &$this, true ) ); 
     2571                        $quick_limits   = apply_filters_ref_array( 'post_limits_request',               array( $quick_limits, &$this, true ) ); 
     2572 
    25412573                        // Filter all clauses at once, for convenience 
    25422574                        $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); 
    25432575                        foreach ( $pieces as $piece ) 
     
    25462578 
    25472579                if ( ! empty($groupby) ) 
    25482580                        $groupby = 'GROUP BY ' . $groupby; 
     2581                if ( ! empty($quick_groupby) )  
     2582                        $quick_groupby = 'GROUP BY ' . $quick_groupby; 
    25492583                if ( !empty( $orderby ) ) 
    25502584                        $orderby = 'ORDER BY ' . $orderby; 
    25512585 
     
    25532587                if ( !$q['no_found_rows'] && !empty($limits) ) 
    25542588                        $found_rows = 'SQL_CALC_FOUND_ROWS'; 
    25552589 
    2556                 $this->request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits"; 
    2557                 if ( !$q['suppress_filters'] ) 
    2558                         $this->request = apply_filters_ref_array('posts_request', array( $this->request, &$this ) ); 
     2590                if ( empty($limits) ) { 
     2591                        // Do a direct query, as there is no benefit in fetching a huge load of IDs in an IN clause 
     2592                        $this->request = " SELECT $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby"; 
     2593                        $this->quick_request = " SELECT $quick_distinct $quick_fields FROM $wpdb->posts $quick_join WHERE 1=1 $quick_where $quick_groupby $orderby"; 
    25592594 
    2560                 if ( 'ids' == $q['fields'] ) { 
    2561                         $this->posts = $wpdb->get_col($this->request); 
     2595                        if ( 'ids' == $q['fields'] ) { 
     2596                                $this->posts = $wpdb->get_col($this->request); 
    25622597 
    2563                         return $this->posts; 
    2564                 } 
     2598                                return $this->posts; 
     2599                        } 
    25652600 
    2566                 if ( 'id=>parent' == $q['fields'] ) { 
    2567                         $this->posts = $wpdb->get_results($this->request); 
     2601                        if ( 'id=>parent' == $q['fields'] ) { 
     2602                                $this->posts = $wpdb->get_results($this->request); 
    25682603 
    2569                         $r = array(); 
    2570                         foreach ( $this->posts as $post ) 
    2571                                 $r[ $post->ID ] = $post->post_parent; 
     2604                                $r = array(); 
     2605                                foreach ( $this->posts as $post ) 
     2606                                        $r[ $post->ID ] = $post->post_parent; 
    25722607 
    2573                         return $r; 
     2608                                return $r; 
     2609                        } 
     2610 
     2611                        if ( !$q['suppress_filters'] ) { 
     2612                                        $this->request = apply_filters_ref_array( 'posts_request', array( $this->request, &$this, false ) ); 
     2613                                        $this->quick_request = apply_filters_ref_array( 'posts_request', array( $this->quick_request, &$this, true ) ); 
     2614                        } 
     2615 
     2616                        $this->posts = $wpdb->get_results($this->quick_request); 
     2617 
     2618                        $this->found_posts = count($this->posts); 
     2619                        $this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) ); 
     2620                        $this->max_num_pages = ceil( $this->found_posts / $q['posts_per_page'] ); 
     2621                } else { 
     2622                        $this->request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits"; 
     2623                        if ( !$q['suppress_filters'] ) 
     2624                                        $this->request = apply_filters_ref_array( 'posts_request', array( $this->request, &$this, false ) ); 
     2625 
     2626                        $post_ids = $wpdb->get_col($this->request); 
     2627 
     2628                        if ( empty($post_ids) ) { 
     2629                                        $this->found_posts = 0; 
     2630                                        $this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) ); 
     2631                                        $this->max_num_pages = ceil( $this->found_posts / $q['posts_per_page'] ); 
     2632 
     2633                                        $this->quick_request = " SELECT $quick_distinct $quick_fields FROM $wpdb->posts $quick_join WHERE 1=1 $quick_where $quick_groupby $orderby"; 
     2634                                        if ( !$q['suppress_filters'] ) 
     2635                                                        $this->quick_request = apply_filters_ref_array('posts_request', array( $this->quick_request, &$this, true ) ); 
     2636 
     2637                                        $this->posts = array(); // no point in querying, since there are no posts 
     2638                        } else { 
     2639                                        $found_posts_query = apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) ); 
     2640                                        $this->found_posts = $wpdb->get_var( $found_posts_query ); 
     2641                                        $this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) ); 
     2642                                        $this->max_num_pages = ceil( $this->found_posts / $q['posts_per_page'] ); 
     2643 
     2644                                        $post_ids = implode(',', $post_ids); 
     2645                                        $this->quick_request = " SELECT $quick_distinct $quick_fields FROM $wpdb->posts $quick_join WHERE 1 = 1 $quick_where AND $wpdb->posts.ID IN ($post_ids) $quick_groupby ORDER BY FIELD( $wpdb->posts.ID, $post_ids ) "; 
     2646 
     2647                                        if ( !$q['suppress_filters'] ) 
     2648                                                        $this->quick_request = apply_filters_ref_array( 'posts_request', array( $this->quick_request, &$this, true ) ); 
     2649 
     2650                                        $this->posts = $wpdb->get_results($this->quick_request); 
     2651                        } 
    25742652                } 
    25752653 
    2576                 $this->posts = $wpdb->get_results($this->request); 
    2577  
    25782654                // Raw results filter.  Prior to status checks. 
    25792655                if ( !$q['suppress_filters'] ) 
    25802656                        $this->posts = apply_filters_ref_array('posts_results', array( $this->posts, &$this ) );