WordPress Version: 5.5
/**
* Updates the value of a network option that was already added.
*
* @since 4.4.0
*
* @see update_option()
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param int $network_id ID of the network. Can be null to default to the current network ID.
* @param string $option Name of the option. Expected to not be SQL-escaped.
* @param mixed $value Option value. Expected to not be SQL-escaped.
* @return bool True if the value was updated, false otherwise.
*/
function update_network_option($network_id, $option, $value)
{
global $wpdb;
if ($network_id && !is_numeric($network_id)) {
return false;
}
$network_id = (int) $network_id;
// Fallback to the current network if a network ID is not specified.
if (!$network_id) {
$network_id = get_current_network_id();
}
wp_protect_special_option($option);
$old_value = get_network_option($network_id, $option, false);
/**
* Filters a specific network option before its value is updated.
*
* The dynamic portion of the hook name, `$option`, refers to the option name.
*
* @since 2.9.0 As 'pre_update_site_option_' . $key
* @since 3.0.0
* @since 4.4.0 The `$option` parameter was added.
* @since 4.7.0 The `$network_id` parameter was added.
*
* @param mixed $value New value of the network option.
* @param mixed $old_value Old value of the network option.
* @param string $option Option name.
* @param int $network_id ID of the network.
*/
$value = apply_filters("pre_update_site_option_{$option}", $value, $old_value, $option, $network_id);
/*
* If the new and old values are the same, no need to update.
*
* Unserialized values will be adequate in most cases. If the unserialized
* data differs, the (maybe) serialized data is checked to avoid
* unnecessary database calls for otherwise identical object instances.
*
* See https://core.trac.wordpress.org/ticket/44956
*/
if ($value === $old_value || maybe_serialize($value) === maybe_serialize($old_value)) {
return false;
}
if (false === $old_value) {
return add_network_option($network_id, $option, $value);
}
$notoptions_key = "{$network_id}:notoptions";
$notoptions = wp_cache_get($notoptions_key, 'site-options');
if (is_array($notoptions) && isset($notoptions[$option])) {
unset($notoptions[$option]);
wp_cache_set($notoptions_key, $notoptions, 'site-options');
}
if (!is_multisite()) {
$result = update_option($option, $value, 'no');
} else {
$value = sanitize_option($option, $value);
$serialized_value = maybe_serialize($value);
$result = $wpdb->update($wpdb->sitemeta, array('meta_value' => $serialized_value), array('site_id' => $network_id, 'meta_key' => $option));
if ($result) {
$cache_key = "{$network_id}:{$option}";
wp_cache_set($cache_key, $value, 'site-options');
}
}
if ($result) {
/**
* Fires after the value of a specific network option has been successfully updated.
*
* The dynamic portion of the hook name, `$option`, refers to the option name.
*
* @since 2.9.0 As "update_site_option_{$key}"
* @since 3.0.0
* @since 4.7.0 The `$network_id` parameter was added.
*
* @param string $option Name of the network option.
* @param mixed $value Current value of the network option.
* @param mixed $old_value Old value of the network option.
* @param int $network_id ID of the network.
*/
do_action("update_site_option_{$option}", $option, $value, $old_value, $network_id);
/**
* Fires after the value of a network option has been successfully updated.
*
* @since 3.0.0
* @since 4.7.0 The `$network_id` parameter was added.
*
* @param string $option Name of the network option.
* @param mixed $value Current value of the network option.
* @param mixed $old_value Old value of the network option.
* @param int $network_id ID of the network.
*/
do_action('update_site_option', $option, $value, $old_value, $network_id);
return true;
}
return false;
}