2011-12-20 00:15:32 +01:00
< ? php
/**
* Option API
*
* @ package WordPress
2014-02-25 18:14:14 +01:00
* @ subpackage Option
2011-12-20 00:15:32 +01:00
*/
/**
* Retrieve option value based on name of option .
*
* 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 .
*
* @ since 1.5 . 0
*
2015-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
* @ 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-20 00:15:32 +01:00
* @ return mixed Value set for the option .
*/
function get_option ( $option , $default = false ) {
global $wpdb ;
2012-11-17 14:20:57 +01:00
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
2014-03-03 00:35:13 +01:00
/**
* Filter the value of an existing option before it is retrieved .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* Passing a truthy value to the filter will short - circuit retrieving
* the option value , returning the passed value instead .
*
* @ since 1.5 . 0
*
* @ param bool | mixed $pre_option Value to return instead of the option value .
* Default false to skip it .
2015-08-25 23:42:20 +02:00
* @ param string $option Option name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
$pre = apply_filters ( 'pre_option_' . $option , false , $option );
2011-12-20 00:15:32 +01:00
if ( false !== $pre )
return $pre ;
if ( defined ( 'WP_SETUP_CONFIG' ) )
return false ;
if ( ! defined ( 'WP_INSTALLING' ) ) {
// prevent non-existent options from triggering multiple queries
$notoptions = wp_cache_get ( 'notoptions' , 'options' );
2014-12-16 06:52:23 +01:00
if ( isset ( $notoptions [ $option ] ) ) {
2014-03-03 00:35:13 +01:00
/**
* Filter the default value for an option .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.4 . 0
*
2015-08-25 23:42:20 +02: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-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
return apply_filters ( 'default_option_' . $option , $default , $option );
2014-12-16 06:52:23 +01:00
}
2011-12-20 00:15:32 +01: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 21:01:26 +02:00
if ( ! is_array ( $notoptions ) ) {
$notoptions = array ();
}
2011-12-20 00:15:32 +01:00
$notoptions [ $option ] = true ;
wp_cache_set ( 'notoptions' , $notoptions , 'options' );
2014-03-03 00:35:13 +01:00
/** This filter is documented in wp-includes/option.php */
2015-08-25 23:42:20 +02:00
return apply_filters ( 'default_option_' . $option , $default , $option );
2011-12-20 00:15:32 +01: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-03 00:35:13 +01:00
if ( is_object ( $row ) ) {
2011-12-20 00:15:32 +01:00
$value = $row -> option_value ;
2014-03-03 00:35:13 +01:00
} else {
/** This filter is documented in wp-includes/option.php */
2015-08-25 23:42:20 +02:00
return apply_filters ( 'default_option_' . $option , $default , $option );
2014-03-03 00:35:13 +01:00
}
2011-12-20 00:15:32 +01: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-03 00:35:13 +01:00
/**
* Filter the value of an existing option .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 1.5 . 0 As 'option_' . $setting
* @ since 3.0 . 0
*
2015-08-25 23:42:20 +02: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-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
return apply_filters ( 'option_' . $option , maybe_unserialize ( $value ), $option );
2011-12-20 00:15:32 +01: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 17:49:20 +01:00
if ( 'alloptions' === $option || 'notoptions' === $option )
2011-12-20 00:15:32 +01: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-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
2011-12-20 00:15:32 +01:00
* @ return array List of all options .
*/
function wp_load_alloptions () {
global $wpdb ;
if ( ! defined ( 'WP_INSTALLING' ) || ! is_multisite () )
$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 ;
}
if ( ! defined ( 'WP_INSTALLING' ) || ! is_multisite () )
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-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
2011-12-20 00:15:32 +01: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 20:10:09 +02:00
global $wpdb ;
2011-12-20 00:15:32 +01:00
2013-09-06 20:10:09 +02:00
if ( ! is_multisite () || wp_using_ext_object_cache () || defined ( 'WP_INSTALLING' ) )
2011-12-20 00:15:32 +01:00
return ;
if ( empty ( $site_id ) )
$site_id = $wpdb -> siteid ;
2012-09-12 00:22:20 +02: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-20 00:15:32 +01: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 18:58:27 +02: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-20 00:15:32 +01:00
*
* @ since 1.0 . 0
2015-03-05 20:13:25 +01:00
* @ since 4.2 . 0 The `$autoload` parameter was added .
2011-12-20 00:15:32 +01:00
*
2015-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
2015-03-05 20:13:25 +01: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 14:57:26 +01: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 18:58:27 +02:00
* Accepts 'yes' | true to enable or 'no' | false to disable . For non - existent options ,
* the default value is 'yes' . Default null .
2011-12-20 00:15:32 +01:00
* @ return bool False if value was not updated and true if value was updated .
*/
2015-03-06 14:57:26 +01:00
function update_option ( $option , $value , $autoload = null ) {
2011-12-20 00:15:32 +01:00
global $wpdb ;
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
wp_protect_special_option ( $option );
2013-10-02 22:43:10 +02:00
if ( is_object ( $value ) )
$value = clone $value ;
2011-12-20 00:15:32 +01:00
2013-10-02 22:43:10 +02:00
$value = sanitize_option ( $option , $value );
$old_value = get_option ( $option );
2014-03-03 00:35:13 +01:00
/**
* Filter a specific option before its value is ( maybe ) serialized and updated .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.6 . 0
*
2015-08-25 23:42:20 +02:00
* @ param mixed $value The new , unserialized option value .
* @ param mixed $old_value The old option value .
* @ param string $option Option name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
$value = apply_filters ( 'pre_update_option_' . $option , $value , $old_value , $option );
2011-12-20 00:15:32 +01:00
2014-03-28 14:57:14 +01:00
/**
* Filter an option before its value is ( maybe ) serialized and updated .
*
* @ 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-20 00:15:32 +01:00
// If the new and old values are the same, no need to update.
2013-10-02 22:43:10 +02:00
if ( $value === $old_value )
2011-12-20 00:15:32 +01:00
return false ;
2015-02-18 20:14:27 +01:00
/** This filter is documented in wp-includes/option.php */
2015-03-05 20:13:25 +01:00
if ( apply_filters ( 'default_option_' . $option , false ) === $old_value ) {
2015-03-06 14:57:26 +01:00
// Default setting for new options is 'yes'.
if ( null === $autoload ) {
$autoload = 'yes' ;
}
2015-03-05 20:13:25 +01:00
return add_option ( $option , $value , '' , $autoload );
}
2013-10-02 22:43:10 +02:00
$serialized_value = maybe_serialize ( $value );
2014-03-03 00:35:13 +01: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-26 04:57:09 +02:00
do_action ( 'update_option' , $option , $old_value , $value );
2014-03-03 00:35:13 +01:00
2015-03-06 14:57:26 +01: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 22:43:10 +02:00
if ( ! $result )
return false ;
2011-12-20 00:15:32 +01:00
$notoptions = wp_cache_get ( 'notoptions' , 'options' );
if ( is_array ( $notoptions ) && isset ( $notoptions [ $option ] ) ) {
unset ( $notoptions [ $option ] );
wp_cache_set ( 'notoptions' , $notoptions , 'options' );
}
if ( ! defined ( 'WP_INSTALLING' ) ) {
$alloptions = wp_load_alloptions ();
if ( isset ( $alloptions [ $option ] ) ) {
2013-10-02 22:43:10 +02:00
$alloptions [ $option ] = $serialized_value ;
2011-12-20 00:15:32 +01:00
wp_cache_set ( 'alloptions' , $alloptions , 'options' );
} else {
2013-10-02 22:43:10 +02:00
wp_cache_set ( $option , $serialized_value , 'options' );
2011-12-20 00:15:32 +01:00
}
}
2014-03-03 00:35:13 +01:00
/**
* Fires after the value of a specific option has been successfully updated .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.0 . 1
*
2015-08-25 23:42:20 +02:00
* @ param mixed $old_value The old option value .
* @ param mixed $value The new option value .
* @ param string $option Option name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
do_action ( " update_option_ { $option } " , $old_value , $value , $option );
2014-03-03 00:35:13 +01: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 22:43:10 +02:00
do_action ( 'updated_option' , $option , $old_value , $value );
return true ;
2011-12-20 00:15:32 +01: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-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
2014-11-30 23:56:25 +01: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 08:51:23 +01: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-20 00:15:32 +01: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 ) )
_deprecated_argument ( __FUNCTION__ , '2.3' );
$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 20:14:27 +01:00
/** This filter is documented in wp-includes/option.php */
if ( apply_filters ( 'default_option_' . $option , false ) !== get_option ( $option ) )
2011-12-20 00:15:32 +01:00
return false ;
2013-10-02 22:43:10 +02:00
$serialized_value = maybe_serialize ( $value );
2015-01-25 08:51:23 +01:00
$autoload = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes' ;
2014-03-03 00:35:13 +01: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 22:43:10 +02: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 ;
2011-12-20 00:15:32 +01:00
if ( ! defined ( 'WP_INSTALLING' ) ) {
if ( 'yes' == $autoload ) {
$alloptions = wp_load_alloptions ();
2013-10-02 22:43:10 +02:00
$alloptions [ $option ] = $serialized_value ;
2011-12-20 00:15:32 +01:00
wp_cache_set ( 'alloptions' , $alloptions , 'options' );
} else {
2013-10-02 22:43:10 +02:00
wp_cache_set ( $option , $serialized_value , 'options' );
2011-12-20 00:15:32 +01: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-03 00:35:13 +01:00
/**
* Fires after a specific option has been added .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01: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 22:43:10 +02:00
do_action ( " add_option_ { $option } " , $option , $value );
2014-03-03 00:35:13 +01: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 22:43:10 +02:00
do_action ( 'added_option' , $option , $value );
return true ;
2011-12-20 00:15:32 +01:00
}
/**
* Removes option by name . Prevents removal of protected WordPress options .
*
* @ since 1.2 . 0
*
2015-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
2011-12-20 00:15:32 +01: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 17:49:20 +01:00
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
2011-12-20 00:15:32 +01: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-03 00:35:13 +01:00
/**
* Fires immediately before an option is deleted .
*
* @ since 2.9 . 0
*
* @ param string $option Name of the option to delete .
*/
2011-12-20 00:15:32 +01:00
do_action ( 'delete_option' , $option );
2014-03-03 00:35:13 +01:00
2012-03-24 16:24:31 +01:00
$result = $wpdb -> delete ( $wpdb -> options , array ( 'option_name' => $option ) );
2011-12-20 00:15:32 +01:00
if ( ! defined ( 'WP_INSTALLING' ) ) {
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-03 00:35:13 +01:00
/**
* Fires after a specific option has been deleted .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.0 . 0
*
* @ param string $option Name of the deleted option .
*/
2011-12-20 00:15:32 +01:00
do_action ( " delete_option_ $option " , $option );
2014-03-03 00:35:13 +01:00
/**
* Fires after an option has been deleted .
*
* @ since 2.9 . 0
*
* @ param string $option Name of the deleted option .
*/
2011-12-20 00:15:32 +01: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-03 00:35:13 +01:00
/**
* Fires immediately before a specific transient is deleted .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.0 . 0
*
* @ param string $transient Transient name .
*/
2011-12-20 00:15:32 +01:00
do_action ( 'delete_transient_' . $transient , $transient );
2013-09-06 20:10:09 +02:00
if ( wp_using_ext_object_cache () ) {
2011-12-20 00:15:32 +01: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-03 00:35:13 +01:00
if ( $result ) {
/**
* Fires after a transient is deleted .
*
* @ since 3.0 . 0
*
* @ param string $transient Deleted transient name .
*/
2011-12-20 00:15:32 +01:00
do_action ( 'deleted_transient' , $transient );
2014-03-03 00:35:13 +01:00
}
2011-12-20 00:15:32 +01:00
return $result ;
}
/**
* Get the value of a transient .
*
2014-06-05 17:34:14 +02:00
* If the transient does not exist , does not have a value , or has expired ,
* then the return value will be false .
2011-12-20 00:15:32 +01:00
*
* @ since 2.8 . 0
*
2014-06-05 17:34:14 +02:00
* @ param string $transient Transient name . Expected to not be SQL - escaped .
* @ return mixed Value of transient .
2011-12-20 00:15:32 +01:00
*/
function get_transient ( $transient ) {
2014-03-03 00:35:13 +01:00
2015-08-25 23:42:20 +02:00
/**
2014-03-03 00:35:13 +01:00
* Filter the value of an existing transient .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01: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-25 23:42:20 +02: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-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
$pre = apply_filters ( 'pre_transient_' . $transient , false , $transient );
2011-12-20 00:15:32 +01:00
if ( false !== $pre )
return $pre ;
2013-09-06 20:10:09 +02:00
if ( wp_using_ext_object_cache () ) {
2011-12-20 00:15:32 +01:00
$value = wp_cache_get ( $transient , 'transient' );
} else {
$transient_option = '_transient_' . $transient ;
if ( ! defined ( 'WP_INSTALLING' ) ) {
// 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 18:45:26 +02:00
$timeout = get_option ( $transient_timeout );
if ( false !== $timeout && $timeout < time () ) {
2011-12-20 00:15:32 +01:00
delete_option ( $transient_option );
delete_option ( $transient_timeout );
2013-08-21 21:14:09 +02:00
$value = false ;
2011-12-20 00:15:32 +01:00
}
}
}
2013-08-21 21:14:09 +02:00
if ( ! isset ( $value ) )
$value = get_option ( $transient_option );
2011-12-20 00:15:32 +01:00
}
2014-03-03 00:35:13 +01:00
/**
* Filter an existing transient ' s value .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.8 . 0
*
2015-08-25 23:42:20 +02:00
* @ param mixed $value Value of transient .
* @ param string $transient Transient name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
return apply_filters ( 'transient_' . $transient , $value , $transient );
2011-12-20 00:15:32 +01: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 18:33:15 +02:00
* @ param string $transient Transient name . Expected to not be SQL - escaped . Must be
* 45 characters or fewer in length .
* @ param mixed $value Transient value . Must be serializable if non - scalar .
* Expected to not be SQL - escaped .
* @ param int $expiration Optional . Time until expiration in seconds . Default 0.
2011-12-20 00:15:32 +01:00
* @ return bool False if value was not set and true if value was set .
*/
function set_transient ( $transient , $value , $expiration = 0 ) {
2014-03-03 00:35:13 +01:00
2015-02-11 18:12:26 +01:00
$expiration = ( int ) $expiration ;
2014-03-03 00:35:13 +01:00
/**
* Filter a specific transient before its value is set .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.0 . 0
2015-02-11 18:12:26 +01:00
* @ since 4.2 . 0 Added `$expiration` parameter .
2014-03-03 00:35:13 +01:00
*
2015-08-25 23:42:20 +02:00
* @ param mixed $value New value of transient .
* @ param int $expiration Time until expiration in seconds .
* @ param string $transient Transient name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
$value = apply_filters ( 'pre_set_transient_' . $transient , $value , $expiration , $transient );
2011-12-20 00:15:32 +01:00
2013-09-06 20:10:09 +02:00
if ( wp_using_ext_object_cache () ) {
2011-12-20 00:15:32 +01:00
$result = wp_cache_set ( $transient , $value , 'transient' , $expiration );
} else {
$transient_timeout = '_transient_timeout_' . $transient ;
$transient = '_transient_' . $transient ;
if ( false === get_option ( $transient ) ) {
$autoload = 'yes' ;
if ( $expiration ) {
$autoload = 'no' ;
add_option ( $transient_timeout , time () + $expiration , '' , 'no' );
}
$result = add_option ( $transient , $value , '' , $autoload );
} else {
2014-03-25 19:23:14 +01: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 ) ) {
delete_option ( $transient );
add_option ( $transient_timeout , time () + $expiration , '' , 'no' );
$result = add_option ( $transient , $value , '' , 'no' );
$update = false ;
} else {
update_option ( $transient_timeout , time () + $expiration );
}
}
if ( $update ) {
$result = update_option ( $transient , $value );
}
2011-12-20 00:15:32 +01:00
}
}
2014-03-03 00:35:13 +01:00
2011-12-20 00:15:32 +01:00
if ( $result ) {
2014-03-03 00:35:13 +01:00
/**
* Fires after the value for a specific transient has been set .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.0 . 0
*
* @ param mixed $value Transient value .
* @ param int $expiration Time until expiration in seconds . Default 0.
*/
2013-06-16 06:06:12 +02:00
do_action ( 'set_transient_' . $transient , $value , $expiration );
2014-03-03 00:35:13 +01:00
/**
* Fires after the value for a transient has been set .
*
* @ since 3.0 . 0
*
* @ param string $transient The name of the transient .
* @ param mixed $value Transient value .
* @ param int $expiration Time until expiration in seconds . Default 0.
*/
2013-06-16 06:06:12 +02:00
do_action ( 'setted_transient' , $transient , $value , $expiration );
2011-12-20 00:15:32 +01: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 () {
2014-08-02 22:09:16 +02:00
if ( ! is_admin () || defined ( 'DOING_AJAX' ) ) {
2011-12-20 00:15:32 +01:00
return ;
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
2014-08-02 22:09:16 +02:00
if ( ! $user_id = get_current_user_id () ) {
2011-12-20 00:15:32 +01:00
return ;
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
2014-08-02 22:09:16 +02:00
if ( is_super_admin () && ! is_user_member_of_blog () ) {
2012-10-17 20:58:09 +02:00
return ;
2014-08-02 22:09:16 +02:00
}
2012-10-17 20:58:09 +02:00
2013-08-23 23:43:09 +02:00
$settings = ( string ) get_user_option ( 'user-settings' , $user_id );
2011-12-20 00:15:32 +01:00
2014-08-13 04:47:16 +02:00
if ( isset ( $_COOKIE [ 'wp-settings-' . $user_id ] ) ) {
$cookie = preg_replace ( '/[^A-Za-z0-9=&_]/' , '' , $_COOKIE [ 'wp-settings-' . $user_id ] );
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02:00
// No change or both empty
if ( $cookie == $settings )
return ;
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02:00
$last_saved = ( int ) get_user_option ( 'user-settings-time' , $user_id );
2014-08-13 04:47:16 +02:00
$current = isset ( $_COOKIE [ 'wp-settings-time-' . $user_id ]) ? preg_replace ( '/[^0-9]/' , '' , $_COOKIE [ 'wp-settings-time-' . $user_id ] ) : 0 ;
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02: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-20 00:15:32 +01:00
}
}
2013-08-23 23:43:09 +02:00
// The cookie is not set in the current browser or the saved value is newer.
2014-07-27 19:46:17 +02:00
$secure = ( 'https' === parse_url ( site_url (), PHP_URL_SCHEME ) );
2014-08-13 04:47:16 +02: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-20 00:15:32 +01:00
}
/**
* Retrieve user interface setting value based on setting name .
*
* @ since 2.7 . 0
*
2015-05-27 00:17:25 +02:00
* @ param string $name The name of the setting .
2011-12-20 00:15:32 +01: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 23:43:09 +02:00
$all_user_settings = get_all_user_settings ();
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02:00
return isset ( $all_user_settings [ $name ] ) ? $all_user_settings [ $name ] : $default ;
2011-12-20 00:15:32 +01:00
}
/**
* Add or update user interface setting .
*
* Both $name and $value can contain only ASCII letters , numbers and underscores .
* This function has to be used before any output has started as it calls setcookie () .
*
* @ since 2.8 . 0
*
2015-05-27 00:17:25 +02:00
* @ param string $name The name of the setting .
2011-12-20 00:15:32 +01:00
* @ param string $value The value for the setting .
2015-05-27 00:17:25 +02:00
* @ return bool | void true if set successfully / false if not .
2011-12-20 00:15:32 +01:00
*/
function set_user_setting ( $name , $value ) {
2014-08-02 22:09:16 +02:00
if ( headers_sent () ) {
2011-12-20 00:15:32 +01:00
return false ;
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02:00
$all_user_settings = get_all_user_settings ();
$all_user_settings [ $name ] = $value ;
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02:00
return wp_set_all_user_settings ( $all_user_settings );
2011-12-20 00:15:32 +01:00
}
/**
* Delete user interface settings .
*
* Deleting settings would reset them to the defaults .
* This function has to be used before any output has started as it calls setcookie () .
*
* @ since 2.7 . 0
*
2014-11-30 23:56:25 +01:00
* @ param string $names The name or array of names of the setting to be deleted .
2015-05-27 00:17:25 +02:00
* @ return bool | void true if deleted successfully / false if not .
2011-12-20 00:15:32 +01:00
*/
function delete_user_setting ( $names ) {
2014-08-02 22:09:16 +02:00
if ( headers_sent () ) {
2011-12-20 00:15:32 +01:00
return false ;
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02:00
$all_user_settings = get_all_user_settings ();
2011-12-20 00:15:32 +01:00
$names = ( array ) $names ;
2013-08-23 23:43:09 +02:00
$deleted = false ;
2011-12-20 00:15:32 +01:00
foreach ( $names as $name ) {
2013-08-23 23:43:09 +02:00
if ( isset ( $all_user_settings [ $name ] ) ) {
unset ( $all_user_settings [ $name ] );
2011-12-20 00:15:32 +01:00
$deleted = true ;
}
}
2014-08-02 22:09:16 +02:00
if ( $deleted ) {
2013-08-23 23:43:09 +02:00
return wp_set_all_user_settings ( $all_user_settings );
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
return false ;
}
/**
* Retrieve all user interface settings .
*
* @ since 2.7 . 0
*
2015-05-27 00:17:25 +02:00
* @ global array $_updated_user_settings
*
2011-12-20 00:15:32 +01:00
* @ return array the last saved user settings or empty array .
*/
function get_all_user_settings () {
global $_updated_user_settings ;
2014-08-02 22:09:16 +02:00
if ( ! $user_id = get_current_user_id () ) {
2011-12-20 00:15:32 +01:00
return array ();
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
2014-08-02 22:09:16 +02:00
if ( isset ( $_updated_user_settings ) && is_array ( $_updated_user_settings ) ) {
2011-12-20 00:15:32 +01:00
return $_updated_user_settings ;
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02:00
$user_settings = array ();
2011-12-20 00:15:32 +01:00
2014-08-13 04:47:16 +02:00
if ( isset ( $_COOKIE [ 'wp-settings-' . $user_id ] ) ) {
2014-08-02 22:09:16 +02:00
$cookie = preg_replace ( '/[^A-Za-z0-9=&_]/' , '' , $_COOKIE [ 'wp-settings-' . $user_id ] );
2011-12-20 00:15:32 +01:00
2014-08-13 04:47:16 +02:00
if ( strpos ( $cookie , '=' ) ) { // '=' cannot be 1st char
parse_str ( $cookie , $user_settings );
}
2011-12-20 00:15:32 +01:00
} else {
2013-08-23 23:43:09 +02:00
$option = get_user_option ( 'user-settings' , $user_id );
2014-08-13 04:47:16 +02:00
if ( $option && is_string ( $option ) ) {
2013-08-23 23:43:09 +02:00
parse_str ( $option , $user_settings );
2014-08-13 04:47:16 +02:00
}
2011-12-20 00:15:32 +01:00
}
2013-08-23 23:43:09 +02:00
$_updated_user_settings = $user_settings ;
return $user_settings ;
2011-12-20 00:15:32 +01:00
}
/**
* Private . Set all user interface settings .
*
* @ since 2.8 . 0
*
2015-05-27 00:17:25 +02:00
* @ global array $_updated_user_settings
*
2013-08-23 23:43:09 +02:00
* @ param array $user_settings
2015-05-27 00:17:25 +02:00
* @ return bool | void
2011-12-20 00:15:32 +01:00
*/
2013-08-23 23:43:09 +02:00
function wp_set_all_user_settings ( $user_settings ) {
2011-12-20 00:15:32 +01:00
global $_updated_user_settings ;
2014-08-02 22:09:16 +02:00
if ( ! $user_id = get_current_user_id () ) {
2011-12-20 00:15:32 +01:00
return false ;
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
2014-08-02 22:09:16 +02:00
if ( is_super_admin () && ! is_user_member_of_blog () ) {
2012-10-17 20:58:09 +02:00
return ;
2014-08-02 22:09:16 +02:00
}
2012-10-17 20:58:09 +02:00
2011-12-20 00:15:32 +01:00
$settings = '' ;
2013-08-23 23:43:09 +02:00
foreach ( $user_settings as $name => $value ) {
$_name = preg_replace ( '/[^A-Za-z0-9_]+/' , '' , $name );
$_value = preg_replace ( '/[^A-Za-z0-9_]+/' , '' , $value );
2014-08-02 22:09:16 +02:00
if ( ! empty ( $_name ) ) {
2013-08-23 23:43:09 +02:00
$settings .= $_name . '=' . $_value . '&' ;
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
}
2014-08-02 22:09:16 +02:00
$settings = rtrim ( $settings , '&' );
2013-08-23 23:43:09 +02:00
parse_str ( $settings , $_updated_user_settings );
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02:00
update_user_option ( $user_id , 'user-settings' , $settings , false );
update_user_option ( $user_id , 'user-settings-time' , time (), false );
2011-12-20 00:15:32 +01:00
return true ;
}
/**
* Delete the user settings of the current user .
*
* @ since 2.7 . 0
*/
function delete_all_user_settings () {
2014-08-02 22:09:16 +02:00
if ( ! $user_id = get_current_user_id () ) {
2011-12-20 00:15:32 +01:00
return ;
2014-08-02 22:09:16 +02:00
}
2011-12-20 00:15:32 +01:00
2013-08-23 23:43:09 +02:00
update_user_option ( $user_id , 'user-settings' , '' , false );
2014-08-13 04:47:16 +02:00
setcookie ( 'wp-settings-' . $user_id , ' ' , time () - YEAR_IN_SECONDS , SITECOOKIEPATH );
2011-12-20 00:15:32 +01:00
}
/**
* Retrieve site option value based on name of option .
*
* @ since 2.8 . 0
*
2014-03-03 00:35:13 +01:00
* @ see get_option ()
2011-12-20 00:15:32 +01:00
*
2015-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
* @ 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 $use_cache Whether to use cache . Multisite only . Default true .
2011-12-20 00:15:32 +01:00
* @ return mixed Value set for the option .
*/
function get_site_option ( $option , $default = false , $use_cache = true ) {
global $wpdb ;
2014-03-03 00:35:13 +01:00
/**
* Filter an existing site option before it is retrieved .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01: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-25 23:42:20 +02:00
* @ param mixed $pre_option The default value to return if the option does not exist .
* @ param string $option Option name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
$pre = apply_filters ( 'pre_site_option_' . $option , false , $option );
2014-03-03 00:35:13 +01:00
2011-12-20 00:15:32 +01:00
if ( false !== $pre )
return $pre ;
2013-08-17 00:42:09 +02:00
// prevent non-existent options from triggering multiple queries
2013-11-21 20:07:10 +01:00
$notoptions_key = " { $wpdb -> siteid } :notoptions " ;
$notoptions = wp_cache_get ( $notoptions_key , 'site-options' );
2014-03-03 00:35:13 +01:00
if ( isset ( $notoptions [ $option ] ) ) {
/**
* Filter a specific default site option .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.4 . 0
*
2015-08-25 23:42:20 +02: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-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
return apply_filters ( 'default_site_option_' . $option , $default , $option );
2014-03-03 00:35:13 +01:00
}
2013-08-17 00:42:09 +02:00
2012-05-14 19:00:13 +02:00
if ( ! is_multisite () ) {
2014-03-03 00:35:13 +01:00
/** This filter is documented in wp-includes/option.php */
2015-08-25 23:42:20 +02:00
$default = apply_filters ( 'default_site_option_' . $option , $default , $option );
2011-12-20 00:15:32 +01:00
$value = get_option ( $option , $default );
} else {
$cache_key = " { $wpdb -> siteid } : $option " ;
if ( $use_cache )
$value = wp_cache_get ( $cache_key , 'site-options' );
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 , $wpdb -> siteid ) );
// 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 21:01:26 +02:00
if ( ! is_array ( $notoptions ) ) {
$notoptions = array ();
}
2013-08-17 00:42:09 +02:00
$notoptions [ $option ] = true ;
2013-11-21 20:07:10 +01:00
wp_cache_set ( $notoptions_key , $notoptions , 'site-options' );
2014-03-03 00:35:13 +01:00
/** This filter is documented in wp-includes/option.php */
2015-08-25 23:42:20 +02:00
$value = apply_filters ( 'default_site_option_' . $option , $default , $option );
2011-12-20 00:15:32 +01:00
}
}
}
2014-03-03 00:35:13 +01:00
/**
* Filter the value of an existing site option .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.9 . 0 As 'site_option_' . $key
* @ since 3.0 . 0
*
2015-08-25 23:42:20 +02:00
* @ param mixed $value Value of site option .
* @ param string $option Option name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
return apply_filters ( 'site_option_' . $option , $value , $option );
2011-12-20 00:15:32 +01:00
}
/**
* Add a new site option .
*
* Existing options will not be updated . Note that prior to 3.3 this wasn ' t the case .
*
* @ since 2.8 . 0
*
2014-03-03 00:35:13 +01:00
* @ see add_option ()
2011-12-20 00:15:32 +01:00
*
2015-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
2011-12-20 00:15:32 +01:00
* @ param string $option Name of option to add . Expected to not be SQL - escaped .
2015-05-27 00:17:25 +02:00
* @ param mixed $value Optional . Option value , can be anything . Expected to not be SQL - escaped .
2011-12-20 00:15:32 +01:00
* @ return bool False if option was not added and true if option was added .
*/
function add_site_option ( $option , $value ) {
global $wpdb ;
2013-08-17 00:42:09 +02:00
wp_protect_special_option ( $option );
2014-03-03 00:35:13 +01:00
/**
* Filter the value of a specific site option before it is added .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.9 . 0 As 'pre_add_site_option_' . $key
* @ since 3.0 . 0
*
2015-08-25 23:42:20 +02:00
* @ param mixed $value Value of site option .
* @ param string $option Option name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
$value = apply_filters ( 'pre_add_site_option_' . $option , $value , $option );
2014-03-03 00:35:13 +01:00
2013-11-21 20:07:10 +01:00
$notoptions_key = " { $wpdb -> siteid } :notoptions " ;
2011-12-20 00:15:32 +01:00
if ( ! is_multisite () ) {
$result = add_option ( $option , $value );
} else {
$cache_key = " { $wpdb -> siteid } : $option " ;
2013-08-17 00:42:09 +02: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 20:07:10 +01:00
$notoptions = wp_cache_get ( $notoptions_key , 'site-options' );
2013-08-17 00:42:09 +02:00
if ( ! is_array ( $notoptions ) || ! isset ( $notoptions [ $option ] ) )
if ( false !== get_site_option ( $option ) )
return false ;
2011-12-20 00:15:32 +01:00
$value = sanitize_option ( $option , $value );
2013-08-17 00:42:09 +02:00
2013-10-02 22:43:10 +02:00
$serialized_value = maybe_serialize ( $value );
$result = $wpdb -> insert ( $wpdb -> sitemeta , array ( 'site_id' => $wpdb -> siteid , 'meta_key' => $option , 'meta_value' => $serialized_value ) );
2011-12-20 00:15:32 +01:00
2013-10-02 22:43:10 +02:00
if ( ! $result )
return false ;
wp_cache_set ( $cache_key , $value , 'site-options' );
2013-08-17 00:42:09 +02:00
// This option exists now
2013-11-21 20:07:10 +01:00
$notoptions = wp_cache_get ( $notoptions_key , 'site-options' ); // yes, again... we need it to be fresh
2013-08-17 00:42:09 +02:00
if ( is_array ( $notoptions ) && isset ( $notoptions [ $option ] ) ) {
unset ( $notoptions [ $option ] );
2013-11-21 20:07:10 +01:00
wp_cache_set ( $notoptions_key , $notoptions , 'site-options' );
2013-08-17 00:42:09 +02:00
}
2011-12-20 00:15:32 +01:00
}
if ( $result ) {
2014-03-03 00:35:13 +01:00
/**
* Fires after a specific site option has been successfully added .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.9 . 0 As " add_site_option_ { $key } "
* @ since 3.0 . 0
*
* @ param string $option Name of site option .
* @ param mixed $value Value of site option .
*/
2011-12-20 00:15:32 +01:00
do_action ( " add_site_option_ { $option } " , $option , $value );
2014-03-03 00:35:13 +01:00
/**
* Fires after a site option has been successfully added .
*
* @ since 3.0 . 0
*
* @ param string $option Name of site option .
* @ param mixed $value Value of site option .
*/
2011-12-20 00:15:32 +01:00
do_action ( " add_site_option " , $option , $value );
2014-03-03 00:35:13 +01:00
2011-12-20 00:15:32 +01:00
return true ;
}
return false ;
}
/**
* Removes site option by name .
*
* @ since 2.8 . 0
*
2014-03-03 00:35:13 +01:00
* @ see delete_option ()
2011-12-20 00:15:32 +01:00
*
2015-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
2011-12-20 00:15:32 +01:00
* @ 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 ) {
global $wpdb ;
// ms_protect_special_option( $option ); @todo
2014-03-03 00:35:13 +01:00
/**
* Fires immediately before a specific site option is deleted .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.0 . 0
2015-08-25 23:42:20 +02:00
*
* @ param string $option Option name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
do_action ( 'pre_delete_site_option_' . $option , $option );
2011-12-20 00:15:32 +01:00
if ( ! is_multisite () ) {
$result = delete_option ( $option );
} else {
$row = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT meta_id FROM { $wpdb -> sitemeta } WHERE meta_key = %s AND site_id = %d " , $option , $wpdb -> siteid ) );
if ( is_null ( $row ) || ! $row -> meta_id )
return false ;
$cache_key = " { $wpdb -> siteid } : $option " ;
wp_cache_delete ( $cache_key , 'site-options' );
2012-03-24 16:24:31 +01:00
$result = $wpdb -> delete ( $wpdb -> sitemeta , array ( 'meta_key' => $option , 'site_id' => $wpdb -> siteid ) );
2011-12-20 00:15:32 +01:00
}
if ( $result ) {
2014-03-03 00:35:13 +01:00
/**
* Fires after a specific site option has been deleted .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.9 . 0 As " delete_site_option_ { $key } "
* @ since 3.0 . 0
*
* @ param string $option Name of the site option .
*/
2011-12-20 00:15:32 +01:00
do_action ( " delete_site_option_ { $option } " , $option );
2014-03-03 00:35:13 +01:00
/**
* Fires after a site option has been deleted .
*
* @ since 3.0 . 0
*
* @ param string $option Name of the site option .
*/
2011-12-20 00:15:32 +01:00
do_action ( " delete_site_option " , $option );
2014-03-03 00:35:13 +01:00
2011-12-20 00:15:32 +01:00
return true ;
}
return false ;
}
/**
* Update the value of a site option that was already added .
*
* @ since 2.8 . 0
*
2014-03-03 00:35:13 +01:00
* @ see update_option ()
2011-12-20 00:15:32 +01:00
*
2015-05-27 00:17:25 +02:00
* @ global wpdb $wpdb
*
2011-12-20 00:15:32 +01:00
* @ param string $option Name of option . Expected to not be SQL - escaped .
2015-05-27 00:17:25 +02:00
* @ param mixed $value Option value . Expected to not be SQL - escaped .
2011-12-20 00:15:32 +01:00
* @ return bool False if value was not updated and true if value was updated .
*/
function update_site_option ( $option , $value ) {
global $wpdb ;
2013-08-17 00:42:09 +02:00
wp_protect_special_option ( $option );
2013-10-02 22:43:10 +02:00
$old_value = get_site_option ( $option );
2014-03-03 00:35:13 +01:00
/**
* Filter a specific site option before its value is updated .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.9 . 0 As 'pre_update_site_option_' . $key
* @ since 3.0 . 0
*
2015-08-25 23:42:20 +02:00
* @ param mixed $value New value of site option .
* @ param mixed $old_value Old value of site option .
* @ param string $option Option name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
$value = apply_filters ( 'pre_update_site_option_' . $option , $value , $old_value , $option );
2011-12-20 00:15:32 +01:00
2013-10-02 22:43:10 +02:00
if ( $value === $old_value )
2011-12-20 00:15:32 +01:00
return false ;
2013-10-02 22:43:10 +02:00
if ( false === $old_value )
2011-12-20 00:15:32 +01:00
return add_site_option ( $option , $value );
2013-11-21 20:07:10 +01:00
$notoptions_key = " { $wpdb -> siteid } :notoptions " ;
$notoptions = wp_cache_get ( $notoptions_key , 'site-options' );
2013-08-17 00:42:09 +02:00
if ( is_array ( $notoptions ) && isset ( $notoptions [ $option ] ) ) {
unset ( $notoptions [ $option ] );
2013-11-21 20:07:10 +01:00
wp_cache_set ( $notoptions_key , $notoptions , 'site-options' );
2013-08-17 00:42:09 +02:00
}
2011-12-20 00:15:32 +01:00
if ( ! is_multisite () ) {
$result = update_option ( $option , $value );
} else {
$value = sanitize_option ( $option , $value );
2013-10-02 22:43:10 +02:00
$serialized_value = maybe_serialize ( $value );
$result = $wpdb -> update ( $wpdb -> sitemeta , array ( 'meta_value' => $serialized_value ), array ( 'site_id' => $wpdb -> siteid , 'meta_key' => $option ) );
if ( $result ) {
$cache_key = " { $wpdb -> siteid } : $option " ;
wp_cache_set ( $cache_key , $value , 'site-options' );
}
2011-12-20 00:15:32 +01:00
}
if ( $result ) {
2014-03-03 00:35:13 +01:00
/**
* Fires after the value of a specific site option has been successfully updated .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$option` , refers to the option name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.9 . 0 As " update_site_option_ { $key } "
* @ since 3.0 . 0
*
* @ param string $option Name of site option .
* @ param mixed $value Current value of site option .
* @ param mixed $old_value Old value of site option .
*/
2013-10-02 22:43:10 +02:00
do_action ( " update_site_option_ { $option } " , $option , $value , $old_value );
2014-03-03 00:35:13 +01:00
/**
* Fires after the value of a site option has been successfully updated .
*
* @ since 3.0 . 0
*
* @ param string $option Name of site option .
* @ param mixed $value Current value of site option .
* @ param mixed $old_value Old value of site option .
*/
2013-10-02 22:43:10 +02:00
do_action ( " update_site_option " , $option , $value , $old_value );
2014-03-03 00:35:13 +01:00
2011-12-20 00:15:32 +01:00
return true ;
}
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-03 00:35:13 +01:00
/**
* Fires immediately before a specific site transient is deleted .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.0 . 0
*
* @ param string $transient Transient name .
*/
2011-12-20 00:15:32 +01:00
do_action ( 'delete_site_transient_' . $transient , $transient );
2014-03-03 00:35:13 +01:00
2013-09-06 20:10:09 +02:00
if ( wp_using_ext_object_cache () ) {
2011-12-20 00:15:32 +01:00
$result = wp_cache_delete ( $transient , 'site-transient' );
} else {
$option_timeout = '_site_transient_timeout_' . $transient ;
$option = '_site_transient_' . $transient ;
$result = delete_site_option ( $option );
if ( $result )
delete_site_option ( $option_timeout );
}
2014-03-03 00:35:13 +01:00
if ( $result ) {
/**
* Fires after a transient is deleted .
*
* @ since 3.0 . 0
*
* @ param string $transient Deleted transient name .
*/
2011-12-20 00:15:32 +01:00
do_action ( 'deleted_site_transient' , $transient );
2014-03-03 00:35:13 +01:00
}
2011-12-20 00:15:32 +01:00
return $result ;
}
/**
* Get the value of a site transient .
*
2014-06-05 17:34:14 +02:00
* If the transient does not exist , does not have a value , or has expired ,
* then the return value will be false .
2011-12-20 00:15:32 +01:00
*
* @ since 2.9 . 0
*
2014-03-03 00:35:13 +01:00
* @ see get_transient ()
2011-12-20 00:15:32 +01:00
*
* @ param string $transient Transient name . Expected to not be SQL - escaped .
2014-06-05 17:34:14 +02:00
* @ return mixed Value of transient .
2011-12-20 00:15:32 +01:00
*/
function get_site_transient ( $transient ) {
2014-03-03 00:35:13 +01:00
/**
* Filter the value of an existing site transient .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01:00
*
* Passing a truthy value to the filter will effectively short - circuit retrieval ,
* returning the passed value instead .
*
* @ since 2.9 . 0
*
2015-08-25 23:42:20 +02: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-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
$pre = apply_filters ( 'pre_site_transient_' . $transient , false , $transient );
2014-03-03 00:35:13 +01:00
2011-12-20 00:15:32 +01:00
if ( false !== $pre )
return $pre ;
2013-09-06 20:10:09 +02:00
if ( wp_using_ext_object_cache () ) {
2011-12-20 00:15:32 +01: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 ;
$timeout = get_site_option ( $transient_timeout );
if ( false !== $timeout && $timeout < time () ) {
delete_site_option ( $transient_option );
delete_site_option ( $transient_timeout );
2013-08-21 21:14:09 +02:00
$value = false ;
2011-12-20 00:15:32 +01:00
}
}
2013-08-21 21:14:09 +02:00
if ( ! isset ( $value ) )
$value = get_site_option ( $transient_option );
2011-12-20 00:15:32 +01:00
}
2014-03-03 00:35:13 +01:00
/**
* Filter the value of an existing site transient .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01:00
*
* @ since 2.9 . 0
*
2015-08-25 23:42:20 +02:00
* @ param mixed $value Value of site transient .
* @ param string $transient Transient name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
return apply_filters ( 'site_transient_' . $transient , $value , $transient );
2011-12-20 00:15:32 +01: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-03 00:35:13 +01:00
* @ see set_transient ()
2011-12-20 00:15:32 +01:00
*
2014-06-11 18:33:15 +02: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 .
* @ param int $expiration Optional . Time until expiration in seconds . Default 0.
2011-12-20 00:15:32 +01: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-03 00:35:13 +01:00
/**
* Filter the value of a specific site transient before it is set .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.0 . 0
*
2015-08-25 23:42:20 +02:00
* @ param mixed $value Value of site transient .
* @ param string $transient Transient name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
$value = apply_filters ( 'pre_set_site_transient_' . $transient , $value , $transient );
2014-03-03 00:35:13 +01:00
2013-09-16 19:43:09 +02:00
$expiration = ( int ) $expiration ;
2011-12-20 00:15:32 +01:00
2013-09-06 20:10:09 +02:00
if ( wp_using_ext_object_cache () ) {
2011-12-20 00:15:32 +01:00
$result = wp_cache_set ( $transient , $value , 'site-transient' , $expiration );
} else {
$transient_timeout = '_site_transient_timeout_' . $transient ;
2013-09-11 10:46:10 +02:00
$option = '_site_transient_' . $transient ;
if ( false === get_site_option ( $option ) ) {
2011-12-20 00:15:32 +01:00
if ( $expiration )
add_site_option ( $transient_timeout , time () + $expiration );
2013-09-11 10:46:10 +02:00
$result = add_site_option ( $option , $value );
2011-12-20 00:15:32 +01:00
} else {
if ( $expiration )
update_site_option ( $transient_timeout , time () + $expiration );
2013-09-11 10:46:10 +02:00
$result = update_site_option ( $option , $value );
2011-12-20 00:15:32 +01:00
}
}
if ( $result ) {
2014-03-03 00:35:13 +01:00
/**
* Fires after the value for a specific site transient has been set .
*
2014-11-30 12:53:22 +01:00
* The dynamic portion of the hook name , `$transient` , refers to the transient name .
2014-03-03 00:35:13 +01:00
*
* @ since 3.0 . 0
*
2015-08-25 23:42:20 +02:00
* @ param mixed $value Site transient value .
* @ param int $expiration Time until expiration in seconds . Default 0.
* @ param string $transient Transient name .
2014-03-03 00:35:13 +01:00
*/
2015-08-25 23:42:20 +02:00
do_action ( 'set_site_transient_' . $transient , $value , $expiration , $transient );
2014-03-03 00:35:13 +01: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 .
* @ param int $expiration Time until expiration in seconds . Default 0.
*/
2013-06-16 06:06:12 +02:00
do_action ( 'setted_site_transient' , $transient , $value , $expiration );
2011-12-20 00:15:32 +01:00
}
return $result ;
}