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].

Reviewed by flixos90, hellofromTonya, joemcgill.
Merges [57029] to the 6.4 branch.

Props peterwilsoncc, costdev, flixos90, hellofromTonya, mikeschroder, joemcgill.
Fixes #59738. See #58962.


Built from https://develop.svn.wordpress.org/branches/6.4@57030


git-svn-id: http://core.svn.wordpress.org/branches/6.4@56541 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Peter Wilson 2023-10-30 23:23:24 +00:00
parent d9d85ab4ac
commit 46a2d34de2
2 changed files with 16 additions and 9 deletions

View File

@ -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 ) {

View File

@ -16,7 +16,7 @@
*
* @global string $wp_version
*/
$wp_version = '6.4-RC2-57025';
$wp_version = '6.4-RC2-57030';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.