Multisite: Ensure the `{$network_id}:notoptions` array is set in cache in `get_network_option()`.

Prior to this change, the `{$network_id}:notoptions` cache would only be fetched, but not set, unless the actual database lookup would be unsuccessful. This enhancement slightly improves performance by preventing unnecessary external object cache lookups if one is used.

Fixes #43506.


git-svn-id: https://develop.svn.wordpress.org/trunk@42833 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Felix Arntz 2018-03-13 15:36:14 +00:00
parent 5f56921131
commit 52a77e5254
2 changed files with 52 additions and 1 deletions

View File

@ -1247,7 +1247,7 @@ function get_network_option( $network_id, $option, $default = false ) {
$notoptions_key = "$network_id:notoptions";
$notoptions = wp_cache_get( $notoptions_key, 'site-options' );
if ( isset( $notoptions[ $option ] ) ) {
if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {
/**
* Filters a specific default network option.
@ -1295,6 +1295,11 @@ function get_network_option( $network_id, $option, $default = false ) {
}
}
if ( ! is_array( $notoptions ) ) {
$notoptions = array();
wp_cache_set( $notoptions_key, $notoptions, 'site-options' );
}
/**
* Filters the value of an existing network option.
*

View File

@ -121,4 +121,50 @@ class Tests_Option_NetworkOption extends WP_UnitTestCase {
array( 'string', false ),
);
}
/**
* @ticket 43506
*/
public function test_get_network_option_sets_notoptions_if_option_found() {
$network_id = get_current_network_id();
$notoptions_key = "$network_id:notoptions";
$original_cache = wp_cache_get( $notoptions_key, 'site-options' );
if ( false !== $original_cache ) {
wp_cache_delete( $notoptions_key, 'site-options' );
}
// Retrieve any existing option.
get_network_option( $network_id, 'site_name' );
$cache = wp_cache_get( $notoptions_key, 'site-options' );
if ( false !== $original_cache ) {
wp_cache_set( $notoptions_key, $original_cache, 'site-options' );
}
$this->assertSame( array(), $cache );
}
/**
* @ticket 43506
*/
public function test_get_network_option_sets_notoptions_if_option_not_found() {
$network_id = get_current_network_id();
$notoptions_key = "$network_id:notoptions";
$original_cache = wp_cache_get( $notoptions_key, 'site-options' );
if ( false !== $original_cache ) {
wp_cache_delete( $notoptions_key, 'site-options' );
}
// Retrieve any non-existing option.
get_network_option( $network_id, 'this_does_not_exist' );
$cache = wp_cache_get( $notoptions_key, 'site-options' );
if ( false !== $original_cache ) {
wp_cache_set( $notoptions_key, $original_cache, 'site-options' );
}
$this->assertSame( array( 'this_does_not_exist' => true ), $cache );
}
}