Make WordPress Core


Ignore:
Timestamp:
11/29/2022 08:27:29 PM (4 years ago)
Author:
ocean90
Message:

Query: Account for primed post caches without primed post meta/term caches.

In [54352] update_post_caches() was replaced by _prime_post_caches() to reduce excessive object cache calls. That's because _prime_post_caches() checks first if post IDs aren't already cached. Unfortunately this becomes an issue if a post itself is cached but not the meta/terms.
To fix this regression, _prime_post_caches() now always calls update_postmeta_cache() and update_object_term_cache() depending on the arguments passed to it. Both functions internally check whether IDs are already cached so the fix from [54352] remains in place.

Props peterwilsoncc, spacedmonkey, ocean90.
Fixes #57163.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/query/cacheResults.php

    r54771 r54894  
    12381238                $query_1 = new WP_Query(
    12391239                        array(
    1240                                 'post_type' => 'page',
    1241                                 'fields'    => $fields,
    1242                                 'author'    => self::$author_id,
     1240                                'post_type'              => 'page',
     1241                                'fields'                 => $fields,
     1242                                'author'                 => self::$author_id,
     1243                                'update_post_meta_cache' => false,
     1244                                'update_post_term_cache' => false,
    12431245                        )
    12441246                );
     
    12481250                $query_1->the_post();
    12491251                $num_loop_queries = get_num_queries() - $start_loop_queries;
     1252                /*
     1253                 * Two expected queries:
     1254                 * 1: User meta data,
     1255                 * 2: User data.
     1256                 */
    12501257                $this->assertSame( 2, $num_loop_queries, 'Unexpected number of queries while initializing the loop.' );
    12511258
     
    12721279                );
    12731280        }
     1281
     1282        /**
     1283         * Ensure lazy loading term meta queries all term meta in a single query.
     1284         *
     1285         * @since 6.1.2
     1286         * @ticket 57163
     1287         * @ticket 22176
     1288         */
     1289        public function test_get_post_meta_lazy_loads_all_term_meta_data() {
     1290                $query = new WP_Query();
     1291
     1292                $t2 = $this->factory()->term->create(
     1293                        array(
     1294                                'taxonomy' => 'category',
     1295                                'slug'     => 'bar',
     1296                                'name'     => 'Bar',
     1297                        )
     1298                );
     1299
     1300                wp_set_post_terms( self::$posts[0], $t2, 'category', true );
     1301                // Clean data added to cache by factory and setting terms.
     1302                clean_term_cache( array( self::$t1, $t2 ), 'category' );
     1303                clean_post_cache( self::$posts[0] );
     1304
     1305                $num_queries_start = get_num_queries();
     1306                $query_posts       = $query->query(
     1307                        array(
     1308                                'lazy_load_term_meta' => true,
     1309                                'no_found_rows'       => true,
     1310                        )
     1311                );
     1312                $num_queries       = get_num_queries() - $num_queries_start;
     1313
     1314                /*
     1315                 * Four expected queries:
     1316                 * 1: Post IDs
     1317                 * 2: Post data
     1318                 * 3: Post meta data.
     1319                 * 4: Post term data.
     1320                 */
     1321                $this->assertSame( 4, $num_queries, 'Unexpected number of queries while querying posts.' );
     1322                $this->assertNotEmpty( $query_posts, 'Query posts is empty.' );
     1323
     1324                $num_queries_start = get_num_queries();
     1325                get_term_meta( self::$t1 );
     1326                $num_queries = get_num_queries() - $num_queries_start;
     1327
     1328                /*
     1329                 * One expected query:
     1330                 * 1: Term meta data.
     1331                 */
     1332                $this->assertSame( 1, $num_queries, 'Unexpected number of queries during first query of term meta.' );
     1333
     1334                $num_queries_start = get_num_queries();
     1335                get_term_meta( $t2 );
     1336                $num_queries = get_num_queries() - $num_queries_start;
     1337
     1338                // No additional queries expected.
     1339                $this->assertSame( 0, $num_queries, 'Unexpected number of queries during second query of term meta.' );
     1340        }
    12741341}
Note: See TracChangeset for help on using the changeset viewer.