From cc0246c154bc090bc95849f27a2747b3e524f116 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Mon, 30 Oct 2023 22:58:24 +0000 Subject: [PATCH] Options, Meta APIs: Fast follow fixes for option cache priming functions. A collection of fixes for `wp_prime_option_caches()`: * cache arrays and objects in their serialized form for consistency with `get_option()` and `wp_load_alloptions()` * prevent repeat database queries for falsey and known non-existent options (notoptions) Additional tests for `wp_prime_option_caches()` to ensure: * additional database queries are not made repriming options (known, known-unknown and alloptions) * cache is primed consistently * `get_option()` returns a consistent value regardless of how it is primed * database queries do not contain earlier primed options * `get_option` does not prime the cache when testing the cache has been successfully primed Fixes a test for `wp_prime_option_caches_by_group()` to ensure `get_option` does not prime the cache when testing the cache has been successfully primed. Follow up to [56445],[56990],[57013]. Props peterwilsoncc, costdev, flixos90, hellofromTonya, mikeschroder, joemcgill. Fixes #59738. See #58962. Built from https://develop.svn.wordpress.org/trunk@57029 git-svn-id: http://core.svn.wordpress.org/trunk@56540 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/option.php | 23 +++++++++++++++-------- wp-includes/version.php | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/wp-includes/option.php b/wp-includes/option.php index e587931173..13f5d49c87 100644 --- a/wp-includes/option.php +++ b/wp-includes/option.php @@ -261,11 +261,19 @@ function get_option( $option, $default_value = false ) { function wp_prime_option_caches( $options ) { $alloptions = wp_load_alloptions(); $cached_options = wp_cache_get_multiple( $options, 'options' ); + $notoptions = wp_cache_get( 'notoptions', 'options' ); + if ( ! is_array( $notoptions ) ) { + $notoptions = array(); + } // Filter options that are not in the cache. $options_to_prime = array(); foreach ( $options as $option ) { - if ( ( ! isset( $cached_options[ $option ] ) || ! $cached_options[ $option ] ) && ! isset( $alloptions[ $option ] ) ) { + if ( + ( ! isset( $cached_options[ $option ] ) || false === $cached_options[ $option ] ) + && ! isset( $alloptions[ $option ] ) + && ! isset( $notoptions[ $option ] ) + ) { $options_to_prime[] = $option; } } @@ -288,7 +296,12 @@ function wp_prime_option_caches( $options ) { $options_found = array(); foreach ( $results as $result ) { - $options_found[ $result->option_name ] = maybe_unserialize( $result->option_value ); + /* + * The cache is primed with the raw value (i.e. not maybe_unserialized). + * + * `get_option()` will handle unserializing the value as needed. + */ + $options_found[ $result->option_name ] = $result->option_value; } wp_cache_set_multiple( $options_found, 'options' ); @@ -299,12 +312,6 @@ function wp_prime_option_caches( $options ) { $options_not_found = array_diff( $options_to_prime, array_keys( $options_found ) ); - $notoptions = wp_cache_get( 'notoptions', 'options' ); - - if ( ! is_array( $notoptions ) ) { - $notoptions = array(); - } - // Add the options that were not found to the cache. $update_notoptions = false; foreach ( $options_not_found as $option_name ) { diff --git a/wp-includes/version.php b/wp-includes/version.php index edb1860748..de5bc9f1e0 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.5-alpha-57028'; +$wp_version = '6.5-alpha-57029'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.