2011-12-19 18:15:32 -05:00
< ? php
/**
* Option API
*
* @ package WordPress
2014-02-25 12:14:14 -05:00
* @ subpackage Option
2011-12-19 18:15:32 -05:00
*/
/**
2016-06-26 13:29:30 -04:00
* Retrieves an option value based on an option name .
2011-12-19 18:15:32 -05:00
*
* If the option does not exist or does not have a value , then the return value
* will be false . This is useful to check whether you need to install an option
* and is commonly used during installation of plugin options and to test
* whether upgrading is required .
*
* If the option was serialized then it will be unserialized when it is returned .
*
2016-05-23 15:02:28 -04:00
* Any scalar values will be returned as strings . You may coerce the return type of
* a given option by registering an { @ see 'option_$option' } filter callback .
2016-01-08 22:12:26 -05:00
*
2011-12-19 18:15:32 -05:00
* @ since 1.5 . 0
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 18:17:25 -04:00
*
* @ param string $option Name of option to retrieve . Expected to not be SQL - escaped .
* @ param mixed $default Optional . Default value to return if the option does not exist .
2011-12-19 18:15:32 -05:00
* @ return mixed Value set for the option .
*/
function get_option ( $option , $default = false ) {
global $wpdb ;
2012-11-17 08:20:57 -05:00
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters the value of an existing option before it is retrieved .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* Passing a truthy value to the filter will short - circuit retrieving
* the option value , returning the passed value instead .
*
* @ since 1.5 . 0
2015-08-27 13:00:24 -04:00
* @ since 4.4 . 0 The `$option` parameter was added .
2014-03-02 18:35:13 -05:00
*
* @ param bool | mixed $pre_option Value to return instead of the option value .
* Default false to skip it .
2015-08-25 17:42:20 -04:00
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
$pre = apply_filters ( " pre_option_ { $option } " , false , $option );
2011-12-19 18:15:32 -05:00
if ( false !== $pre )
return $pre ;
if ( defined ( 'WP_SETUP_CONFIG' ) )
return false ;
Use `wp_installing()` instead of `WP_INSTALLING` constant.
The `WP_INSTALLING` constant is a flag that WordPress sets in a number of
places, telling the system that options should be fetched directly from the
database instead of from the cache, that WP should not ping wordpress.org for
updates, that the normal "not installed" checks should be bypassed, and so on.
A constant is generally necessary for this purpose, because the flag is
typically set before the WP bootstrap, meaning that WP functions are not yet
available. However, it is possible - notably, during `wpmu_create_blog()` -
for the "installing" flag to be set after WP has already loaded. In these
cases, `WP_INSTALLING` would be set for the remainder of the process, since
there's no way to change a constant once it's defined. This, in turn, polluted
later function calls that ought to have been outside the scope of site
creation, particularly the non-caching of option data. The problem was
particularly evident in the case of the automated tests, where `WP_INSTALLING`
was set the first time a site was created, and remained set for the rest of the
suite.
The new `wp_installing()` function allows developers to fetch the current
installation status (when called without any arguments) or to set the
installation status (when called with a boolean `true` or `false`). Use of
the `WP_INSTALLING` constant is still supported; `wp_installing()` will default
to `true` if the constant is defined during the bootstrap.
Props boonebgorges, jeremyfelt.
See #31130.
Built from https://develop.svn.wordpress.org/trunk@34828
git-svn-id: http://core.svn.wordpress.org/trunk@34793 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-05 11:06:28 -04:00
if ( ! wp_installing () ) {
2011-12-19 18:15:32 -05:00
// prevent non-existent options from triggering multiple queries
$notoptions = wp_cache_get ( 'notoptions' , 'options' );
2014-12-16 00:52:23 -05:00
if ( isset ( $notoptions [ $option ] ) ) {
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters the default value for an option .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.4 . 0
2015-08-28 11:18:22 -04:00
* @ since 4.4 . 0 The `$option` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $default The default value to return if the option does not exist
* in the database .
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
return apply_filters ( " default_option_ { $option } " , $default , $option );
2014-12-16 00:52:23 -05:00
}
2011-12-19 18:15:32 -05:00
$alloptions = wp_load_alloptions ();
if ( isset ( $alloptions [ $option ] ) ) {
$value = $alloptions [ $option ];
} else {
$value = wp_cache_get ( $option , 'options' );
if ( false === $value ) {
$row = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1 " , $option ) );
// Has to be get_row instead of get_var because of funkiness with 0, false, null values
if ( is_object ( $row ) ) {
$value = $row -> option_value ;
wp_cache_add ( $option , $value , 'options' );
} else { // option does not exist, so we must cache its non-existence
2015-06-25 15:01:26 -04:00
if ( ! is_array ( $notoptions ) ) {
2015-10-07 13:11:25 -04:00
$notoptions = array ();
2015-06-25 15:01:26 -04:00
}
2011-12-19 18:15:32 -05:00
$notoptions [ $option ] = true ;
wp_cache_set ( 'notoptions' , $notoptions , 'options' );
2014-03-02 18:35:13 -05:00
/** This filter is documented in wp-includes/option.php */
2015-08-25 17:42:20 -04:00
return apply_filters ( 'default_option_' . $option , $default , $option );
2011-12-19 18:15:32 -05:00
}
}
}
} else {
$suppress = $wpdb -> suppress_errors ();
$row = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1 " , $option ) );
$wpdb -> suppress_errors ( $suppress );
2014-03-02 18:35:13 -05:00
if ( is_object ( $row ) ) {
2011-12-19 18:15:32 -05:00
$value = $row -> option_value ;
2014-03-02 18:35:13 -05:00
} else {
/** This filter is documented in wp-includes/option.php */
2015-08-25 17:42:20 -04:00
return apply_filters ( 'default_option_' . $option , $default , $option );
2014-03-02 18:35:13 -05:00
}
2011-12-19 18:15:32 -05:00
}
// If home is not set use siteurl.
if ( 'home' == $option && '' == $value )
return get_option ( 'siteurl' );
if ( in_array ( $option , array ( 'siteurl' , 'home' , 'category_base' , 'tag_base' ) ) )
$value = untrailingslashit ( $value );
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters the value of an existing option .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 1.5 . 0 As 'option_' . $setting
* @ since 3.0 . 0
2015-08-28 11:20:20 -04:00
* @ since 4.4 . 0 The `$option` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $value Value of the option . If stored serialized , it will be
* unserialized prior to being returned .
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
return apply_filters ( " option_ { $option } " , maybe_unserialize ( $value ), $option );
2011-12-19 18:15:32 -05:00
}
/**
* Protect WordPress special option from being modified .
*
* Will die if $option is in protected list . Protected options are 'alloptions'
* and 'notoptions' options .
*
* @ since 2.2 . 0
*
* @ param string $option Option name .
*/
function wp_protect_special_option ( $option ) {
2013-02-28 11:49:20 -05:00
if ( 'alloptions' === $option || 'notoptions' === $option )
2011-12-19 18:15:32 -05:00
wp_die ( sprintf ( __ ( '%s is a protected WP option and may not be modified' ), esc_html ( $option ) ) );
}
/**
* Print option value after sanitizing for forms .
*
* @ since 1.5 . 0
*
* @ param string $option Option name .
*/
function form_option ( $option ) {
echo esc_attr ( get_option ( $option ) );
}
/**
* Loads and caches all autoloaded options , if available or all options .
*
* @ since 2.2 . 0
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 18:17:25 -04:00
*
2011-12-19 18:15:32 -05:00
* @ return array List of all options .
*/
function wp_load_alloptions () {
global $wpdb ;
Use `wp_installing()` instead of `WP_INSTALLING` constant.
The `WP_INSTALLING` constant is a flag that WordPress sets in a number of
places, telling the system that options should be fetched directly from the
database instead of from the cache, that WP should not ping wordpress.org for
updates, that the normal "not installed" checks should be bypassed, and so on.
A constant is generally necessary for this purpose, because the flag is
typically set before the WP bootstrap, meaning that WP functions are not yet
available. However, it is possible - notably, during `wpmu_create_blog()` -
for the "installing" flag to be set after WP has already loaded. In these
cases, `WP_INSTALLING` would be set for the remainder of the process, since
there's no way to change a constant once it's defined. This, in turn, polluted
later function calls that ought to have been outside the scope of site
creation, particularly the non-caching of option data. The problem was
particularly evident in the case of the automated tests, where `WP_INSTALLING`
was set the first time a site was created, and remained set for the rest of the
suite.
The new `wp_installing()` function allows developers to fetch the current
installation status (when called without any arguments) or to set the
installation status (when called with a boolean `true` or `false`). Use of
the `WP_INSTALLING` constant is still supported; `wp_installing()` will default
to `true` if the constant is defined during the bootstrap.
Props boonebgorges, jeremyfelt.
See #31130.
Built from https://develop.svn.wordpress.org/trunk@34828
git-svn-id: http://core.svn.wordpress.org/trunk@34793 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-05 11:06:28 -04:00
if ( ! wp_installing () || ! is_multisite () )
2011-12-19 18:15:32 -05:00
$alloptions = wp_cache_get ( 'alloptions' , 'options' );
else
$alloptions = false ;
if ( ! $alloptions ) {
$suppress = $wpdb -> suppress_errors ();
if ( ! $alloptions_db = $wpdb -> get_results ( " SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes' " ) )
$alloptions_db = $wpdb -> get_results ( " SELECT option_name, option_value FROM $wpdb->options " );
$wpdb -> suppress_errors ( $suppress );
$alloptions = array ();
foreach ( ( array ) $alloptions_db as $o ) {
$alloptions [ $o -> option_name ] = $o -> option_value ;
}
Use `wp_installing()` instead of `WP_INSTALLING` constant.
The `WP_INSTALLING` constant is a flag that WordPress sets in a number of
places, telling the system that options should be fetched directly from the
database instead of from the cache, that WP should not ping wordpress.org for
updates, that the normal "not installed" checks should be bypassed, and so on.
A constant is generally necessary for this purpose, because the flag is
typically set before the WP bootstrap, meaning that WP functions are not yet
available. However, it is possible - notably, during `wpmu_create_blog()` -
for the "installing" flag to be set after WP has already loaded. In these
cases, `WP_INSTALLING` would be set for the remainder of the process, since
there's no way to change a constant once it's defined. This, in turn, polluted
later function calls that ought to have been outside the scope of site
creation, particularly the non-caching of option data. The problem was
particularly evident in the case of the automated tests, where `WP_INSTALLING`
was set the first time a site was created, and remained set for the rest of the
suite.
The new `wp_installing()` function allows developers to fetch the current
installation status (when called without any arguments) or to set the
installation status (when called with a boolean `true` or `false`). Use of
the `WP_INSTALLING` constant is still supported; `wp_installing()` will default
to `true` if the constant is defined during the bootstrap.
Props boonebgorges, jeremyfelt.
See #31130.
Built from https://develop.svn.wordpress.org/trunk@34828
git-svn-id: http://core.svn.wordpress.org/trunk@34793 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-05 11:06:28 -04:00
if ( ! wp_installing () || ! is_multisite () )
2011-12-19 18:15:32 -05:00
wp_cache_add ( 'alloptions' , $alloptions , 'options' );
}
return $alloptions ;
}
/**
* Loads and caches certain often requested site options if is_multisite () and a persistent cache is not being used .
*
* @ since 3.0 . 0
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 18:17:25 -04:00
*
2011-12-19 18:15:32 -05:00
* @ param int $site_id Optional site ID for which to query the options . Defaults to the current site .
*/
function wp_load_core_site_options ( $site_id = null ) {
2013-09-06 14:10:09 -04:00
global $wpdb ;
2011-12-19 18:15:32 -05:00
Use `wp_installing()` instead of `WP_INSTALLING` constant.
The `WP_INSTALLING` constant is a flag that WordPress sets in a number of
places, telling the system that options should be fetched directly from the
database instead of from the cache, that WP should not ping wordpress.org for
updates, that the normal "not installed" checks should be bypassed, and so on.
A constant is generally necessary for this purpose, because the flag is
typically set before the WP bootstrap, meaning that WP functions are not yet
available. However, it is possible - notably, during `wpmu_create_blog()` -
for the "installing" flag to be set after WP has already loaded. In these
cases, `WP_INSTALLING` would be set for the remainder of the process, since
there's no way to change a constant once it's defined. This, in turn, polluted
later function calls that ought to have been outside the scope of site
creation, particularly the non-caching of option data. The problem was
particularly evident in the case of the automated tests, where `WP_INSTALLING`
was set the first time a site was created, and remained set for the rest of the
suite.
The new `wp_installing()` function allows developers to fetch the current
installation status (when called without any arguments) or to set the
installation status (when called with a boolean `true` or `false`). Use of
the `WP_INSTALLING` constant is still supported; `wp_installing()` will default
to `true` if the constant is defined during the bootstrap.
Props boonebgorges, jeremyfelt.
See #31130.
Built from https://develop.svn.wordpress.org/trunk@34828
git-svn-id: http://core.svn.wordpress.org/trunk@34793 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-05 11:06:28 -04:00
if ( ! is_multisite () || wp_using_ext_object_cache () || wp_installing () )
2011-12-19 18:15:32 -05:00
return ;
if ( empty ( $site_id ) )
$site_id = $wpdb -> siteid ;
2012-09-11 18:22:20 -04:00
$core_options = array ( 'site_name' , 'siteurl' , 'active_sitewide_plugins' , '_site_transient_timeout_theme_roots' , '_site_transient_theme_roots' , 'site_admins' , 'can_compress_scripts' , 'global_terms_enabled' , 'ms_files_rewriting' );
2011-12-19 18:15:32 -05:00
$core_options_in = " ' " . implode ( " ', ' " , $core_options ) . " ' " ;
$options = $wpdb -> get_results ( $wpdb -> prepare ( " SELECT meta_key, meta_value FROM $wpdb->sitemeta WHERE meta_key IN ( $core_options_in ) AND site_id = %d " , $site_id ) );
foreach ( $options as $option ) {
$key = $option -> meta_key ;
$cache_key = " { $site_id } : $key " ;
$option -> meta_value = maybe_unserialize ( $option -> meta_value );
wp_cache_set ( $cache_key , $option -> meta_value , 'site-options' );
}
}
/**
* Update the value of an option that was already added .
*
* You do not need to serialize values . If the value needs to be serialized , then
* it will be serialized before it is inserted into the database . Remember ,
* resources can not be serialized or added as an option .
*
2015-05-10 12:58:27 -04:00
* If the option does not exist , then the option will be added with the option value ,
* with an `$autoload` value of 'yes' .
2011-12-19 18:15:32 -05:00
*
* @ since 1.0 . 0
2015-03-05 14:13:25 -05:00
* @ since 4.2 . 0 The `$autoload` parameter was added .
2011-12-19 18:15:32 -05:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 18:17:25 -04:00
*
2015-03-05 14:13:25 -05:00
* @ param string $option Option name . Expected to not be SQL - escaped .
* @ param mixed $value Option value . Must be serializable if non - scalar . Expected to not be SQL - escaped .
2015-03-06 08:57:26 -05:00
* @ param string | bool $autoload Optional . Whether to load the option when WordPress starts up . For existing options ,
* `$autoload` can only be updated using `update_option()` if `$value` is also changed .
2015-05-10 12:58:27 -04:00
* Accepts 'yes' | true to enable or 'no' | false to disable . For non - existent options ,
* the default value is 'yes' . Default null .
2011-12-19 18:15:32 -05:00
* @ return bool False if value was not updated and true if value was updated .
*/
2015-03-06 08:57:26 -05:00
function update_option ( $option , $value , $autoload = null ) {
2011-12-19 18:15:32 -05:00
global $wpdb ;
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
wp_protect_special_option ( $option );
2013-10-02 16:43:10 -04:00
if ( is_object ( $value ) )
$value = clone $value ;
2011-12-19 18:15:32 -05:00
2013-10-02 16:43:10 -04:00
$value = sanitize_option ( $option , $value );
$old_value = get_option ( $option );
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters a specific option before its value is ( maybe ) serialized and updated .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.6 . 0
2015-08-28 11:22:20 -04:00
* @ since 4.4 . 0 The `$option` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $value The new , unserialized option value .
* @ param mixed $old_value The old option value .
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
$value = apply_filters ( " pre_update_option_ { $option } " , $value , $old_value , $option );
2011-12-19 18:15:32 -05:00
2014-03-28 09:57:14 -04:00
/**
2016-05-22 14:34:26 -04:00
* Filters an option before its value is ( maybe ) serialized and updated .
2014-03-28 09:57:14 -04:00
*
* @ since 3.9 . 0
*
* @ param mixed $value The new , unserialized option value .
* @ param string $option Name of the option .
* @ param mixed $old_value The old option value .
*/
$value = apply_filters ( 'pre_update_option' , $value , $option , $old_value );
2011-12-19 18:15:32 -05:00
// If the new and old values are the same, no need to update.
2013-10-02 16:43:10 -04:00
if ( $value === $old_value )
2011-12-19 18:15:32 -05:00
return false ;
2015-02-18 14:14:27 -05:00
/** This filter is documented in wp-includes/option.php */
2016-05-05 16:24:29 -04:00
if ( apply_filters ( 'default_option_' . $option , false , $option ) === $old_value ) {
2015-03-06 08:57:26 -05:00
// Default setting for new options is 'yes'.
if ( null === $autoload ) {
$autoload = 'yes' ;
}
2015-03-05 14:13:25 -05:00
return add_option ( $option , $value , '' , $autoload );
}
2013-10-02 16:43:10 -04:00
$serialized_value = maybe_serialize ( $value );
2014-03-02 18:35:13 -05:00
/**
* Fires immediately before an option value is updated .
*
* @ since 2.9 . 0
*
* @ param string $option Name of the option to update .
* @ param mixed $old_value The old option value .
* @ param mixed $value The new option value .
*/
2013-10-25 22:57:09 -04:00
do_action ( 'update_option' , $option , $old_value , $value );
2014-03-02 18:35:13 -05:00
2015-03-06 08:57:26 -05:00
$update_args = array (
'option_value' => $serialized_value ,
);
if ( null !== $autoload ) {
$update_args [ 'autoload' ] = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes' ;
}
$result = $wpdb -> update ( $wpdb -> options , $update_args , array ( 'option_name' => $option ) );
2013-10-02 16:43:10 -04:00
if ( ! $result )
return false ;
2011-12-19 18:15:32 -05:00
$notoptions = wp_cache_get ( 'notoptions' , 'options' );
if ( is_array ( $notoptions ) && isset ( $notoptions [ $option ] ) ) {
unset ( $notoptions [ $option ] );
wp_cache_set ( 'notoptions' , $notoptions , 'options' );
}
Use `wp_installing()` instead of `WP_INSTALLING` constant.
The `WP_INSTALLING` constant is a flag that WordPress sets in a number of
places, telling the system that options should be fetched directly from the
database instead of from the cache, that WP should not ping wordpress.org for
updates, that the normal "not installed" checks should be bypassed, and so on.
A constant is generally necessary for this purpose, because the flag is
typically set before the WP bootstrap, meaning that WP functions are not yet
available. However, it is possible - notably, during `wpmu_create_blog()` -
for the "installing" flag to be set after WP has already loaded. In these
cases, `WP_INSTALLING` would be set for the remainder of the process, since
there's no way to change a constant once it's defined. This, in turn, polluted
later function calls that ought to have been outside the scope of site
creation, particularly the non-caching of option data. The problem was
particularly evident in the case of the automated tests, where `WP_INSTALLING`
was set the first time a site was created, and remained set for the rest of the
suite.
The new `wp_installing()` function allows developers to fetch the current
installation status (when called without any arguments) or to set the
installation status (when called with a boolean `true` or `false`). Use of
the `WP_INSTALLING` constant is still supported; `wp_installing()` will default
to `true` if the constant is defined during the bootstrap.
Props boonebgorges, jeremyfelt.
See #31130.
Built from https://develop.svn.wordpress.org/trunk@34828
git-svn-id: http://core.svn.wordpress.org/trunk@34793 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-05 11:06:28 -04:00
if ( ! wp_installing () ) {
2011-12-19 18:15:32 -05:00
$alloptions = wp_load_alloptions ();
if ( isset ( $alloptions [ $option ] ) ) {
2013-10-02 16:43:10 -04:00
$alloptions [ $option ] = $serialized_value ;
2011-12-19 18:15:32 -05:00
wp_cache_set ( 'alloptions' , $alloptions , 'options' );
} else {
2013-10-02 16:43:10 -04:00
wp_cache_set ( $option , $serialized_value , 'options' );
2011-12-19 18:15:32 -05:00
}
}
2014-03-02 18:35:13 -05:00
/**
* Fires after the value of a specific option has been successfully updated .
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.0 . 1
2015-08-28 11:24:21 -04:00
* @ since 4.4 . 0 The `$option` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $old_value The old option value .
* @ param mixed $value The new option value .
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2015-08-25 17:42:20 -04:00
do_action ( " update_option_ { $option } " , $old_value , $value , $option );
2014-03-02 18:35:13 -05:00
/**
* Fires after the value of an option has been successfully updated .
*
* @ since 2.9 . 0
*
* @ param string $option Name of the updated option .
* @ param mixed $old_value The old option value .
* @ param mixed $value The new option value .
*/
2013-10-02 16:43:10 -04:00
do_action ( 'updated_option' , $option , $old_value , $value );
return true ;
2011-12-19 18:15:32 -05:00
}
/**
* Add a new option .
*
* You do not need to serialize values . If the value needs to be serialized , then
* it will be serialized before it is inserted into the database . Remember ,
* resources can not be serialized or added as an option .
*
* You can create options without values and then update the values later .
* Existing options will not be updated and checks are performed to ensure that you
* aren ' t adding a protected WordPress option . Care should be taken to not name
* options the same as the ones which are protected .
*
* @ since 1.0 . 0
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 18:17:25 -04:00
*
2014-11-30 17:56:25 -05:00
* @ param string $option Name of option to add . Expected to not be SQL - escaped .
* @ param mixed $value Optional . Option value . Must be serializable if non - scalar . Expected to not be SQL - escaped .
* @ param string $deprecated Optional . Description . Not used anymore .
2015-01-25 02:51:23 -05:00
* @ param string | bool $autoload Optional . Whether to load the option when WordPress starts up .
* Default is enabled . Accepts 'no' to disable for legacy reasons .
2011-12-19 18:15:32 -05:00
* @ return bool False if option was not added and true if option was added .
*/
function add_option ( $option , $value = '' , $deprecated = '' , $autoload = 'yes' ) {
global $wpdb ;
if ( ! empty ( $deprecated ) )
2016-07-06 08:40:29 -04:00
_deprecated_argument ( __FUNCTION__ , '2.3.0' );
2011-12-19 18:15:32 -05:00
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
wp_protect_special_option ( $option );
if ( is_object ( $value ) )
$value = clone $value ;
$value = sanitize_option ( $option , $value );
// Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query
$notoptions = wp_cache_get ( 'notoptions' , 'options' );
if ( ! is_array ( $notoptions ) || ! isset ( $notoptions [ $option ] ) )
2015-02-18 14:14:27 -05:00
/** This filter is documented in wp-includes/option.php */
2016-05-05 16:24:29 -04:00
if ( apply_filters ( 'default_option_' . $option , false , $option ) !== get_option ( $option ) )
2011-12-19 18:15:32 -05:00
return false ;
2013-10-02 16:43:10 -04:00
$serialized_value = maybe_serialize ( $value );
2015-01-25 02:51:23 -05:00
$autoload = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes' ;
2014-03-02 18:35:13 -05:00
/**
* Fires before an option is added .
*
* @ since 2.9 . 0
*
* @ param string $option Name of the option to add .
* @ param mixed $value Value of the option .
*/
2013-10-02 16:43:10 -04:00
do_action ( 'add_option' , $option , $value );
$result = $wpdb -> query ( $wpdb -> prepare ( " INSERT INTO ` $wpdb->options ` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`) " , $option , $serialized_value , $autoload ) );
if ( ! $result )
return false ;
Use `wp_installing()` instead of `WP_INSTALLING` constant.
The `WP_INSTALLING` constant is a flag that WordPress sets in a number of
places, telling the system that options should be fetched directly from the
database instead of from the cache, that WP should not ping wordpress.org for
updates, that the normal "not installed" checks should be bypassed, and so on.
A constant is generally necessary for this purpose, because the flag is
typically set before the WP bootstrap, meaning that WP functions are not yet
available. However, it is possible - notably, during `wpmu_create_blog()` -
for the "installing" flag to be set after WP has already loaded. In these
cases, `WP_INSTALLING` would be set for the remainder of the process, since
there's no way to change a constant once it's defined. This, in turn, polluted
later function calls that ought to have been outside the scope of site
creation, particularly the non-caching of option data. The problem was
particularly evident in the case of the automated tests, where `WP_INSTALLING`
was set the first time a site was created, and remained set for the rest of the
suite.
The new `wp_installing()` function allows developers to fetch the current
installation status (when called without any arguments) or to set the
installation status (when called with a boolean `true` or `false`). Use of
the `WP_INSTALLING` constant is still supported; `wp_installing()` will default
to `true` if the constant is defined during the bootstrap.
Props boonebgorges, jeremyfelt.
See #31130.
Built from https://develop.svn.wordpress.org/trunk@34828
git-svn-id: http://core.svn.wordpress.org/trunk@34793 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-05 11:06:28 -04:00
if ( ! wp_installing () ) {
2011-12-19 18:15:32 -05:00
if ( 'yes' == $autoload ) {
$alloptions = wp_load_alloptions ();
2013-10-02 16:43:10 -04:00
$alloptions [ $option ] = $serialized_value ;
2011-12-19 18:15:32 -05:00
wp_cache_set ( 'alloptions' , $alloptions , 'options' );
} else {
2013-10-02 16:43:10 -04:00
wp_cache_set ( $option , $serialized_value , 'options' );
2011-12-19 18:15:32 -05:00
}
}
// This option exists now
$notoptions = wp_cache_get ( 'notoptions' , 'options' ); // yes, again... we need it to be fresh
if ( is_array ( $notoptions ) && isset ( $notoptions [ $option ] ) ) {
unset ( $notoptions [ $option ] );
wp_cache_set ( 'notoptions' , $notoptions , 'options' );
}
2014-03-02 18:35:13 -05:00
/**
* Fires after a specific option has been added .
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.5 . 0 As " add_option_ { $name } "
* @ since 3.0 . 0
*
* @ param string $option Name of the option to add .
* @ param mixed $value Value of the option .
*/
2013-10-02 16:43:10 -04:00
do_action ( " add_option_ { $option } " , $option , $value );
2014-03-02 18:35:13 -05:00
/**
* Fires after an option has been added .
*
* @ since 2.9 . 0
*
* @ param string $option Name of the added option .
* @ param mixed $value Value of the option .
*/
2013-10-02 16:43:10 -04:00
do_action ( 'added_option' , $option , $value );
return true ;
2011-12-19 18:15:32 -05:00
}
/**
* Removes option by name . Prevents removal of protected WordPress options .
*
* @ since 1.2 . 0
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 18:17:25 -04:00
*
2011-12-19 18:15:32 -05:00
* @ param string $option Name of option to remove . Expected to not be SQL - escaped .
* @ return bool True , if option is successfully deleted . False on failure .
*/
function delete_option ( $option ) {
global $wpdb ;
2013-02-28 11:49:20 -05:00
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
2011-12-19 18:15:32 -05:00
wp_protect_special_option ( $option );
// Get the ID, if no ID then return
$row = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT autoload FROM $wpdb->options WHERE option_name = %s " , $option ) );
if ( is_null ( $row ) )
return false ;
2014-03-02 18:35:13 -05:00
/**
* Fires immediately before an option is deleted .
*
* @ since 2.9 . 0
*
* @ param string $option Name of the option to delete .
*/
2011-12-19 18:15:32 -05:00
do_action ( 'delete_option' , $option );
2014-03-02 18:35:13 -05:00
2012-03-24 11:24:31 -04:00
$result = $wpdb -> delete ( $wpdb -> options , array ( 'option_name' => $option ) );
Use `wp_installing()` instead of `WP_INSTALLING` constant.
The `WP_INSTALLING` constant is a flag that WordPress sets in a number of
places, telling the system that options should be fetched directly from the
database instead of from the cache, that WP should not ping wordpress.org for
updates, that the normal "not installed" checks should be bypassed, and so on.
A constant is generally necessary for this purpose, because the flag is
typically set before the WP bootstrap, meaning that WP functions are not yet
available. However, it is possible - notably, during `wpmu_create_blog()` -
for the "installing" flag to be set after WP has already loaded. In these
cases, `WP_INSTALLING` would be set for the remainder of the process, since
there's no way to change a constant once it's defined. This, in turn, polluted
later function calls that ought to have been outside the scope of site
creation, particularly the non-caching of option data. The problem was
particularly evident in the case of the automated tests, where `WP_INSTALLING`
was set the first time a site was created, and remained set for the rest of the
suite.
The new `wp_installing()` function allows developers to fetch the current
installation status (when called without any arguments) or to set the
installation status (when called with a boolean `true` or `false`). Use of
the `WP_INSTALLING` constant is still supported; `wp_installing()` will default
to `true` if the constant is defined during the bootstrap.
Props boonebgorges, jeremyfelt.
See #31130.
Built from https://develop.svn.wordpress.org/trunk@34828
git-svn-id: http://core.svn.wordpress.org/trunk@34793 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-05 11:06:28 -04:00
if ( ! wp_installing () ) {
2011-12-19 18:15:32 -05:00
if ( 'yes' == $row -> autoload ) {
$alloptions = wp_load_alloptions ();
if ( is_array ( $alloptions ) && isset ( $alloptions [ $option ] ) ) {
unset ( $alloptions [ $option ] );
wp_cache_set ( 'alloptions' , $alloptions , 'options' );
}
} else {
wp_cache_delete ( $option , 'options' );
}
}
if ( $result ) {
2014-03-02 18:35:13 -05:00
/**
* Fires after a specific option has been deleted .
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
*
* @ param string $option Name of the deleted option .
*/
2016-08-22 14:25:31 -04:00
do_action ( " delete_option_ { $option } " , $option );
2014-03-02 18:35:13 -05:00
/**
* Fires after an option has been deleted .
*
* @ since 2.9 . 0
*
* @ param string $option Name of the deleted option .
*/
2011-12-19 18:15:32 -05:00
do_action ( 'deleted_option' , $option );
return true ;
}
return false ;
}
/**
* Delete a transient .
*
* @ since 2.8 . 0
*
* @ param string $transient Transient name . Expected to not be SQL - escaped .
* @ return bool true if successful , false otherwise
*/
function delete_transient ( $transient ) {
2014-03-02 18:35:13 -05:00
/**
* Fires immediately before a specific transient is deleted .
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
*
* @ param string $transient Transient name .
*/
2016-08-22 14:25:31 -04:00
do_action ( " delete_transient_ { $transient } " , $transient );
2011-12-19 18:15:32 -05:00
2013-09-06 14:10:09 -04:00
if ( wp_using_ext_object_cache () ) {
2011-12-19 18:15:32 -05:00
$result = wp_cache_delete ( $transient , 'transient' );
} else {
$option_timeout = '_transient_timeout_' . $transient ;
$option = '_transient_' . $transient ;
$result = delete_option ( $option );
if ( $result )
delete_option ( $option_timeout );
}
2014-03-02 18:35:13 -05:00
if ( $result ) {
/**
* Fires after a transient is deleted .
*
* @ since 3.0 . 0
*
* @ param string $transient Deleted transient name .
*/
2011-12-19 18:15:32 -05:00
do_action ( 'deleted_transient' , $transient );
2014-03-02 18:35:13 -05:00
}
2011-12-19 18:15:32 -05:00
return $result ;
}
/**
* Get the value of a transient .
*
2014-06-05 11:34:14 -04:00
* If the transient does not exist , does not have a value , or has expired ,
* then the return value will be false .
2011-12-19 18:15:32 -05:00
*
* @ since 2.8 . 0
*
2014-06-05 11:34:14 -04:00
* @ param string $transient Transient name . Expected to not be SQL - escaped .
* @ return mixed Value of transient .
2011-12-19 18:15:32 -05:00
*/
function get_transient ( $transient ) {
2014-03-02 18:35:13 -05:00
2015-08-25 17:42:20 -04:00
/**
2016-05-22 14:34:26 -04:00
* Filters the value of an existing transient .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* Passing a truthy value to the filter will effectively short - circuit retrieval
* of the transient , returning the passed value instead .
*
* @ since 2.8 . 0
2015-08-28 11:25:21 -04:00
* @ since 4.4 . 0 The `$transient` parameter was added
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $pre_transient The default value to return if the transient does not exist .
* Any value other than false will short - circuit the retrieval
* of the transient , and return the returned value .
* @ param string $transient Transient name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
$pre = apply_filters ( " pre_transient_ { $transient } " , false , $transient );
2011-12-19 18:15:32 -05:00
if ( false !== $pre )
return $pre ;
2013-09-06 14:10:09 -04:00
if ( wp_using_ext_object_cache () ) {
2011-12-19 18:15:32 -05:00
$value = wp_cache_get ( $transient , 'transient' );
} else {
$transient_option = '_transient_' . $transient ;
Use `wp_installing()` instead of `WP_INSTALLING` constant.
The `WP_INSTALLING` constant is a flag that WordPress sets in a number of
places, telling the system that options should be fetched directly from the
database instead of from the cache, that WP should not ping wordpress.org for
updates, that the normal "not installed" checks should be bypassed, and so on.
A constant is generally necessary for this purpose, because the flag is
typically set before the WP bootstrap, meaning that WP functions are not yet
available. However, it is possible - notably, during `wpmu_create_blog()` -
for the "installing" flag to be set after WP has already loaded. In these
cases, `WP_INSTALLING` would be set for the remainder of the process, since
there's no way to change a constant once it's defined. This, in turn, polluted
later function calls that ought to have been outside the scope of site
creation, particularly the non-caching of option data. The problem was
particularly evident in the case of the automated tests, where `WP_INSTALLING`
was set the first time a site was created, and remained set for the rest of the
suite.
The new `wp_installing()` function allows developers to fetch the current
installation status (when called without any arguments) or to set the
installation status (when called with a boolean `true` or `false`). Use of
the `WP_INSTALLING` constant is still supported; `wp_installing()` will default
to `true` if the constant is defined during the bootstrap.
Props boonebgorges, jeremyfelt.
See #31130.
Built from https://develop.svn.wordpress.org/trunk@34828
git-svn-id: http://core.svn.wordpress.org/trunk@34793 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-05 11:06:28 -04:00
if ( ! wp_installing () ) {
2011-12-19 18:15:32 -05:00
// If option is not in alloptions, it is not autoloaded and thus has a timeout
$alloptions = wp_load_alloptions ();
if ( ! isset ( $alloptions [ $transient_option ] ) ) {
$transient_timeout = '_transient_timeout_' . $transient ;
2015-07-07 12:45:26 -04:00
$timeout = get_option ( $transient_timeout );
if ( false !== $timeout && $timeout < time () ) {
2011-12-19 18:15:32 -05:00
delete_option ( $transient_option );
delete_option ( $transient_timeout );
2013-08-21 15:14:09 -04:00
$value = false ;
2011-12-19 18:15:32 -05:00
}
}
}
2013-08-21 15:14:09 -04:00
if ( ! isset ( $value ) )
$value = get_option ( $transient_option );
2011-12-19 18:15:32 -05:00
}
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters an existing transient ' s value .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.8 . 0
2015-08-28 11:27:20 -04:00
* @ since 4.4 . 0 The `$transient` parameter was added
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $value Value of transient .
* @ param string $transient Transient name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
return apply_filters ( " transient_ { $transient } " , $value , $transient );
2011-12-19 18:15:32 -05:00
}
/**
* Set / update the value of a transient .
*
* You do not need to serialize values . If the value needs to be serialized , then
* it will be serialized before it is set .
*
* @ since 2.8 . 0
*
2014-06-11 12:33:15 -04:00
* @ param string $transient Transient name . Expected to not be SQL - escaped . Must be
2015-09-11 11:10:27 -04:00
* 172 characters or fewer in length .
2014-06-11 12:33:15 -04:00
* @ param mixed $value Transient value . Must be serializable if non - scalar .
* Expected to not be SQL - escaped .
2015-10-13 17:31:25 -04:00
* @ param int $expiration Optional . Time until expiration in seconds . Default 0 ( no expiration ) .
2011-12-19 18:15:32 -05:00
* @ return bool False if value was not set and true if value was set .
*/
function set_transient ( $transient , $value , $expiration = 0 ) {
2014-03-02 18:35:13 -05:00
2015-02-11 12:12:26 -05:00
$expiration = ( int ) $expiration ;
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters a specific transient before its value is set .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
2015-08-28 11:29:21 -04:00
* @ since 4.2 . 0 The `$expiration` parameter was added .
* @ since 4.4 . 0 The `$transient` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $value New value of transient .
* @ param int $expiration Time until expiration in seconds .
* @ param string $transient Transient name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
$value = apply_filters ( " pre_set_transient_ { $transient } " , $value , $expiration , $transient );
2011-12-19 18:15:32 -05:00
2015-10-06 10:10:25 -04:00
/**
2016-05-22 14:34:26 -04:00
* Filters the expiration for a transient before its value is set .
2015-10-06 10:10:25 -04:00
*
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
*
* @ since 4.4 . 0
*
2015-10-13 17:31:25 -04:00
* @ param int $expiration Time until expiration in seconds . Use 0 for no expiration .
2015-10-06 13:59:25 -04:00
* @ param mixed $value New value of transient .
2015-10-06 10:10:25 -04:00
* @ param string $transient Transient name .
*/
2016-08-22 14:25:31 -04:00
$expiration = apply_filters ( " expiration_of_transient_ { $transient } " , $expiration , $value , $transient );
2015-10-06 10:10:25 -04:00
2013-09-06 14:10:09 -04:00
if ( wp_using_ext_object_cache () ) {
2011-12-19 18:15:32 -05:00
$result = wp_cache_set ( $transient , $value , 'transient' , $expiration );
} else {
$transient_timeout = '_transient_timeout_' . $transient ;
2015-10-29 07:52:28 -04:00
$transient_option = '_transient_' . $transient ;
if ( false === get_option ( $transient_option ) ) {
2011-12-19 18:15:32 -05:00
$autoload = 'yes' ;
if ( $expiration ) {
$autoload = 'no' ;
add_option ( $transient_timeout , time () + $expiration , '' , 'no' );
}
2015-10-29 07:52:28 -04:00
$result = add_option ( $transient_option , $value , '' , $autoload );
2011-12-19 18:15:32 -05:00
} else {
2014-03-25 14:23:14 -04:00
// If expiration is requested, but the transient has no timeout option,
// delete, then re-create transient rather than update.
$update = true ;
if ( $expiration ) {
if ( false === get_option ( $transient_timeout ) ) {
2015-10-29 07:52:28 -04:00
delete_option ( $transient_option );
2014-03-25 14:23:14 -04:00
add_option ( $transient_timeout , time () + $expiration , '' , 'no' );
2015-10-29 07:52:28 -04:00
$result = add_option ( $transient_option , $value , '' , 'no' );
2014-03-25 14:23:14 -04:00
$update = false ;
} else {
update_option ( $transient_timeout , time () + $expiration );
}
}
if ( $update ) {
2015-10-29 07:52:28 -04:00
$result = update_option ( $transient_option , $value );
2014-03-25 14:23:14 -04:00
}
2011-12-19 18:15:32 -05:00
}
}
2014-03-02 18:35:13 -05:00
2011-12-19 18:15:32 -05:00
if ( $result ) {
2014-03-02 18:35:13 -05:00
/**
* Fires after the value for a specific transient has been set .
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
2015-10-12 17:02:25 -04:00
* @ since 3.6 . 0 The `$value` and `$expiration` parameters were added .
* @ since 4.4 . 0 The `$transient` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-10-12 17:02:25 -04:00
* @ param mixed $value Transient value .
2015-10-13 17:31:25 -04:00
* @ param int $expiration Time until expiration in seconds .
2015-10-12 17:02:25 -04:00
* @ param string $transient The name of the transient .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
do_action ( " set_transient_ { $transient } " , $value , $expiration , $transient );
2014-03-02 18:35:13 -05:00
/**
* Fires after the value for a transient has been set .
*
* @ since 3.0 . 0
2015-10-12 17:02:25 -04:00
* @ since 3.6 . 0 The `$value` and `$expiration` parameters were added .
2014-03-02 18:35:13 -05:00
*
* @ param string $transient The name of the transient .
* @ param mixed $value Transient value .
2015-10-13 17:31:25 -04:00
* @ param int $expiration Time until expiration in seconds .
2014-03-02 18:35:13 -05:00
*/
2013-06-16 00:06:12 -04:00
do_action ( 'setted_transient' , $transient , $value , $expiration );
2011-12-19 18:15:32 -05:00
}
return $result ;
}
/**
* Saves and restores user interface settings stored in a cookie .
*
* Checks if the current user - settings cookie is updated and stores it . When no
* cookie exists ( different browser used ), adds the last saved cookie restoring
* the settings .
*
* @ since 2.7 . 0
*/
function wp_user_settings () {
2016-08-23 10:33:30 -04:00
if ( ! is_admin () || wp_doing_ajax () ) {
2011-12-19 18:15:32 -05:00
return ;
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
2014-08-02 16:09:16 -04:00
if ( ! $user_id = get_current_user_id () ) {
2011-12-19 18:15:32 -05:00
return ;
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
2014-08-02 16:09:16 -04:00
if ( is_super_admin () && ! is_user_member_of_blog () ) {
2012-10-17 14:58:09 -04:00
return ;
2014-08-02 16:09:16 -04:00
}
2012-10-17 14:58:09 -04:00
2013-08-23 17:43:09 -04:00
$settings = ( string ) get_user_option ( 'user-settings' , $user_id );
2011-12-19 18:15:32 -05:00
2014-08-12 22:47:16 -04:00
if ( isset ( $_COOKIE [ 'wp-settings-' . $user_id ] ) ) {
$cookie = preg_replace ( '/[^A-Za-z0-9=&_]/' , '' , $_COOKIE [ 'wp-settings-' . $user_id ] );
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
// No change or both empty
if ( $cookie == $settings )
return ;
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
$last_saved = ( int ) get_user_option ( 'user-settings-time' , $user_id );
2014-08-12 22:47:16 -04:00
$current = isset ( $_COOKIE [ 'wp-settings-time-' . $user_id ]) ? preg_replace ( '/[^0-9]/' , '' , $_COOKIE [ 'wp-settings-time-' . $user_id ] ) : 0 ;
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
// The cookie is newer than the saved value. Update the user_option and leave the cookie as-is
if ( $current > $last_saved ) {
update_user_option ( $user_id , 'user-settings' , $cookie , false );
update_user_option ( $user_id , 'user-settings-time' , time () - 5 , false );
return ;
2011-12-19 18:15:32 -05:00
}
}
2013-08-23 17:43:09 -04:00
// The cookie is not set in the current browser or the saved value is newer.
2015-10-07 23:05:25 -04:00
$secure = ( 'https' === parse_url ( admin_url (), PHP_URL_SCHEME ) );
2014-08-12 22:47:16 -04:00
setcookie ( 'wp-settings-' . $user_id , $settings , time () + YEAR_IN_SECONDS , SITECOOKIEPATH , null , $secure );
setcookie ( 'wp-settings-time-' . $user_id , time (), time () + YEAR_IN_SECONDS , SITECOOKIEPATH , null , $secure );
$_COOKIE [ 'wp-settings-' . $user_id ] = $settings ;
2011-12-19 18:15:32 -05:00
}
/**
* Retrieve user interface setting value based on setting name .
*
* @ since 2.7 . 0
*
2015-05-26 18:17:25 -04:00
* @ param string $name The name of the setting .
2011-12-19 18:15:32 -05:00
* @ param string $default Optional default value to return when $name is not set .
* @ return mixed the last saved user setting or the default value / false if it doesn ' t exist .
*/
function get_user_setting ( $name , $default = false ) {
2013-08-23 17:43:09 -04:00
$all_user_settings = get_all_user_settings ();
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
return isset ( $all_user_settings [ $name ] ) ? $all_user_settings [ $name ] : $default ;
2011-12-19 18:15:32 -05:00
}
/**
* Add or update user interface setting .
*
* Both $name and $value can contain only ASCII letters , numbers and underscores .
2016-04-20 11:47:26 -04:00
*
2011-12-19 18:15:32 -05:00
* This function has to be used before any output has started as it calls setcookie () .
*
* @ since 2.8 . 0
*
2015-05-26 18:17:25 -04:00
* @ param string $name The name of the setting .
2011-12-19 18:15:32 -05:00
* @ param string $value The value for the setting .
2016-04-20 11:47:26 -04:00
* @ return bool | null True if set successfully , false if not . Null if the current user can ' t be established .
2011-12-19 18:15:32 -05:00
*/
function set_user_setting ( $name , $value ) {
2014-08-02 16:09:16 -04:00
if ( headers_sent () ) {
2011-12-19 18:15:32 -05:00
return false ;
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
$all_user_settings = get_all_user_settings ();
$all_user_settings [ $name ] = $value ;
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
return wp_set_all_user_settings ( $all_user_settings );
2011-12-19 18:15:32 -05:00
}
/**
* Delete user interface settings .
*
* Deleting settings would reset them to the defaults .
2016-04-20 11:47:26 -04:00
*
2011-12-19 18:15:32 -05:00
* This function has to be used before any output has started as it calls setcookie () .
*
* @ since 2.7 . 0
*
2014-11-30 17:56:25 -05:00
* @ param string $names The name or array of names of the setting to be deleted .
2016-04-20 11:47:26 -04:00
* @ return bool | null True if deleted successfully , false if not . Null if the current user can ' t be established .
2011-12-19 18:15:32 -05:00
*/
function delete_user_setting ( $names ) {
2014-08-02 16:09:16 -04:00
if ( headers_sent () ) {
2011-12-19 18:15:32 -05:00
return false ;
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
$all_user_settings = get_all_user_settings ();
2011-12-19 18:15:32 -05:00
$names = ( array ) $names ;
2013-08-23 17:43:09 -04:00
$deleted = false ;
2011-12-19 18:15:32 -05:00
foreach ( $names as $name ) {
2013-08-23 17:43:09 -04:00
if ( isset ( $all_user_settings [ $name ] ) ) {
unset ( $all_user_settings [ $name ] );
2011-12-19 18:15:32 -05:00
$deleted = true ;
}
}
2014-08-02 16:09:16 -04:00
if ( $deleted ) {
2013-08-23 17:43:09 -04:00
return wp_set_all_user_settings ( $all_user_settings );
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
return false ;
}
/**
* Retrieve all user interface settings .
*
* @ since 2.7 . 0
*
2015-05-26 18:17:25 -04:00
* @ global array $_updated_user_settings
*
2011-12-19 18:15:32 -05:00
* @ return array the last saved user settings or empty array .
*/
function get_all_user_settings () {
global $_updated_user_settings ;
2014-08-02 16:09:16 -04:00
if ( ! $user_id = get_current_user_id () ) {
2011-12-19 18:15:32 -05:00
return array ();
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
2014-08-02 16:09:16 -04:00
if ( isset ( $_updated_user_settings ) && is_array ( $_updated_user_settings ) ) {
2011-12-19 18:15:32 -05:00
return $_updated_user_settings ;
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
$user_settings = array ();
2011-12-19 18:15:32 -05:00
2014-08-12 22:47:16 -04:00
if ( isset ( $_COOKIE [ 'wp-settings-' . $user_id ] ) ) {
2015-08-31 23:57:21 -04:00
$cookie = preg_replace ( '/[^A-Za-z0-9=&_-]/' , '' , $_COOKIE [ 'wp-settings-' . $user_id ] );
2011-12-19 18:15:32 -05:00
2014-08-12 22:47:16 -04:00
if ( strpos ( $cookie , '=' ) ) { // '=' cannot be 1st char
parse_str ( $cookie , $user_settings );
}
2011-12-19 18:15:32 -05:00
} else {
2013-08-23 17:43:09 -04:00
$option = get_user_option ( 'user-settings' , $user_id );
2014-08-12 22:47:16 -04:00
if ( $option && is_string ( $option ) ) {
2013-08-23 17:43:09 -04:00
parse_str ( $option , $user_settings );
2014-08-12 22:47:16 -04:00
}
2011-12-19 18:15:32 -05:00
}
2013-08-23 17:43:09 -04:00
$_updated_user_settings = $user_settings ;
return $user_settings ;
2011-12-19 18:15:32 -05:00
}
/**
* Private . Set all user interface settings .
*
* @ since 2.8 . 0
2016-04-20 11:45:29 -04:00
* @ access private
2011-12-19 18:15:32 -05:00
*
2015-05-26 18:17:25 -04:00
* @ global array $_updated_user_settings
*
2016-04-20 11:45:29 -04:00
* @ param array $user_settings User settings .
* @ return bool | null False if the current user can ' t be found , null if the current
* user is not a super admin or a member of the site , otherwise true .
2011-12-19 18:15:32 -05:00
*/
2013-08-23 17:43:09 -04:00
function wp_set_all_user_settings ( $user_settings ) {
2011-12-19 18:15:32 -05:00
global $_updated_user_settings ;
2014-08-02 16:09:16 -04:00
if ( ! $user_id = get_current_user_id () ) {
2011-12-19 18:15:32 -05:00
return false ;
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
2014-08-02 16:09:16 -04:00
if ( is_super_admin () && ! is_user_member_of_blog () ) {
2012-10-17 14:58:09 -04:00
return ;
2014-08-02 16:09:16 -04:00
}
2012-10-17 14:58:09 -04:00
2011-12-19 18:15:32 -05:00
$settings = '' ;
2013-08-23 17:43:09 -04:00
foreach ( $user_settings as $name => $value ) {
2015-08-31 23:57:21 -04:00
$_name = preg_replace ( '/[^A-Za-z0-9_-]+/' , '' , $name );
$_value = preg_replace ( '/[^A-Za-z0-9_-]+/' , '' , $value );
2013-08-23 17:43:09 -04:00
2014-08-02 16:09:16 -04:00
if ( ! empty ( $_name ) ) {
2013-08-23 17:43:09 -04:00
$settings .= $_name . '=' . $_value . '&' ;
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
}
2014-08-02 16:09:16 -04:00
$settings = rtrim ( $settings , '&' );
2013-08-23 17:43:09 -04:00
parse_str ( $settings , $_updated_user_settings );
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
update_user_option ( $user_id , 'user-settings' , $settings , false );
update_user_option ( $user_id , 'user-settings-time' , time (), false );
2011-12-19 18:15:32 -05:00
return true ;
}
/**
* Delete the user settings of the current user .
*
* @ since 2.7 . 0
*/
function delete_all_user_settings () {
2014-08-02 16:09:16 -04:00
if ( ! $user_id = get_current_user_id () ) {
2011-12-19 18:15:32 -05:00
return ;
2014-08-02 16:09:16 -04:00
}
2011-12-19 18:15:32 -05:00
2013-08-23 17:43:09 -04:00
update_user_option ( $user_id , 'user-settings' , '' , false );
2014-08-12 22:47:16 -04:00
setcookie ( 'wp-settings-' . $user_id , ' ' , time () - YEAR_IN_SECONDS , SITECOOKIEPATH );
2011-12-19 18:15:32 -05:00
}
/**
2015-10-02 14:01:27 -04:00
* Retrieve an option value for the current network based on name of option .
2011-12-19 18:15:32 -05:00
*
* @ since 2.8 . 0
2015-10-02 15:32:30 -04:00
* @ since 4.4 . 0 The `$use_cache` parameter was deprecated .
2015-10-02 14:01:27 -04:00
* @ since 4.4 . 0 Modified into wrapper for get_network_option ()
*
* @ see get_network_option ()
*
* @ param string $option Name of option to retrieve . Expected to not be SQL - escaped .
* @ param mixed $default Optional value to return if option doesn ' t exist . Default false .
* @ param bool $deprecated Whether to use cache . Multisite only . Always set to true .
* @ return mixed Value set for the option .
*/
function get_site_option ( $option , $default = false , $deprecated = true ) {
2015-10-11 18:44:27 -04:00
return get_network_option ( null , $option , $default );
2015-10-02 14:01:27 -04:00
}
/**
* Add a new option for the current network .
*
* Existing options will not be updated . Note that prior to 3.3 this wasn ' t the case .
*
* @ since 2.8 . 0
* @ since 4.4 . 0 Modified into wrapper for add_network_option ()
*
* @ see add_network_option ()
*
* @ param string $option Name of option to add . Expected to not be SQL - escaped .
* @ param mixed $value Option value , can be anything . Expected to not be SQL - escaped .
* @ return bool False if the option was not added . True if the option was added .
*/
function add_site_option ( $option , $value ) {
2015-10-11 18:44:27 -04:00
return add_network_option ( null , $option , $value );
2015-10-02 14:01:27 -04:00
}
/**
* Removes a option by name for the current network .
*
* @ since 2.8 . 0
* @ since 4.4 . 0 Modified into wrapper for delete_network_option ()
*
* @ see delete_network_option ()
*
* @ param string $option Name of option to remove . Expected to not be SQL - escaped .
* @ return bool True , if succeed . False , if failure .
*/
function delete_site_option ( $option ) {
2015-10-11 18:44:27 -04:00
return delete_network_option ( null , $option );
2015-10-02 14:01:27 -04:00
}
/**
* Update the value of an option that was already added for the current network .
*
* @ since 2.8 . 0
* @ since 4.4 . 0 Modified into wrapper for update_network_option ()
*
* @ see update_network_option ()
*
* @ param string $option Name of option . Expected to not be SQL - escaped .
* @ param mixed $value Option value . Expected to not be SQL - escaped .
* @ return bool False if value was not updated . True if value was updated .
*/
function update_site_option ( $option , $value ) {
2015-10-11 18:44:27 -04:00
return update_network_option ( null , $option , $value );
2015-10-02 14:01:27 -04:00
}
/**
* Retrieve a network ' s option value based on the option name .
*
* @ since 4.4 . 0
2011-12-19 18:15:32 -05:00
*
2014-03-02 18:35:13 -05:00
* @ see get_option ()
2011-12-19 18:15:32 -05:00
*
2015-10-02 14:01:27 -04:00
* @ global wpdb $wpdb
* @ global object $current_site
2015-05-26 18:17:25 -04:00
*
2015-10-11 18:44:27 -04:00
* @ param int $network_id ID of the network . Can be null to default to the current network ID .
2015-10-02 14:01:27 -04:00
* @ param string $option Name of option to retrieve . Expected to not be SQL - escaped .
* @ param mixed $default Optional . Value to return if the option doesn ' t exist . Default false .
2011-12-19 18:15:32 -05:00
* @ return mixed Value set for the option .
*/
2015-10-11 18:44:27 -04:00
function get_network_option ( $network_id , $option , $default = false ) {
2015-10-02 14:01:27 -04:00
global $wpdb , $current_site ;
2015-10-11 19:30:24 -04:00
if ( $network_id && ! is_numeric ( $network_id ) ) {
return false ;
}
2015-10-02 14:01:27 -04:00
$network_id = ( int ) $network_id ;
// Fallback to the current network if a network ID is not specified.
if ( ! $network_id && is_multisite () ) {
$network_id = $current_site -> id ;
}
2011-12-19 18:15:32 -05:00
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters an existing network option before it is retrieved .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* Passing a truthy value to the filter will effectively short - circuit retrieval ,
* returning the passed value instead .
*
* @ since 2.9 . 0 As 'pre_site_option_' . $key
* @ since 3.0 . 0
2015-08-28 11:30:20 -04:00
* @ since 4.4 . 0 The `$option` parameter was added
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $pre_option The default value to return if the option does not exist .
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
$pre = apply_filters ( " pre_site_option_ { $option } " , false , $option );
2014-03-02 18:35:13 -05:00
2015-10-02 14:01:27 -04:00
if ( false !== $pre ) {
return $pre ;
}
2011-12-19 18:15:32 -05:00
2013-08-16 18:42:09 -04:00
// prevent non-existent options from triggering multiple queries
2015-10-02 14:01:27 -04:00
$notoptions_key = " $network_id :notoptions " ;
2013-11-21 14:07:10 -05:00
$notoptions = wp_cache_get ( $notoptions_key , 'site-options' );
2014-03-02 18:35:13 -05:00
2015-10-02 14:01:27 -04:00
if ( isset ( $notoptions [ $option ] ) ) {
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters a specific default network option .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.4 . 0
2015-08-28 11:31:21 -04:00
* @ since 4.4 . 0 The `$option` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $default The value to return if the site option does not exist
* in the database .
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
return apply_filters ( " default_site_option_ { $option } " , $default , $option );
2014-03-02 18:35:13 -05:00
}
2013-08-16 18:42:09 -04:00
2012-05-14 13:00:13 -04:00
if ( ! is_multisite () ) {
2014-03-02 18:35:13 -05:00
/** This filter is documented in wp-includes/option.php */
2015-08-25 17:42:20 -04:00
$default = apply_filters ( 'default_site_option_' . $option , $default , $option );
2015-10-02 14:01:27 -04:00
$value = get_option ( $option , $default );
2011-12-19 18:15:32 -05:00
} else {
2015-10-02 14:01:27 -04:00
$cache_key = " $network_id : $option " ;
$value = wp_cache_get ( $cache_key , 'site-options' );
2011-12-19 18:15:32 -05:00
2015-10-02 14:01:27 -04:00
if ( ! isset ( $value ) || false === $value ) {
$row = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d " , $option , $network_id ) );
2011-12-19 18:15:32 -05:00
// Has to be get_row instead of get_var because of funkiness with 0, false, null values
if ( is_object ( $row ) ) {
$value = $row -> meta_value ;
$value = maybe_unserialize ( $value );
wp_cache_set ( $cache_key , $value , 'site-options' );
} else {
2015-06-25 15:01:26 -04:00
if ( ! is_array ( $notoptions ) ) {
2015-10-02 14:01:27 -04:00
$notoptions = array ();
2015-06-25 15:01:26 -04:00
}
2015-10-02 14:01:27 -04:00
$notoptions [ $option ] = true ;
2013-11-21 14:07:10 -05:00
wp_cache_set ( $notoptions_key , $notoptions , 'site-options' );
2014-03-02 18:35:13 -05:00
/** This filter is documented in wp-includes/option.php */
2015-08-25 17:42:20 -04:00
$value = apply_filters ( 'default_site_option_' . $option , $default , $option );
2011-12-19 18:15:32 -05:00
}
}
}
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters the value of an existing network option .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.9 . 0 As 'site_option_' . $key
* @ since 3.0 . 0
2015-08-28 11:32:21 -04:00
* @ since 4.4 . 0 The `$option` parameter was added
2014-03-02 18:35:13 -05:00
*
2015-10-02 14:01:27 -04:00
* @ param mixed $value Value of network option .
2015-08-25 17:42:20 -04:00
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
return apply_filters ( " site_option_ { $option } " , $value , $option );
2011-12-19 18:15:32 -05:00
}
/**
2015-10-02 14:01:27 -04:00
* Add a new network option .
2011-12-19 18:15:32 -05:00
*
2015-10-02 14:01:27 -04:00
* Existing options will not be updated .
2011-12-19 18:15:32 -05:00
*
2015-10-02 14:01:27 -04:00
* @ since 4.4 . 0
2011-12-19 18:15:32 -05:00
*
2014-03-02 18:35:13 -05:00
* @ see add_option ()
2011-12-19 18:15:32 -05:00
*
2015-10-02 14:01:27 -04:00
* @ global wpdb $wpdb
* @ global object $current_site
2015-05-26 18:17:25 -04:00
*
2015-10-11 18:44:27 -04:00
* @ param int $network_id ID of the network . Can be null to default to the current network ID .
* @ param string $option Name of option to add . Expected to not be SQL - escaped .
* @ param mixed $value Option value , can be anything . Expected to not be SQL - escaped .
2011-12-19 18:15:32 -05:00
* @ return bool False if option was not added and true if option was added .
*/
2015-10-11 18:44:27 -04:00
function add_network_option ( $network_id , $option , $value ) {
2015-10-02 14:01:27 -04:00
global $wpdb , $current_site ;
2015-10-11 19:30:24 -04:00
if ( $network_id && ! is_numeric ( $network_id ) ) {
return false ;
}
2015-10-02 14:01:27 -04:00
$network_id = ( int ) $network_id ;
// Fallback to the current network if a network ID is not specified.
if ( ! $network_id && is_multisite () ) {
$network_id = $current_site -> id ;
}
2011-12-19 18:15:32 -05:00
2013-08-16 18:42:09 -04:00
wp_protect_special_option ( $option );
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters the value of a specific network option before it is added .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.9 . 0 As 'pre_add_site_option_' . $key
* @ since 3.0 . 0
2015-08-28 11:34:21 -04:00
* @ since 4.4 . 0 The `$option` parameter was added
2014-03-02 18:35:13 -05:00
*
2015-10-02 14:01:27 -04:00
* @ param mixed $value Value of network option .
2015-08-25 17:42:20 -04:00
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
$value = apply_filters ( " pre_add_site_option_ { $option } " , $value , $option );
2014-03-02 18:35:13 -05:00
2015-10-02 14:01:27 -04:00
$notoptions_key = " $network_id :notoptions " ;
2011-12-19 18:15:32 -05:00
2015-10-02 14:01:27 -04:00
if ( ! is_multisite () ) {
2016-04-16 15:48:27 -04:00
$result = add_option ( $option , $value , '' , 'no' );
2011-12-19 18:15:32 -05:00
} else {
2015-10-02 14:01:27 -04:00
$cache_key = " $network_id : $option " ;
2011-12-19 18:15:32 -05:00
2013-08-16 18:42:09 -04:00
// Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query
2013-11-21 14:07:10 -05:00
$notoptions = wp_cache_get ( $notoptions_key , 'site-options' );
2015-10-02 14:01:27 -04:00
if ( ! is_array ( $notoptions ) || ! isset ( $notoptions [ $option ] ) ) {
2015-10-11 18:44:27 -04:00
if ( false !== get_network_option ( $network_id , $option , false ) ) {
2013-08-16 18:42:09 -04:00
return false ;
2015-10-02 14:01:27 -04:00
}
}
2011-12-19 18:15:32 -05:00
$value = sanitize_option ( $option , $value );
2013-08-16 18:42:09 -04:00
2013-10-02 16:43:10 -04:00
$serialized_value = maybe_serialize ( $value );
2015-10-02 14:01:27 -04:00
$result = $wpdb -> insert ( $wpdb -> sitemeta , array ( 'site_id' => $network_id , 'meta_key' => $option , 'meta_value' => $serialized_value ) );
2011-12-19 18:15:32 -05:00
2015-10-02 14:01:27 -04:00
if ( ! $result ) {
2013-10-02 16:43:10 -04:00
return false ;
2015-10-02 14:01:27 -04:00
}
2013-10-02 16:43:10 -04:00
wp_cache_set ( $cache_key , $value , 'site-options' );
2013-08-16 18:42:09 -04:00
// This option exists now
2013-11-21 14:07:10 -05:00
$notoptions = wp_cache_get ( $notoptions_key , 'site-options' ); // yes, again... we need it to be fresh
2015-10-02 14:01:27 -04:00
if ( is_array ( $notoptions ) && isset ( $notoptions [ $option ] ) ) {
unset ( $notoptions [ $option ] );
2013-11-21 14:07:10 -05:00
wp_cache_set ( $notoptions_key , $notoptions , 'site-options' );
2013-08-16 18:42:09 -04:00
}
2011-12-19 18:15:32 -05:00
}
if ( $result ) {
2014-03-02 18:35:13 -05:00
/**
2015-10-02 14:01:27 -04:00
* Fires after a specific network option has been successfully added .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.9 . 0 As " add_site_option_ { $key } "
* @ since 3.0 . 0
*
2015-10-02 14:01:27 -04:00
* @ param string $option Name of the network option .
* @ param mixed $value Value of the network option .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
do_action ( " add_site_option_ { $option } " , $option , $value );
2014-03-02 18:35:13 -05:00
/**
2015-10-02 14:01:27 -04:00
* Fires after a network option has been successfully added .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
*
2015-10-02 14:01:27 -04:00
* @ param string $option Name of the network option .
* @ param mixed $value Value of the network option .
2014-03-02 18:35:13 -05:00
*/
2015-10-02 14:01:27 -04:00
do_action ( 'add_site_option' , $option , $value );
2014-03-02 18:35:13 -05:00
2011-12-19 18:15:32 -05:00
return true ;
}
2015-10-02 14:01:27 -04:00
2011-12-19 18:15:32 -05:00
return false ;
}
/**
2015-10-02 14:01:27 -04:00
* Removes a network option by name .
2011-12-19 18:15:32 -05:00
*
2015-10-02 14:01:27 -04:00
* @ since 4.4 . 0
2011-12-19 18:15:32 -05:00
*
2014-03-02 18:35:13 -05:00
* @ see delete_option ()
2011-12-19 18:15:32 -05:00
*
2015-10-02 14:01:27 -04:00
* @ global wpdb $wpdb
* @ global object $current_site
2015-05-26 18:17:25 -04:00
*
2015-10-11 18:44:27 -04:00
* @ param int $network_id ID of the network . Can be null to default to the current network ID .
* @ param string $option Name of option to remove . Expected to not be SQL - escaped .
2011-12-19 18:15:32 -05:00
* @ return bool True , if succeed . False , if failure .
*/
2015-10-11 18:44:27 -04:00
function delete_network_option ( $network_id , $option ) {
2015-10-02 14:01:27 -04:00
global $wpdb , $current_site ;
2015-10-11 19:30:24 -04:00
if ( $network_id && ! is_numeric ( $network_id ) ) {
return false ;
}
2015-10-02 14:01:27 -04:00
$network_id = ( int ) $network_id ;
// Fallback to the current network if a network ID is not specified.
if ( ! $network_id && is_multisite () ) {
$network_id = $current_site -> id ;
}
2011-12-19 18:15:32 -05:00
2014-03-02 18:35:13 -05:00
/**
2015-10-02 14:01:27 -04:00
* Fires immediately before a specific network option is deleted .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
2015-08-28 11:35:21 -04:00
* @ since 4.4 . 0 The `$option` parameter was added
2015-08-25 17:42:20 -04:00
*
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
do_action ( " pre_delete_site_option_ { $option } " , $option );
2011-12-19 18:15:32 -05:00
2015-10-02 14:01:27 -04:00
if ( ! is_multisite () ) {
2011-12-19 18:15:32 -05:00
$result = delete_option ( $option );
} else {
2015-10-02 14:01:27 -04:00
$row = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT meta_id FROM { $wpdb -> sitemeta } WHERE meta_key = %s AND site_id = %d " , $option , $network_id ) );
if ( is_null ( $row ) || ! $row -> meta_id ) {
2011-12-19 18:15:32 -05:00
return false ;
2015-10-02 14:01:27 -04:00
}
$cache_key = " $network_id : $option " ;
2011-12-19 18:15:32 -05:00
wp_cache_delete ( $cache_key , 'site-options' );
2015-10-02 14:01:27 -04:00
$result = $wpdb -> delete ( $wpdb -> sitemeta , array ( 'meta_key' => $option , 'site_id' => $network_id ) );
2011-12-19 18:15:32 -05:00
}
if ( $result ) {
2014-03-02 18:35:13 -05:00
/**
2015-10-02 14:01:27 -04:00
* Fires after a specific network option has been deleted .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.9 . 0 As " delete_site_option_ { $key } "
* @ since 3.0 . 0
*
2015-10-02 14:01:27 -04:00
* @ param string $option Name of the network option .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
do_action ( " delete_site_option_ { $option } " , $option );
2014-03-02 18:35:13 -05:00
/**
2015-10-02 14:01:27 -04:00
* Fires after a network option has been deleted .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
*
2015-10-02 14:01:27 -04:00
* @ param string $option Name of the network option .
2014-03-02 18:35:13 -05:00
*/
2015-10-02 14:01:27 -04:00
do_action ( 'delete_site_option' , $option );
2014-03-02 18:35:13 -05:00
2011-12-19 18:15:32 -05:00
return true ;
}
2015-10-02 14:01:27 -04:00
2011-12-19 18:15:32 -05:00
return false ;
}
/**
2015-10-02 14:01:27 -04:00
* Update the value of a network option that was already added .
2011-12-19 18:15:32 -05:00
*
2015-10-02 14:01:27 -04:00
* @ since 4.4 . 0
2011-12-19 18:15:32 -05:00
*
2014-03-02 18:35:13 -05:00
* @ see update_option ()
2011-12-19 18:15:32 -05:00
*
2015-10-02 14:01:27 -04:00
* @ global wpdb $wpdb
* @ global object $current_site
2015-05-26 18:17:25 -04:00
*
2015-10-11 18:44:27 -04:00
* @ param int $network_id ID of the network . Can be null to default to the current network ID .
2015-10-02 14:01:27 -04:00
* @ param string $option Name of option . Expected to not be SQL - escaped .
* @ param mixed $value Option value . Expected to not be SQL - escaped .
2011-12-19 18:15:32 -05:00
* @ return bool False if value was not updated and true if value was updated .
*/
2015-10-11 18:44:27 -04:00
function update_network_option ( $network_id , $option , $value ) {
2015-10-02 14:01:27 -04:00
global $wpdb , $current_site ;
2015-10-11 19:30:24 -04:00
if ( $network_id && ! is_numeric ( $network_id ) ) {
return false ;
}
2015-10-02 14:01:27 -04:00
$network_id = ( int ) $network_id ;
// Fallback to the current network if a network ID is not specified.
if ( ! $network_id && is_multisite () ) {
$network_id = $current_site -> id ;
}
2011-12-19 18:15:32 -05:00
2013-08-16 18:42:09 -04:00
wp_protect_special_option ( $option );
2015-10-11 18:44:27 -04:00
$old_value = get_network_option ( $network_id , $option , false );
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters a specific network option before its value is updated .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.9 . 0 As 'pre_update_site_option_' . $key
* @ since 3.0 . 0
2015-08-28 11:36:21 -04:00
* @ since 4.4 . 0 The `$option` parameter was added
2014-03-02 18:35:13 -05:00
*
2015-10-02 14:01:27 -04:00
* @ param mixed $value New value of the network option .
* @ param mixed $old_value Old value of the network option .
2015-08-25 17:42:20 -04:00
* @ param string $option Option name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
$value = apply_filters ( " pre_update_site_option_ { $option } " , $value , $old_value , $option );
2011-12-19 18:15:32 -05:00
2015-10-02 14:01:27 -04:00
if ( $value === $old_value ) {
2011-12-19 18:15:32 -05:00
return false ;
2015-10-02 14:01:27 -04:00
}
2011-12-19 18:15:32 -05:00
2015-10-02 14:01:27 -04:00
if ( false === $old_value ) {
2015-10-11 18:44:27 -04:00
return add_network_option ( $network_id , $option , $value );
2015-10-02 14:01:27 -04:00
}
2011-12-19 18:15:32 -05:00
2015-10-02 14:01:27 -04:00
$notoptions_key = " $network_id :notoptions " ;
2013-11-21 14:07:10 -05:00
$notoptions = wp_cache_get ( $notoptions_key , 'site-options' );
2015-10-02 14:01:27 -04:00
if ( is_array ( $notoptions ) && isset ( $notoptions [ $option ] ) ) {
unset ( $notoptions [ $option ] );
2013-11-21 14:07:10 -05:00
wp_cache_set ( $notoptions_key , $notoptions , 'site-options' );
2013-08-16 18:42:09 -04:00
}
2015-10-02 14:01:27 -04:00
if ( ! is_multisite () ) {
2016-04-16 15:48:27 -04:00
$result = update_option ( $option , $value , 'no' );
2011-12-19 18:15:32 -05:00
} else {
$value = sanitize_option ( $option , $value );
2013-10-02 16:43:10 -04:00
$serialized_value = maybe_serialize ( $value );
2015-10-02 14:01:27 -04:00
$result = $wpdb -> update ( $wpdb -> sitemeta , array ( 'meta_value' => $serialized_value ), array ( 'site_id' => $network_id , 'meta_key' => $option ) );
2013-10-02 16:43:10 -04:00
if ( $result ) {
2015-10-02 14:01:27 -04:00
$cache_key = " $network_id : $option " ;
2013-10-02 16:43:10 -04:00
wp_cache_set ( $cache_key , $value , 'site-options' );
}
2011-12-19 18:15:32 -05:00
}
if ( $result ) {
2014-03-02 18:35:13 -05:00
/**
2015-10-02 14:01:27 -04:00
* Fires after the value of a specific network option has been successfully updated .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.9 . 0 As " update_site_option_ { $key } "
* @ since 3.0 . 0
*
2015-10-02 14:01:27 -04:00
* @ 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 .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
do_action ( " update_site_option_ { $option } " , $option , $value , $old_value );
2014-03-02 18:35:13 -05:00
/**
2015-10-02 14:01:27 -04:00
* Fires after the value of a network option has been successfully updated .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
*
2015-10-02 14:01:27 -04:00
* @ 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 .
2014-03-02 18:35:13 -05:00
*/
2015-10-02 14:01:27 -04:00
do_action ( 'update_site_option' , $option , $value , $old_value );
2014-03-02 18:35:13 -05:00
2011-12-19 18:15:32 -05:00
return true ;
}
2015-10-02 14:01:27 -04:00
2011-12-19 18:15:32 -05:00
return false ;
}
/**
* Delete a site transient .
*
* @ since 2.9 . 0
*
* @ param string $transient Transient name . Expected to not be SQL - escaped .
* @ return bool True if successful , false otherwise
*/
function delete_site_transient ( $transient ) {
2014-03-02 18:35:13 -05:00
/**
* Fires immediately before a specific site transient is deleted .
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
*
* @ param string $transient Transient name .
*/
2016-08-22 14:25:31 -04:00
do_action ( " delete_site_transient_ { $transient } " , $transient );
2014-03-02 18:35:13 -05:00
2013-09-06 14:10:09 -04:00
if ( wp_using_ext_object_cache () ) {
2011-12-19 18:15:32 -05:00
$result = wp_cache_delete ( $transient , 'site-transient' );
} else {
$option_timeout = '_site_transient_timeout_' . $transient ;
$option = '_site_transient_' . $transient ;
2015-10-07 13:11:25 -04:00
$result = delete_site_option ( $option );
2011-12-19 18:15:32 -05:00
if ( $result )
2015-10-07 13:11:25 -04:00
delete_site_option ( $option_timeout );
2011-12-19 18:15:32 -05:00
}
2014-03-02 18:35:13 -05:00
if ( $result ) {
/**
* Fires after a transient is deleted .
*
* @ since 3.0 . 0
*
* @ param string $transient Deleted transient name .
*/
2011-12-19 18:15:32 -05:00
do_action ( 'deleted_site_transient' , $transient );
2014-03-02 18:35:13 -05:00
}
2011-12-19 18:15:32 -05:00
return $result ;
}
/**
* Get the value of a site transient .
*
2014-06-05 11:34:14 -04:00
* If the transient does not exist , does not have a value , or has expired ,
* then the return value will be false .
2011-12-19 18:15:32 -05:00
*
* @ since 2.9 . 0
*
2014-03-02 18:35:13 -05:00
* @ see get_transient ()
2011-12-19 18:15:32 -05:00
*
* @ param string $transient Transient name . Expected to not be SQL - escaped .
2014-06-05 11:34:14 -04:00
* @ return mixed Value of transient .
2011-12-19 18:15:32 -05:00
*/
function get_site_transient ( $transient ) {
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters the value of an existing site transient .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* Passing a truthy value to the filter will effectively short - circuit retrieval ,
* returning the passed value instead .
*
* @ since 2.9 . 0
2015-10-06 13:59:25 -04:00
* @ since 4.4 . 0 The `$transient` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $pre_site_transient The default value to return if the site transient does not exist .
* Any value other than false will short - circuit the retrieval
* of the transient , and return the returned value .
* @ param string $transient Transient name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
$pre = apply_filters ( " pre_site_transient_ { $transient } " , false , $transient );
2014-03-02 18:35:13 -05:00
2011-12-19 18:15:32 -05:00
if ( false !== $pre )
return $pre ;
2013-09-06 14:10:09 -04:00
if ( wp_using_ext_object_cache () ) {
2011-12-19 18:15:32 -05:00
$value = wp_cache_get ( $transient , 'site-transient' );
} else {
// Core transients that do not have a timeout. Listed here so querying timeouts can be avoided.
$no_timeout = array ( 'update_core' , 'update_plugins' , 'update_themes' );
$transient_option = '_site_transient_' . $transient ;
if ( ! in_array ( $transient , $no_timeout ) ) {
$transient_timeout = '_site_transient_timeout_' . $transient ;
2015-10-07 13:11:25 -04:00
$timeout = get_site_option ( $transient_timeout );
2011-12-19 18:15:32 -05:00
if ( false !== $timeout && $timeout < time () ) {
2015-10-07 13:11:25 -04:00
delete_site_option ( $transient_option );
delete_site_option ( $transient_timeout );
2013-08-21 15:14:09 -04:00
$value = false ;
2011-12-19 18:15:32 -05:00
}
}
2013-08-21 15:14:09 -04:00
if ( ! isset ( $value ) )
2015-10-07 13:11:25 -04:00
$value = get_site_option ( $transient_option );
2011-12-19 18:15:32 -05:00
}
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters the value of an existing site transient .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* @ since 2.9 . 0
2015-10-06 13:59:25 -04:00
* @ since 4.4 . 0 The `$transient` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $value Value of site transient .
* @ param string $transient Transient name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
return apply_filters ( " site_transient_ { $transient } " , $value , $transient );
2011-12-19 18:15:32 -05:00
}
/**
* Set / update the value of a site transient .
*
* You do not need to serialize values , if the value needs to be serialize , then
* it will be serialized before it is set .
*
* @ since 2.9 . 0
*
2014-03-02 18:35:13 -05:00
* @ see set_transient ()
2011-12-19 18:15:32 -05:00
*
2014-06-11 12:33:15 -04:00
* @ param string $transient Transient name . Expected to not be SQL - escaped . Must be
* 40 characters or fewer in length .
* @ param mixed $value Transient value . Expected to not be SQL - escaped .
2015-10-13 17:31:25 -04:00
* @ param int $expiration Optional . Time until expiration in seconds . Default 0 ( no expiration ) .
2011-12-19 18:15:32 -05:00
* @ return bool False if value was not set and true if value was set .
*/
function set_site_transient ( $transient , $value , $expiration = 0 ) {
2014-03-02 18:35:13 -05:00
/**
2016-05-22 14:34:26 -04:00
* Filters the value of a specific site transient before it is set .
2014-03-02 18:35:13 -05:00
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
2015-10-06 13:59:25 -04:00
* @ since 4.4 . 0 The `$transient` parameter was added .
2014-03-02 18:35:13 -05:00
*
2015-10-06 13:59:25 -04:00
* @ param mixed $value New value of site transient .
2015-08-25 17:42:20 -04:00
* @ param string $transient Transient name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
$value = apply_filters ( " pre_set_site_transient_ { $transient } " , $value , $transient );
2014-03-02 18:35:13 -05:00
2013-09-16 13:43:09 -04:00
$expiration = ( int ) $expiration ;
2011-12-19 18:15:32 -05:00
2015-10-06 10:10:25 -04:00
/**
2016-05-22 14:34:26 -04:00
* Filters the expiration for a site transient before its value is set .
2015-10-06 10:10:25 -04:00
*
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
*
* @ since 4.4 . 0
*
2015-10-13 17:31:25 -04:00
* @ param int $expiration Time until expiration in seconds . Use 0 for no expiration .
2015-10-06 13:59:25 -04:00
* @ param mixed $value New value of site transient .
2015-10-06 10:10:25 -04:00
* @ param string $transient Transient name .
*/
2016-08-22 14:25:31 -04:00
$expiration = apply_filters ( " expiration_of_site_transient_ { $transient } " , $expiration , $value , $transient );
2015-10-06 10:10:25 -04:00
2013-09-06 14:10:09 -04:00
if ( wp_using_ext_object_cache () ) {
2011-12-19 18:15:32 -05:00
$result = wp_cache_set ( $transient , $value , 'site-transient' , $expiration );
} else {
$transient_timeout = '_site_transient_timeout_' . $transient ;
2013-09-11 04:46:10 -04:00
$option = '_site_transient_' . $transient ;
2015-10-07 13:11:25 -04:00
if ( false === get_site_option ( $option ) ) {
2011-12-19 18:15:32 -05:00
if ( $expiration )
2015-10-07 13:11:25 -04:00
add_site_option ( $transient_timeout , time () + $expiration );
$result = add_site_option ( $option , $value );
2011-12-19 18:15:32 -05:00
} else {
if ( $expiration )
2015-10-07 13:11:25 -04:00
update_site_option ( $transient_timeout , time () + $expiration );
$result = update_site_option ( $option , $value );
2011-12-19 18:15:32 -05:00
}
}
if ( $result ) {
2014-03-02 18:35:13 -05:00
/**
* Fires after the value for a specific site transient has been set .
*
2014-11-30 06:53:22 -05:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-02 18:35:13 -05:00
*
* @ since 3.0 . 0
2015-08-28 11:41:21 -04:00
* @ since 4.4 . 0 The `$transient` parameter was added
2014-03-02 18:35:13 -05:00
*
2015-08-25 17:42:20 -04:00
* @ param mixed $value Site transient value .
2015-10-13 17:31:25 -04:00
* @ param int $expiration Time until expiration in seconds .
2015-08-25 17:42:20 -04:00
* @ param string $transient Transient name .
2014-03-02 18:35:13 -05:00
*/
2016-08-22 14:25:31 -04:00
do_action ( " set_site_transient_ { $transient } " , $value , $expiration , $transient );
2014-03-02 18:35:13 -05:00
/**
* Fires after the value for a site transient has been set .
*
* @ since 3.0 . 0
*
* @ param string $transient The name of the site transient .
* @ param mixed $value Site transient value .
2015-10-13 17:31:25 -04:00
* @ param int $expiration Time until expiration in seconds .
2014-03-02 18:35:13 -05:00
*/
2013-06-16 00:06:12 -04:00
do_action ( 'setted_site_transient' , $transient , $value , $expiration );
2011-12-19 18:15:32 -05:00
}
return $result ;
2015-10-06 13:59:25 -04:00
}