Make WordPress Core


Ignore:
Timestamp:
10/30/2023 10:56:25 PM (8 months ago)
Author:
peterwilsoncc
Message:

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.

File:
1 edited

Legend:

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

    r57013 r57029  
    262262    $alloptions     = wp_load_alloptions();
    263263    $cached_options = wp_cache_get_multiple( $options, 'options' );
     264    $notoptions     = wp_cache_get( 'notoptions', 'options' );
     265    if ( ! is_array( $notoptions ) ) {
     266        $notoptions = array();
     267    }
    264268
    265269    // Filter options that are not in the cache.
    266270    $options_to_prime = array();
    267271    foreach ( $options as $option ) {
    268         if ( ( ! isset( $cached_options[ $option ] ) || ! $cached_options[ $option ] ) && ! isset( $alloptions[ $option ] ) ) {
     272        if (
     273            ( ! isset( $cached_options[ $option ] ) || false === $cached_options[ $option ] )
     274            && ! isset( $alloptions[ $option ] )
     275            && ! isset( $notoptions[ $option ] )
     276        ) {
    269277            $options_to_prime[] = $option;
    270278        }
     
    289297    $options_found = array();
    290298    foreach ( $results as $result ) {
    291         $options_found[ $result->option_name ] = maybe_unserialize( $result->option_value );
     299        /*
     300         * The cache is primed with the raw value (i.e. not maybe_unserialized).
     301         *
     302         * `get_option()` will handle unserializing the value as needed.
     303         */
     304        $options_found[ $result->option_name ] = $result->option_value;
    292305    }
    293306    wp_cache_set_multiple( $options_found, 'options' );
     
    299312
    300313    $options_not_found = array_diff( $options_to_prime, array_keys( $options_found ) );
    301 
    302     $notoptions = wp_cache_get( 'notoptions', 'options' );
    303 
    304     if ( ! is_array( $notoptions ) ) {
    305         $notoptions = array();
    306     }
    307314
    308315    // Add the options that were not found to the cache.
Note: See TracChangeset for help on using the changeset viewer.