diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 077873b7b2..062a2de765 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -203,6 +203,10 @@ function is_serialized_string($data) { function get_option($setting) { global $wpdb; + // prevent non-existent options from triggering multiple queries + if ( true === wp_cache_get($setting, 'notoptions') ) + return false; + $value = wp_cache_get($setting, 'options'); if ( false === $value ) { @@ -215,7 +219,8 @@ function get_option($setting) { if( is_object( $row) ) { // Has to be get_row instead of get_var because of funkiness with 0, false, null values $value = $row->option_value; wp_cache_set($setting, $value, 'options'); - } else { + } else { // option does not exist, so we must cache its non-existence + wp_cache_set($setting, true, 'notoptions'); return false; } } @@ -274,6 +279,9 @@ function update_option($option_name, $newvalue) { return true; } + if ( true === wp_cache_get($option_name, 'notoptions') ) + wp_cache_delete($option_name, 'notoptions'); + $_newvalue = $newvalue; $newvalue = maybe_serialize($newvalue);