Make WordPress Core

Changeset 53482


Ignore:
Timestamp:
06/10/2022 01:37:52 PM (23 months ago)
Author:
spacedmonkey
Message:

Prime users cache in WP_Query and post REST API controller.

For a call to WP_Query or a post REST API request that contains posts from multiple authors, call the cache_users function, to ensure that all user data for post authors is primed in
a single database query. This results in far fewer database queries on multiple author sites.

Props spacedmonkey, timothyblynjacobs, peterwilsoncc.
Fixes #55716.

Location:
trunk
Files:
5 edited

Legend:

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

    r53469 r53482  
    34353435    public function the_post() {
    34363436        global $post;
     3437        if ( ! $this->in_the_loop ) {
     3438            update_post_author_caches( $this->posts );
     3439        }
    34373440        $this->in_the_loop = true;
    34383441
  • trunk/src/wp-includes/pluggable.php

    r53480 r53482  
    133133        global $wpdb;
    134134
     135        update_meta_cache( 'user', $user_ids );
     136
    135137        $clean = _get_non_cached_ids( $user_ids, 'users' );
    136138
     
    142144
    143145        $users = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($list)" );
    144 
    145         $ids = array();
    146146        foreach ( $users as $user ) {
    147147            update_user_caches( $user );
    148             $ids[] = $user->ID;
    149         }
    150         update_meta_cache( 'user', $ids );
     148        }
    151149    }
    152150endif;
  • trunk/src/wp-includes/post.php

    r53456 r53482  
    74767476
    74777477/**
     7478 * Prime post author user caches.
     7479 *
     7480 * @since 6.1.0
     7481 *
     7482 * @param WP_Post[] $posts Array of Post objects
     7483 */
     7484function update_post_author_caches( $posts ) {
     7485    $author_ids = wp_list_pluck( $posts, 'post_author' );
     7486    $author_ids = array_map( 'absint', $author_ids );
     7487    $author_ids = array_unique( array_filter( $author_ids ) );
     7488    cache_users( $author_ids );
     7489}
     7490
     7491/**
    74787492 * Updates metadata cache for list of post IDs.
    74797493 *
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    r52363 r53482  
    369369
    370370        $posts = array();
     371
     372        update_post_author_caches( $query_result );
    371373
    372374        foreach ( $query_result as $post ) {
  • trunk/tests/phpunit/tests/query.php

    r53370 r53482  
    622622
    623623    /**
     624     * @ticket 55716
     625     */
     626    public function test_prime_user_cache() {
     627        $action = new MockAction();
     628        add_filter( 'update_user_metadata_cache', array( $action, 'filter' ), 10, 2 );
     629        $user_ids = array();
     630        $count    = 5;
     631        for ( $i = 0; $i < $count; $i ++ ) {
     632            $user_ids[ $i ] = self::factory()->user->create();
     633            self::factory()->post->create(
     634                array(
     635                    'post_type'   => 'post',
     636                    'post_author' => $user_ids[ $i ],
     637                )
     638            );
     639        }
     640
     641        $q = new WP_Query(
     642            array(
     643                'post_type'      => 'post',
     644                'posts_per_page' => $count,
     645            )
     646        );
     647        while ( $q->have_posts() ) {
     648            $q->the_post();
     649        }
     650
     651        $args      = $action->get_args();
     652        $last_args = end( $args );
     653        $this->assertSameSets( $user_ids, $last_args[1], 'Ensure that user ids are primed' );
     654    }
     655
     656    /**
    624657     * @ticket 35601
    625658     */
Note: See TracChangeset for help on using the changeset viewer.