From 2da45425aee724a8026ac447f3dccecbf14148a2 Mon Sep 17 00:00:00 2001 From: spacedmonkey Date: Wed, 29 Mar 2023 10:50:18 +0000 Subject: [PATCH] Options, Meta APIs: Improve the lazy loading meta API to include current object id. The existing lazy loading meta api, creates a queue of ids, to be primed, if the `get_comment_meta` or `get_term_meta` functions are called. However, it did not check to see if the requested id was in the queue, before prime all the ids in the queue. Now, it adds the id to the queue, is not already in the queue, saving a cache lookup / database query. Props spacedmonkey, peterwilsoncc, mukesh27, flixos90. Fixes #57901. Built from https://develop.svn.wordpress.org/trunk@55608 git-svn-id: http://core.svn.wordpress.org/trunk@55120 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/class-wp-metadata-lazyloader.php | 55 ++++++++++++++------ wp-includes/version.php | 2 +- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/wp-includes/class-wp-metadata-lazyloader.php b/wp-includes/class-wp-metadata-lazyloader.php index 4a03633de0..fa2067c5c2 100644 --- a/wp-includes/class-wp-metadata-lazyloader.php +++ b/wp-includes/class-wp-metadata-lazyloader.php @@ -55,11 +55,11 @@ class WP_Metadata_Lazyloader { $this->settings = array( 'term' => array( 'filter' => 'get_term_metadata', - 'callback' => array( $this, 'lazyload_term_meta' ), + 'callback' => array( $this, 'lazyload_meta_callback' ), ), 'comment' => array( 'filter' => 'get_comment_metadata', - 'callback' => array( $this, 'lazyload_comment_meta' ), + 'callback' => array( $this, 'lazyload_meta_callback' ), ), ); } @@ -91,7 +91,7 @@ class WP_Metadata_Lazyloader { } } - add_filter( $type_settings['filter'], $type_settings['callback'] ); + add_filter( $type_settings['filter'], $type_settings['callback'], 10, 5 ); /** * Fires after objects are added to the metadata lazy-load queue. @@ -131,20 +131,15 @@ class WP_Metadata_Lazyloader { * is no need to invoke it directly. * * @since 4.5.0 + * @deprecated 6.3.0 Use WP_Metadata_Lazyloader::lazyload_meta_callback() instead. * * @param mixed $check The `$check` param passed from the 'get_term_metadata' hook. * @return mixed In order not to short-circuit `get_metadata()`. Generally, this is `null`, but it could be * another value if filtered by a plugin. */ public function lazyload_term_meta( $check ) { - if ( ! empty( $this->pending_objects['term'] ) ) { - update_termmeta_cache( array_keys( $this->pending_objects['term'] ) ); - - // No need to run again for this set of terms. - $this->reset_queue( 'term' ); - } - - return $check; + _deprecated_function( __METHOD__, '6.3.0', 'WP_Metadata_Lazyloader::lazyload_meta_callback' ); + return $this->lazyload_meta_callback( $check, 0, '', false, 'term' ); } /** @@ -154,18 +149,48 @@ class WP_Metadata_Lazyloader { * directly, from either inside or outside the `WP_Query` object. * * @since 4.5.0 + * @deprecated 6.3.0 Use WP_Metadata_Lazyloader::lazyload_meta_callback() instead. * * @param mixed $check The `$check` param passed from the {@see 'get_comment_metadata'} hook. * @return mixed The original value of `$check`, so as not to short-circuit `get_comment_metadata()`. */ public function lazyload_comment_meta( $check ) { - if ( ! empty( $this->pending_objects['comment'] ) ) { - update_meta_cache( 'comment', array_keys( $this->pending_objects['comment'] ) ); + _deprecated_function( __METHOD__, '6.3.0', 'WP_Metadata_Lazyloader::lazyload_meta_callback' ); + return $this->lazyload_meta_callback( $check, 0, '', false, 'comment' ); + } - // No need to run again for this set of comments. - $this->reset_queue( 'comment' ); + /** + * Lazy-loads meta for queued objects. + * + * This method is public so that it can be used as a filter callback. As a rule, there + * is no need to invoke it directly. + * + * @since 6.3.0 + * + * @param mixed $check The `$check` param passed from the 'get_*_metadata' hook. + * @param int $object_id ID of the object metadata is for. + * @param string $meta_key Unused. + * @param bool $single Unused. + * @param string $meta_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user', + * or any other object type with an associated meta table. + * @return mixed In order not to short-circuit `get_metadata()`. Generally, this is `null`, but it could be + * another value if filtered by a plugin. + */ + public function lazyload_meta_callback( $check, $object_id, $meta_key, $single, $meta_type ) { + if ( empty( $this->pending_objects[ $meta_type ] ) ) { + return $check; } + $object_ids = array_keys( $this->pending_objects[ $meta_type ] ); + if ( $object_id && ! in_array( $object_id, $object_ids, true ) ) { + $object_ids[] = $object_id; + } + + update_meta_cache( $meta_type, $object_ids ); + + // No need to run again for this set of objects. + $this->reset_queue( $meta_type ); + return $check; } } diff --git a/wp-includes/version.php b/wp-includes/version.php index 8e75165f25..6bb7403feb 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.3-alpha-55607'; +$wp_version = '6.3-alpha-55608'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.