diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php index 458b7898c2e8b..3833a7a5a5fb8 100644 --- a/src/wp-includes/class-wp-query.php +++ b/src/wp-includes/class-wp-query.php @@ -3270,10 +3270,11 @@ public function get_posts() { return $post_parents; } + $is_unfiltered_query = $old_request == $this->request && "{$wpdb->posts}.*" === $fields; + if ( null === $this->posts ) { $split_the_query = ( - $old_request == $this->request - && "{$wpdb->posts}.*" === $fields + $is_unfiltered_query && ( wp_using_ext_object_cache() || ( ! empty( $limits ) && $q['posts_per_page'] < 500 ) @@ -3337,6 +3338,8 @@ public function get_posts() { $this->posts = array_map( 'get_post', $this->posts ); } + $unfiltered_posts = $this->posts; + if ( $q['cache_results'] && $id_query_is_cacheable && ! $cache_found ) { $post_ids = wp_list_pluck( $this->posts, 'ID' ); @@ -3529,7 +3532,12 @@ public function get_posts() { $this->posts = array_map( 'get_post', $this->posts ); if ( $q['cache_results'] ) { - update_post_caches( $this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); + if ( $is_unfiltered_query && $unfiltered_posts === $this->posts ) { + update_post_caches( $this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); + } else { + $post_ids = wp_list_pluck( $this->posts, 'ID' ); + _prime_post_caches( $post_ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); + } } /** @var WP_Post */ diff --git a/tests/phpunit/tests/query/cacheResults.php b/tests/phpunit/tests/query/cacheResults.php index 6ddaffd273ab2..b3923d8229fea 100644 --- a/tests/phpunit/tests/query/cacheResults.php +++ b/tests/phpunit/tests/query/cacheResults.php @@ -1079,6 +1079,85 @@ public function test_query_cache_delete_term() { $this->assertNotSame( $query1->found_posts, $query2->found_posts ); } + /** + * @ticket 58599 + */ + public function test_query_posts_fields_request() { + global $wpdb; + + $args = array( + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'no_found_rows' => true, + ); + + add_filter( 'posts_fields_request', array( $this, 'filter_posts_fields_request' ) ); + + $before = get_num_queries(); + $query1 = new WP_Query(); + $posts1 = $query1->query( $args ); + $after = get_num_queries(); + + foreach ( $posts1 as $_post ) { + $this->assertNotSame( get_post( $_post->ID )->post_content, $_post->post_content ); + } + + $this->assertSame( 2, $after - $before, 'There should only be 2 queries run, one for request and one prime post objects.' ); + + $this->assertStringContainsString( + "SELECT $wpdb->posts.*", + $wpdb->last_query, + 'Check that _prime_post_caches is called.' + ); + } + + public function filter_posts_fields_request( $fields ) { + global $wpdb; + return "{$wpdb->posts}.ID"; + } + + /** + * @ticket 58599 + * @dataProvider data_query_filter_posts_results + */ + public function test_query_filter_posts_results( $filter ) { + global $wpdb; + + $args = array( + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'no_found_rows' => true, + ); + + add_filter( $filter, array( $this, 'filter_posts_results' ) ); + + $before = get_num_queries(); + $query1 = new WP_Query(); + $posts1 = $query1->query( $args ); + $after = get_num_queries(); + + $this->assertCount( 1, $posts1 ); + + $this->assertSame( 2, $after - $before, 'There should only be 2 queries run, one for request and one prime post objects.' ); + + $this->assertStringContainsString( + "SELECT $wpdb->posts.*", + $wpdb->last_query, + 'Check that _prime_post_caches is called.' + ); + } + + public function filter_posts_results() { + return array( get_post( self::$posts[0] ) ); + } + + public function data_query_filter_posts_results() { + return array( + array( 'posts_results' ), + array( 'the_posts' ), + ); + } + /** * @ticket 22176 */