Make WordPress Core

Changeset 55671


Ignore:
Timestamp:
04/21/2023 09:22:04 AM (22 months ago)
Author:
spacedmonkey
Message:

Taxonomy: Always lazily load term meta.

In [34529] introduced lazy loading of term meta. However, this was only in the context of WP_Query. Other parts of the codebase, like WP_Term_Query did not lazily load term meta. In this change, calls to update_termmeta_cache are now replaced with wp_lazyload_term_meta, that instead of priming term meta caches, just adds them to the queue to be primed it ever called. This results in far less database queries, as there a number of places where term meta is being primed unnecessarily and never used. Adding everything to the term meta queue, also means that if term meta is used, that is all loaded in a single database / cache call.

Props spacedmonkey, mukesh27, peterwilsoncc.
Fixes #57645.

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-term-query.php

    r55526 r55671  
    866866        if ( $args['update_term_meta_cache'] ) {
    867867            $term_ids = wp_list_pluck( $term_objects, 'term_id' );
    868             update_termmeta_cache( $term_ids );
     868            wp_lazyload_term_meta( $term_ids );
    869869        }
    870870
  • trunk/src/wp-includes/post.php

    r55642 r55671  
    76937693    }
    76947694
    7695     if ( $term_ids ) {
    7696         $lazyloader = wp_metadata_lazyloader();
    7697         $lazyloader->queue_objects( 'term', $term_ids );
    7698     }
     7695    wp_lazyload_term_meta( $term_ids );
    76997696}
    77007697
  • trunk/src/wp-includes/taxonomy.php

    r55526 r55671  
    14271427}
    14281428
     1429
     1430/**
     1431 * Queue term meta for lazy-loading.
     1432 *
     1433 * @since 6.3.0
     1434 *
     1435 * @param array $term_ids List of term IDs.
     1436 */
     1437function wp_lazyload_term_meta( array $term_ids ) {
     1438    if ( empty( $term_ids ) ) {
     1439        return;
     1440    }
     1441    $lazyloader = wp_metadata_lazyloader();
     1442    $lazyloader->queue_objects( 'term', $term_ids );
     1443}
     1444
    14291445/**
    14301446 * Gets all meta data, including meta IDs, for the given term ID.
     
    40044020 * @since 4.6.0
    40054021 * @since 6.1.0 This function is no longer marked as "private".
     4022 * @since 6.3.0 Use wp_lazyload_term_meta() for lazy-loading of term meta.
    40064023 *
    40074024 * @global wpdb $wpdb WordPress database abstraction object.
     
    40184035
    40194036        update_term_cache( $fresh_terms );
    4020 
    4021         if ( $update_meta_cache ) {
    4022             update_termmeta_cache( $non_cached_ids );
    4023         }
     4037    }
     4038
     4039    if ( $update_meta_cache ) {
     4040        wp_lazyload_term_meta( $term_ids );
    40244041    }
    40254042}
  • trunk/tests/phpunit/includes/abstract-testcase.php

    r55657 r55671  
    196196        wp_set_current_user( 0 );
    197197
    198         $lazyloader = wp_metadata_lazyloader();
    199         $lazyloader->reset_queue( 'term' );
    200         $lazyloader->reset_queue( 'comment' );
     198        $this->reset_lazyload_queue();
    201199    }
    202200
     
    275273        }
    276274
     275    }
     276
     277    /**
     278     * Reset the lazy load meta queue.
     279     */
     280    protected function reset_lazyload_queue() {
     281        $lazyloader = wp_metadata_lazyloader();
     282        $lazyloader->reset_queue( 'term' );
     283        $lazyloader->reset_queue( 'comment' );
    277284    }
    278285
  • trunk/tests/phpunit/tests/post/nav-menu.php

    r55591 r55671  
    305305
    306306        update_menu_item_cache( $query_result );
     307        get_term_meta( $term_id );
    307308
    308309        $args = $action->get_args();
     
    384385        $start_num_queries = get_num_queries();
    385386        wp_get_nav_menu_items( $this->menu_id );
     387        get_term_meta( $term_ids[0] );
    386388        $queries_made = get_num_queries() - $start_num_queries;
    387389        $this->assertSame( 6, $queries_made, 'Only does 6 database queries when running wp_get_nav_menu_items.' );
    388390
    389         $args = $action_terms->get_args();
    390         $last = end( $args );
    391         $this->assertSameSets( $term_ids, $last[1], '_prime_term_caches() was not executed.' );
     391        $args       = $action_terms->get_args();
     392        $first      = reset( $args );
     393        $term_ids[] = $this->menu_id;
     394        $this->assertSameSets( $term_ids, $first[1], '_prime_term_caches() was not executed.' );
    392395
    393396        $args = $action_posts->get_args();
  • trunk/tests/phpunit/tests/query/lazyLoadTermMeta.php

    r55608 r55671  
    4646     */
    4747    public function test_wp_queue_posts_for_term_meta_lazyload() {
     48        $this->reset_lazyload_queue();
    4849        $filter = new MockAction();
    4950        add_filter( 'update_term_metadata_cache', array( $filter, 'filter' ), 10, 2 );
  • trunk/tests/phpunit/tests/term/getTerms.php

    r54402 r55671  
    27572757     * @ticket 10142
    27582758     */
    2759     public function test_termmeta_cache_should_be_primed_by_default() {
     2759    public function test_termmeta_cache_should_be_lazy_loaded_by_default() {
    27602760        global $wpdb;
    27612761
     
    27802780        }
    27812781
    2782         $this->assertSame( $num_queries, $wpdb->num_queries );
     2782        $this->assertSame( $num_queries + 1, $wpdb->num_queries );
    27832783    }
    27842784
  • trunk/tests/phpunit/tests/term/meta.php

    r51568 r55671  
    117117        global $wpdb;
    118118
    119         // Clear any previous term IDs from the queue.
    120         wp_metadata_lazyloader()->reset_queue( 'term' );
    121 
    122119        $p = self::factory()->post->create( array( 'post_status' => 'publish' ) );
    123120
     
    200197            add_term_meta( $t, 'foo', 'bar' );
    201198        }
    202 
     199        $this->reset_lazyload_queue();
    203200        $q = new WP_Query(
    204201            array(
  • trunk/tests/phpunit/tests/term/query.php

    r55083 r55671  
    4545
    4646        $this->assertSameSets( array( $term_2 ), $q->terms );
     47    }
     48
     49    /**
     50     * @ticket 57645
     51     */
     52    public function test_lazy_load_term_meta() {
     53        $filter = new MockAction();
     54        add_filter( 'update_term_metadata_cache', array( $filter, 'filter' ), 10, 2 );
     55        register_taxonomy( 'wptests_tax_1', 'post' );
     56        register_taxonomy( 'wptests_tax_2', 'post' );
     57
     58        $term_1 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax_1' ) );
     59        $term_2 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax_2' ) );
     60
     61        $q = new WP_Term_Query(
     62            array(
     63                'taxonomy'   => 'wptests_tax_1',
     64                'fields'     => 'ids',
     65                'hide_empty' => false,
     66            )
     67        );
     68
     69        $this->assertSameSets( array( $term_1 ), $q->terms );
     70
     71        $q = new WP_Term_Query(
     72            array(
     73                'taxonomy'   => 'wptests_tax_2',
     74                'fields'     => 'ids',
     75                'hide_empty' => false,
     76            )
     77        );
     78
     79        $this->assertSameSets( array( $term_2 ), $q->terms );
     80
     81        get_term_meta( $term_1 );
     82
     83        $args     = $filter->get_args();
     84        $first    = reset( $args );
     85        $term_ids = end( $first );
     86        $this->assertSameSets( $term_ids, array( $term_1, $term_2 ) );
    4787    }
    4888
  • trunk/tests/phpunit/tests/term/wpGetObjectTerms.php

    r53942 r55671  
    616616     * @ticket 10142
    617617     */
    618     public function test_termmeta_cache_should_be_primed_by_default() {
     618    public function test_termmeta_cache_should_be_lazy_loaded_by_default() {
    619619        global $wpdb;
    620620
     
    636636        }
    637637
    638         $this->assertSame( $num_queries, $wpdb->num_queries );
     638        $this->assertSame( $num_queries + 1, $wpdb->num_queries );
    639639    }
    640640
     
    701701        }
    702702
    703         $this->assertSame( $num_queries, $wpdb->num_queries );
     703        $this->assertSame( $num_queries + 1, $wpdb->num_queries );
    704704    }
    705705
     
    734734        }
    735735
    736         $this->assertSame( $num_queries, $wpdb->num_queries );
     736        $this->assertSame( $num_queries + 1, $wpdb->num_queries );
    737737    }
    738738
Note: See TracChangeset for help on using the changeset viewer.