WordPress.org

Make WordPress Core

Ticket #36687: 36687.2.diff

File 36687.2.diff, 2.7 KB (added by dd32, 3 years ago)

Example of the issue and a (extremely lazy) unit test to demonstrate it

  • tests/phpunit/tests/post/query.php

    class Tests_Post_Query extends WP_UnitTe 
    400400                $num_queries = $wpdb->num_queries;
    401401                $q = new WP_Query( array(
    402402                        'fields' => 'ids',
    403403                        'no_found_rows' => true,
    404404                ) );
    405405
    406406                remove_filter( 'posts_pre_query', array( __CLASS__, 'filter_posts_pre_query' ) );
    407407
    408408                $this->assertSame( $num_queries, $wpdb->num_queries );
    409409                $this->assertSame( array( 12345 ), $q->posts );
    410410        }
    411411
    412412        public static function filter_posts_pre_query( $posts ) {
    413413                return array( 12345 );
    414414        }
     415
     416        /**
     417         * @ticket 36687
     418         */
     419        public function test_posts_pre_query_filter_should_respect_set_found_posts() {
     420                global $wpdb;
     421
     422                $post_id = self::factory()->post->create();
     423
     424                // Prevent the DB query
     425                add_filter( 'posts_request', function() { return ''; } );
     426                add_filter( 'found_posts_query', function() { return ''; } );
     427
     428                // Add the post and found_posts
     429                add_filter( 'the_posts', function() use( $post_id ) {
     430                        return array( get_post( $post_id ) );
     431                } );
     432                add_filter( 'found_posts', function() {
     433                        return 1;
     434                } );
     435
     436                $q = new WP_Query( array( 'suppress_filters' => false ) );
     437
     438                $this->assertSame( array( $post_id ), wp_list_pluck( $q->posts, 'ID' ) );
     439                $this->assertSame( 1, $q->found_posts );
     440        }
     441
    415442}
  • src/wp-includes/query.php

    class WP_Query { 
    36413641
    36423642                                if ( $ids ) {
    36433643                                        $this->posts = $ids;
    36443644                                        _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
    36453645                                } else {
    36463646                                        $this->posts = array();
    36473647                                }
    36483648                        } else {
    36493649                                $this->posts = $wpdb->get_results( $this->request );
    36503650                        }
    36513651                }
    36523652
    36533653                // Convert to WP_Post objects and set the found-post totals.
    36543654                if ( $this->posts ) {
    36553655                        $this->posts = array_map( 'get_post', $this->posts );
    3656                         $this->set_found_posts( $q, $limits );
    36573656                }
     3657                $this->set_found_posts( $q, $limits );
    36583658
    36593659                if ( ! $q['suppress_filters'] ) {
    36603660                        /**
    36613661                         * Filters the raw post results array, prior to status checks.
    36623662                         *
    36633663                         * @since 2.3.0
    36643664                         *
    36653665                         * @param array    $posts The post results array.
    36663666                         * @param WP_Query &$this The WP_Query instance (passed by reference).
    36673667                         */
    36683668                        $this->posts = apply_filters_ref_array( 'posts_results', array( $this->posts, &$this ) );
    36693669                }
    36703670
    36713671                if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {
    36723672                        /** This filter is documented in wp-includes/query.php */