X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/03f2fa83c13c1b532284205fa7efcab9b8b2c41f..16e7b37c7914d753890c1a05a9335f3b43751eb8:/wp-includes/option.php diff --git a/wp-includes/option.php b/wp-includes/option.php index 6d9fe645..ac17c2f5 100644 --- a/wp-includes/option.php +++ b/wp-includes/option.php @@ -7,7 +7,7 @@ */ /** - * Retrieve option value based on name of option. + * Retrieves an option value based on an option name. * * 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 @@ -16,6 +16,9 @@ * * If the option was serialized then it will be unserialized when it is returned. * + * 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. + * * @since 1.5.0 * * @global wpdb $wpdb WordPress database abstraction object. @@ -32,7 +35,7 @@ function get_option( $option, $default = false ) { return false; /** - * Filter the value of an existing option before it is retrieved. + * Filters the value of an existing option before it is retrieved. * * The dynamic portion of the hook name, `$option`, refers to the option name. * @@ -46,30 +49,35 @@ function get_option( $option, $default = false ) { * Default false to skip it. * @param string $option Option name. */ - $pre = apply_filters( 'pre_option_' . $option, false, $option ); + $pre = apply_filters( "pre_option_{$option}", false, $option ); if ( false !== $pre ) return $pre; if ( defined( 'WP_SETUP_CONFIG' ) ) return false; + // Distinguish between `false` as a default, and not passing one. + $passed_default = func_num_args() > 1; + if ( ! wp_installing() ) { // prevent non-existent options from triggering multiple queries $notoptions = wp_cache_get( 'notoptions', 'options' ); if ( isset( $notoptions[ $option ] ) ) { /** - * Filter the default value for an option. + * Filters the default value for an option. * * The dynamic portion of the hook name, `$option`, refers to the option name. * * @since 3.4.0 * @since 4.4.0 The `$option` parameter was added. + * @since 4.7.0 The `$passed_default` parameter was added to distinguish between a `false` value and the default parameter value. * * @param mixed $default The default value to return if the option does not exist * in the database. * @param string $option Option name. + * @param bool $passed_default Was `get_option()` passed a default value? */ - return apply_filters( 'default_option_' . $option, $default, $option ); + return apply_filters( "default_option_{$option}", $default, $option, $passed_default ); } $alloptions = wp_load_alloptions(); @@ -94,7 +102,7 @@ function get_option( $option, $default = false ) { wp_cache_set( 'notoptions', $notoptions, 'options' ); /** This filter is documented in wp-includes/option.php */ - return apply_filters( 'default_option_' . $option, $default, $option ); + return apply_filters( 'default_option_' . $option, $default, $option, $passed_default ); } } } @@ -106,7 +114,7 @@ function get_option( $option, $default = false ) { $value = $row->option_value; } else { /** This filter is documented in wp-includes/option.php */ - return apply_filters( 'default_option_' . $option, $default, $option ); + return apply_filters( 'default_option_' . $option, $default, $option, $passed_default ); } } @@ -118,7 +126,7 @@ function get_option( $option, $default = false ) { $value = untrailingslashit( $value ); /** - * Filter the value of an existing option. + * Filters the value of an existing option. * * The dynamic portion of the hook name, `$option`, refers to the option name. * @@ -130,7 +138,7 @@ function get_option( $option, $default = false ) { * unserialized prior to being returned. * @param string $option Option name. */ - return apply_filters( 'option_' . $option, maybe_unserialize( $value ), $option ); + return apply_filters( "option_{$option}", maybe_unserialize( $value ), $option ); } /** @@ -263,7 +271,7 @@ function update_option( $option, $value, $autoload = null ) { $old_value = get_option( $option ); /** - * Filter a specific option before its value is (maybe) serialized and updated. + * Filters a specific option before its value is (maybe) serialized and updated. * * The dynamic portion of the hook name, `$option`, refers to the option name. * @@ -274,10 +282,10 @@ function update_option( $option, $value, $autoload = null ) { * @param mixed $old_value The old option value. * @param string $option Option name. */ - $value = apply_filters( 'pre_update_option_' . $option, $value, $old_value, $option ); + $value = apply_filters( "pre_update_option_{$option}", $value, $old_value, $option ); /** - * Filter an option before its value is (maybe) serialized and updated. + * Filters an option before its value is (maybe) serialized and updated. * * @since 3.9.0 * @@ -292,7 +300,7 @@ function update_option( $option, $value, $autoload = null ) { return false; /** This filter is documented in wp-includes/option.php */ - if ( apply_filters( 'default_option_' . $option, false ) === $old_value ) { + if ( apply_filters( 'default_option_' . $option, false, $option, false ) === $old_value ) { // Default setting for new options is 'yes'. if ( null === $autoload ) { $autoload = 'yes'; @@ -396,7 +404,7 @@ function add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' ) global $wpdb; if ( !empty( $deprecated ) ) - _deprecated_argument( __FUNCTION__, '2.3' ); + _deprecated_argument( __FUNCTION__, '2.3.0' ); $option = trim($option); if ( empty($option) ) @@ -413,7 +421,7 @@ function add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' ) $notoptions = wp_cache_get( 'notoptions', 'options' ); if ( !is_array( $notoptions ) || !isset( $notoptions[$option] ) ) /** This filter is documented in wp-includes/option.php */ - if ( apply_filters( 'default_option_' . $option, false ) !== get_option( $option ) ) + if ( apply_filters( 'default_option_' . $option, false, $option, false ) !== get_option( $option ) ) return false; $serialized_value = maybe_serialize( $value ); @@ -531,7 +539,7 @@ function delete_option( $option ) { * * @param string $option Name of the deleted option. */ - do_action( "delete_option_$option", $option ); + do_action( "delete_option_{$option}", $option ); /** * Fires after an option has been deleted. @@ -565,7 +573,7 @@ function delete_transient( $transient ) { * * @param string $transient Transient name. */ - do_action( 'delete_transient_' . $transient, $transient ); + do_action( "delete_transient_{$transient}", $transient ); if ( wp_using_ext_object_cache() ) { $result = wp_cache_delete( $transient, 'transient' ); @@ -606,7 +614,7 @@ function delete_transient( $transient ) { function get_transient( $transient ) { /** - * Filter the value of an existing transient. + * Filters the value of an existing transient. * * The dynamic portion of the hook name, `$transient`, refers to the transient name. * @@ -621,7 +629,7 @@ function get_transient( $transient ) { * of the transient, and return the returned value. * @param string $transient Transient name. */ - $pre = apply_filters( 'pre_transient_' . $transient, false, $transient ); + $pre = apply_filters( "pre_transient_{$transient}", false, $transient ); if ( false !== $pre ) return $pre; @@ -648,7 +656,7 @@ function get_transient( $transient ) { } /** - * Filter an existing transient's value. + * Filters an existing transient's value. * * The dynamic portion of the hook name, `$transient`, refers to the transient name. * @@ -658,7 +666,7 @@ function get_transient( $transient ) { * @param mixed $value Value of transient. * @param string $transient Transient name. */ - return apply_filters( 'transient_' . $transient, $value, $transient ); + return apply_filters( "transient_{$transient}", $value, $transient ); } /** @@ -681,7 +689,7 @@ function set_transient( $transient, $value, $expiration = 0 ) { $expiration = (int) $expiration; /** - * Filter a specific transient before its value is set. + * Filters a specific transient before its value is set. * * The dynamic portion of the hook name, `$transient`, refers to the transient name. * @@ -693,10 +701,10 @@ function set_transient( $transient, $value, $expiration = 0 ) { * @param int $expiration Time until expiration in seconds. * @param string $transient Transient name. */ - $value = apply_filters( 'pre_set_transient_' . $transient, $value, $expiration, $transient ); + $value = apply_filters( "pre_set_transient_{$transient}", $value, $expiration, $transient ); /** - * Filter the expiration for a transient before its value is set. + * Filters the expiration for a transient before its value is set. * * The dynamic portion of the hook name, `$transient`, refers to the transient name. * @@ -706,7 +714,7 @@ function set_transient( $transient, $value, $expiration = 0 ) { * @param mixed $value New value of transient. * @param string $transient Transient name. */ - $expiration = apply_filters( 'expiration_of_transient_' . $transient, $expiration, $value, $transient ); + $expiration = apply_filters( "expiration_of_transient_{$transient}", $expiration, $value, $transient ); if ( wp_using_ext_object_cache() ) { $result = wp_cache_set( $transient, $value, 'transient', $expiration ); @@ -755,7 +763,7 @@ function set_transient( $transient, $value, $expiration = 0 ) { * @param int $expiration Time until expiration in seconds. * @param string $transient The name of the transient. */ - do_action( 'set_transient_' . $transient, $value, $expiration, $transient ); + do_action( "set_transient_{$transient}", $value, $expiration, $transient ); /** * Fires after the value for a transient has been set. @@ -783,7 +791,7 @@ function set_transient( $transient, $value, $expiration = 0 ) { */ function wp_user_settings() { - if ( ! is_admin() || defined( 'DOING_AJAX' ) ) { + if ( ! is_admin() || wp_doing_ajax() ) { return; } @@ -841,13 +849,14 @@ function get_user_setting( $name, $default = false ) { * 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 * * @param string $name The name of the setting. * @param string $value The value for the setting. - * @return bool|void true if set successfully/false if not. + * @return bool|null True if set successfully, false if not. Null if the current user can't be established. */ function set_user_setting( $name, $value ) { if ( headers_sent() ) { @@ -864,12 +873,13 @@ function set_user_setting( $name, $value ) { * 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 * * @param string $names The name or array of names of the setting to be deleted. - * @return bool|void true if deleted successfully/false if not. + * @return bool|null True if deleted successfully, false if not. Null if the current user can't be established. */ function delete_user_setting( $names ) { if ( headers_sent() ) { @@ -938,11 +948,13 @@ function get_all_user_settings() { * Private. Set all user interface settings. * * @since 2.8.0 + * @access private * * @global array $_updated_user_settings * - * @param array $user_settings - * @return bool|void + * @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. */ function wp_set_all_user_settings( $user_settings ) { global $_updated_user_settings; @@ -1062,8 +1074,7 @@ function update_site_option( $option, $value ) { * * @see get_option() * - * @global wpdb $wpdb - * @global object $current_site + * @global wpdb $wpdb * * @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 retrieve. Expected to not be SQL-escaped. @@ -1071,7 +1082,7 @@ function update_site_option( $option, $value ) { * @return mixed Value set for the option. */ function get_network_option( $network_id, $option, $default = false ) { - global $wpdb, $current_site; + global $wpdb; if ( $network_id && ! is_numeric( $network_id ) ) { return false; @@ -1080,12 +1091,12 @@ function get_network_option( $network_id, $option, $default = false ) { $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; + if ( ! $network_id ) { + $network_id = get_current_network_id(); } /** - * Filter an existing network option before it is retrieved. + * Filters an existing network option before it is retrieved. * * The dynamic portion of the hook name, `$option`, refers to the option name. * @@ -1094,12 +1105,14 @@ function get_network_option( $network_id, $option, $default = false ) { * * @since 2.9.0 As 'pre_site_option_' . $key * @since 3.0.0 - * @since 4.4.0 The `$option` parameter was added + * @since 4.4.0 The `$option` parameter was added. + * @since 4.7.0 The `$network_id` parameter was added. * * @param mixed $pre_option The default value to return if the option does not exist. * @param string $option Option name. + * @param int $network_id ID of the network. */ - $pre = apply_filters( 'pre_site_option_' . $option, false, $option ); + $pre = apply_filters( "pre_site_option_{$option}", false, $option, $network_id ); if ( false !== $pre ) { return $pre; @@ -1112,23 +1125,25 @@ function get_network_option( $network_id, $option, $default = false ) { if ( isset( $notoptions[ $option ] ) ) { /** - * Filter a specific default network option. + * Filters a specific default network option. * * The dynamic portion of the hook name, `$option`, refers to the option name. * * @since 3.4.0 * @since 4.4.0 The `$option` parameter was added. + * @since 4.7.0 The `$network_id` parameter was added. * - * @param mixed $default The value to return if the site option does not exist - * in the database. - * @param string $option Option name. + * @param mixed $default The value to return if the site option does not exist + * in the database. + * @param string $option Option name. + * @param int $network_id ID of the network. */ - return apply_filters( 'default_site_option_' . $option, $default, $option ); + return apply_filters( "default_site_option_{$option}", $default, $option, $network_id ); } if ( ! is_multisite() ) { /** This filter is documented in wp-includes/option.php */ - $default = apply_filters( 'default_site_option_' . $option, $default, $option ); + $default = apply_filters( 'default_site_option_' . $option, $default, $option, $network_id ); $value = get_option( $option, $default ); } else { $cache_key = "$network_id:$option"; @@ -1150,24 +1165,26 @@ function get_network_option( $network_id, $option, $default = false ) { wp_cache_set( $notoptions_key, $notoptions, 'site-options' ); /** This filter is documented in wp-includes/option.php */ - $value = apply_filters( 'default_site_option_' . $option, $default, $option ); + $value = apply_filters( 'default_site_option_' . $option, $default, $option, $network_id ); } } } /** - * Filter the value of an existing network option. + * Filters the value of an existing network option. * * The dynamic portion of the hook name, `$option`, refers to the option name. * * @since 2.9.0 As 'site_option_' . $key * @since 3.0.0 - * @since 4.4.0 The `$option` parameter was added + * @since 4.4.0 The `$option` parameter was added. + * @since 4.7.0 The `$network_id` parameter was added. * - * @param mixed $value Value of network option. - * @param string $option Option name. + * @param mixed $value Value of network option. + * @param string $option Option name. + * @param int $network_id ID of the network. */ - return apply_filters( 'site_option_' . $option, $value, $option ); + return apply_filters( "site_option_{$option}", $value, $option, $network_id ); } /** @@ -1179,8 +1196,7 @@ function get_network_option( $network_id, $option, $default = false ) { * * @see add_option() * - * @global wpdb $wpdb - * @global object $current_site + * @global wpdb $wpdb * * @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. @@ -1188,7 +1204,7 @@ function get_network_option( $network_id, $option, $default = false ) { * @return bool False if option was not added and true if option was added. */ function add_network_option( $network_id, $option, $value ) { - global $wpdb, $current_site; + global $wpdb; if ( $network_id && ! is_numeric( $network_id ) ) { return false; @@ -1197,30 +1213,32 @@ function add_network_option( $network_id, $option, $value ) { $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; + if ( ! $network_id ) { + $network_id = get_current_network_id(); } wp_protect_special_option( $option ); /** - * Filter the value of a specific network option before it is added. + * Filters the value of a specific network option before it is added. * * The dynamic portion of the hook name, `$option`, refers to the option name. * * @since 2.9.0 As 'pre_add_site_option_' . $key * @since 3.0.0 - * @since 4.4.0 The `$option` parameter was added + * @since 4.4.0 The `$option` parameter was added. + * @since 4.7.0 The `$network_id` parameter was added. * - * @param mixed $value Value of network option. - * @param string $option Option name. + * @param mixed $value Value of network option. + * @param string $option Option name. + * @param int $network_id ID of the network. */ - $value = apply_filters( 'pre_add_site_option_' . $option, $value, $option ); + $value = apply_filters( "pre_add_site_option_{$option}", $value, $option, $network_id ); $notoptions_key = "$network_id:notoptions"; if ( ! is_multisite() ) { - $result = add_option( $option, $value ); + $result = add_option( $option, $value, '', 'no' ); } else { $cache_key = "$network_id:$option"; @@ -1260,21 +1278,25 @@ function add_network_option( $network_id, $option, $value ) { * * @since 2.9.0 As "add_site_option_{$key}" * @since 3.0.0 + * @since 4.7.0 The `$network_id` parameter was added. * - * @param string $option Name of the network option. - * @param mixed $value Value of the network option. + * @param string $option Name of the network option. + * @param mixed $value Value of the network option. + * @param int $network_id ID of the network. */ - do_action( 'add_site_option_' . $option, $option, $value ); + do_action( "add_site_option_{$option}", $option, $value, $network_id ); /** * Fires after a network option has been successfully added. * * @since 3.0.0 + * @since 4.7.0 The `$network_id` parameter was added. * - * @param string $option Name of the network option. - * @param mixed $value Value of the network option. + * @param string $option Name of the network option. + * @param mixed $value Value of the network option. + * @param int $network_id ID of the network. */ - do_action( 'add_site_option', $option, $value ); + do_action( 'add_site_option', $option, $value, $network_id ); return true; } @@ -1289,15 +1311,14 @@ function add_network_option( $network_id, $option, $value ) { * * @see delete_option() * - * @global wpdb $wpdb - * @global object $current_site + * @global wpdb $wpdb * * @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. * @return bool True, if succeed. False, if failure. */ function delete_network_option( $network_id, $option ) { - global $wpdb, $current_site; + global $wpdb; if ( $network_id && ! is_numeric( $network_id ) ) { return false; @@ -1306,8 +1327,8 @@ function delete_network_option( $network_id, $option ) { $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; + if ( ! $network_id ) { + $network_id = get_current_network_id(); } /** @@ -1316,11 +1337,13 @@ function delete_network_option( $network_id, $option ) { * The dynamic portion of the hook name, `$option`, refers to the option name. * * @since 3.0.0 - * @since 4.4.0 The `$option` parameter was added + * @since 4.4.0 The `$option` parameter was added. + * @since 4.7.0 The `$network_id` parameter was added. * - * @param string $option Option name. + * @param string $option Option name. + * @param int $network_id ID of the network. */ - do_action( 'pre_delete_site_option_' . $option, $option ); + do_action( "pre_delete_site_option_{$option}", $option, $network_id ); if ( ! is_multisite() ) { $result = delete_option( $option ); @@ -1344,19 +1367,23 @@ function delete_network_option( $network_id, $option ) { * * @since 2.9.0 As "delete_site_option_{$key}" * @since 3.0.0 + * @since 4.7.0 The `$network_id` parameter was added. * - * @param string $option Name of the network option. + * @param string $option Name of the network option. + * @param int $network_id ID of the network. */ - do_action( 'delete_site_option_' . $option, $option ); + do_action( "delete_site_option_{$option}", $option, $network_id ); /** * Fires after a network option has been deleted. * * @since 3.0.0 + * @since 4.7.0 The `$network_id` parameter was added. * - * @param string $option Name of the network option. + * @param string $option Name of the network option. + * @param int $network_id ID of the network. */ - do_action( 'delete_site_option', $option ); + do_action( 'delete_site_option', $option, $network_id ); return true; } @@ -1371,8 +1398,7 @@ function delete_network_option( $network_id, $option ) { * * @see update_option() * - * @global wpdb $wpdb - * @global object $current_site + * @global wpdb $wpdb * * @param int $network_id ID of the network. Can be null to default to the current network ID. * @param string $option Name of option. Expected to not be SQL-escaped. @@ -1380,7 +1406,7 @@ function delete_network_option( $network_id, $option ) { * @return bool False if value was not updated and true if value was updated. */ function update_network_option( $network_id, $option, $value ) { - global $wpdb, $current_site; + global $wpdb; if ( $network_id && ! is_numeric( $network_id ) ) { return false; @@ -1389,8 +1415,8 @@ function update_network_option( $network_id, $option, $value ) { $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; + if ( ! $network_id ) { + $network_id = get_current_network_id(); } wp_protect_special_option( $option ); @@ -1398,19 +1424,21 @@ function update_network_option( $network_id, $option, $value ) { $old_value = get_network_option( $network_id, $option, false ); /** - * Filter a specific network option before its value is updated. + * Filters a specific network option before its value is updated. * * The dynamic portion of the hook name, `$option`, refers to the option name. * * @since 2.9.0 As 'pre_update_site_option_' . $key * @since 3.0.0 - * @since 4.4.0 The `$option` parameter was added + * @since 4.4.0 The `$option` parameter was added. + * @since 4.7.0 The `$network_id` parameter was added. * - * @param mixed $value New value of the network option. - * @param mixed $old_value Old value of the network option. - * @param string $option Option name. + * @param mixed $value New value of the network option. + * @param mixed $old_value Old value of the network option. + * @param string $option Option name. + * @param int $network_id ID of the network. */ - $value = apply_filters( 'pre_update_site_option_' . $option, $value, $old_value, $option ); + $value = apply_filters( "pre_update_site_option_{$option}", $value, $old_value, $option, $network_id ); if ( $value === $old_value ) { return false; @@ -1428,7 +1456,7 @@ function update_network_option( $network_id, $option, $value ) { } if ( ! is_multisite() ) { - $result = update_option( $option, $value ); + $result = update_option( $option, $value, 'no' ); } else { $value = sanitize_option( $option, $value ); @@ -1450,23 +1478,27 @@ function update_network_option( $network_id, $option, $value ) { * * @since 2.9.0 As "update_site_option_{$key}" * @since 3.0.0 + * @since 4.7.0 The `$network_id` parameter was added. * - * @param string $option Name of the network option. - * @param mixed $value Current value of the network option. - * @param mixed $old_value Old value of the network option. + * @param string $option Name of the network option. + * @param mixed $value Current value of the network option. + * @param mixed $old_value Old value of the network option. + * @param int $network_id ID of the network. */ - do_action( 'update_site_option_' . $option, $option, $value, $old_value ); + do_action( "update_site_option_{$option}", $option, $value, $old_value, $network_id ); /** * Fires after the value of a network option has been successfully updated. * * @since 3.0.0 + * @since 4.7.0 The `$network_id` parameter was added. * - * @param string $option Name of the network option. - * @param mixed $value Current value of the network option. - * @param mixed $old_value Old value of the network option. + * @param string $option Name of the network option. + * @param mixed $value Current value of the network option. + * @param mixed $old_value Old value of the network option. + * @param int $network_id ID of the network. */ - do_action( 'update_site_option', $option, $value, $old_value ); + do_action( 'update_site_option', $option, $value, $old_value, $network_id ); return true; } @@ -1493,7 +1525,7 @@ function delete_site_transient( $transient ) { * * @param string $transient Transient name. */ - do_action( 'delete_site_transient_' . $transient, $transient ); + do_action( "delete_site_transient_{$transient}", $transient ); if ( wp_using_ext_object_cache() ) { $result = wp_cache_delete( $transient, 'site-transient' ); @@ -1535,7 +1567,7 @@ function delete_site_transient( $transient ) { function get_site_transient( $transient ) { /** - * Filter the value of an existing site transient. + * Filters the value of an existing site transient. * * The dynamic portion of the hook name, `$transient`, refers to the transient name. * @@ -1550,7 +1582,7 @@ function get_site_transient( $transient ) { * of the transient, and return the returned value. * @param string $transient Transient name. */ - $pre = apply_filters( 'pre_site_transient_' . $transient, false, $transient ); + $pre = apply_filters( "pre_site_transient_{$transient}", false, $transient ); if ( false !== $pre ) return $pre; @@ -1576,7 +1608,7 @@ function get_site_transient( $transient ) { } /** - * Filter the value of an existing site transient. + * Filters the value of an existing site transient. * * The dynamic portion of the hook name, `$transient`, refers to the transient name. * @@ -1586,7 +1618,7 @@ function get_site_transient( $transient ) { * @param mixed $value Value of site transient. * @param string $transient Transient name. */ - return apply_filters( 'site_transient_' . $transient, $value, $transient ); + return apply_filters( "site_transient_{$transient}", $value, $transient ); } /** @@ -1608,7 +1640,7 @@ function get_site_transient( $transient ) { function set_site_transient( $transient, $value, $expiration = 0 ) { /** - * Filter the value of a specific site transient before it is set. + * Filters the value of a specific site transient before it is set. * * The dynamic portion of the hook name, `$transient`, refers to the transient name. * @@ -1618,12 +1650,12 @@ function set_site_transient( $transient, $value, $expiration = 0 ) { * @param mixed $value New value of site transient. * @param string $transient Transient name. */ - $value = apply_filters( 'pre_set_site_transient_' . $transient, $value, $transient ); + $value = apply_filters( "pre_set_site_transient_{$transient}", $value, $transient ); $expiration = (int) $expiration; /** - * Filter the expiration for a site transient before its value is set. + * Filters the expiration for a site transient before its value is set. * * The dynamic portion of the hook name, `$transient`, refers to the transient name. * @@ -1633,7 +1665,7 @@ function set_site_transient( $transient, $value, $expiration = 0 ) { * @param mixed $value New value of site transient. * @param string $transient Transient name. */ - $expiration = apply_filters( 'expiration_of_site_transient_' . $transient, $expiration, $value, $transient ); + $expiration = apply_filters( "expiration_of_site_transient_{$transient}", $expiration, $value, $transient ); if ( wp_using_ext_object_cache() ) { $result = wp_cache_set( $transient, $value, 'site-transient', $expiration ); @@ -1664,7 +1696,7 @@ function set_site_transient( $transient, $value, $expiration = 0 ) { * @param int $expiration Time until expiration in seconds. * @param string $transient Transient name. */ - do_action( 'set_site_transient_' . $transient, $value, $expiration, $transient ); + do_action( "set_site_transient_{$transient}", $value, $expiration, $transient ); /** * Fires after the value for a site transient has been set. @@ -1679,3 +1711,302 @@ function set_site_transient( $transient, $value, $expiration = 0 ) { } return $result; } + +/** + * Register default settings available in WordPress. + * + * The settings registered here are primarily useful for the REST API, so this + * does not encompass all settings available in WordPress. + * + * @since 4.7.0 + */ +function register_initial_settings() { + register_setting( 'general', 'blogname', array( + 'show_in_rest' => array( + 'name' => 'title', + ), + 'type' => 'string', + 'description' => __( 'Site title.' ), + ) ); + + register_setting( 'general', 'blogdescription', array( + 'show_in_rest' => array( + 'name' => 'description', + ), + 'type' => 'string', + 'description' => __( 'Site tagline.' ), + ) ); + + if ( ! is_multisite() ) { + register_setting( 'general', 'siteurl', array( + 'show_in_rest' => array( + 'name' => 'url', + 'schema' => array( + 'format' => 'uri', + ), + ), + 'type' => 'string', + 'description' => __( 'Site URL.' ), + ) ); + } + + if ( ! is_multisite() ) { + register_setting( 'general', 'admin_email', array( + 'show_in_rest' => array( + 'name' => 'email', + 'schema' => array( + 'format' => 'email', + ), + ), + 'type' => 'string', + 'description' => __( 'This address is used for admin purposes, like new user notification.' ), + ) ); + } + + register_setting( 'general', 'timezone_string', array( + 'show_in_rest' => array( + 'name' => 'timezone', + ), + 'type' => 'string', + 'description' => __( 'A city in the same timezone as you.' ), + ) ); + + register_setting( 'general', 'date_format', array( + 'show_in_rest' => true, + 'type' => 'string', + 'description' => __( 'A date format for all date strings.' ), + ) ); + + register_setting( 'general', 'time_format', array( + 'show_in_rest' => true, + 'type' => 'string', + 'description' => __( 'A time format for all time strings.' ), + ) ); + + register_setting( 'general', 'start_of_week', array( + 'show_in_rest' => true, + 'type' => 'integer', + 'description' => __( 'A day number of the week that the week should start on.' ), + ) ); + + register_setting( 'general', 'WPLANG', array( + 'show_in_rest' => array( + 'name' => 'language', + ), + 'type' => 'string', + 'description' => __( 'WordPress locale code.' ), + 'default' => 'en_US', + ) ); + + register_setting( 'writing', 'use_smilies', array( + 'show_in_rest' => true, + 'type' => 'boolean', + 'description' => __( 'Convert emoticons like :-) and :-P to graphics on display.' ), + 'default' => true, + ) ); + + register_setting( 'writing', 'default_category', array( + 'show_in_rest' => true, + 'type' => 'integer', + 'description' => __( 'Default post category.' ), + ) ); + + register_setting( 'writing', 'default_post_format', array( + 'show_in_rest' => true, + 'type' => 'string', + 'description' => __( 'Default post format.' ), + ) ); + + register_setting( 'reading', 'posts_per_page', array( + 'show_in_rest' => true, + 'type' => 'integer', + 'description' => __( 'Blog pages show at most.' ), + 'default' => 10, + ) ); + + register_setting( 'discussion', 'default_ping_status', array( + 'show_in_rest' => array( + 'schema' => array( + 'enum' => array( 'open', 'closed' ), + ), + ), + 'type' => 'string', + 'description' => __( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new articles.' ), + ) ); + + register_setting( 'discussion', 'default_comment_status', array( + 'show_in_rest' => array( + 'schema' => array( + 'enum' => array( 'open', 'closed' ), + ), + ), + 'type' => 'string', + 'description' => __( 'Allow people to post comments on new articles.' ), + ) ); + +} + +/** + * Register a setting and its data. + * + * @since 2.7.0 + * @since 4.7.0 `$args` can be passed to set flags on the setting, similar to `register_meta()`. + * + * @global array $new_whitelist_options + * @global array $wp_registered_settings + * + * @param string $option_group A settings group name. Should correspond to a whitelisted option key name. + * Default whitelisted option key names include "general," "discussion," and "reading," among others. + * @param string $option_name The name of an option to sanitize and save. + * @param array $args { + * Data used to describe the setting when registered. + * + * @type string $type The type of data associated with this setting. + * @type string $description A description of the data attached to this setting. + * @type callable $sanitize_callback A callback function that sanitizes the option's value. + * @type bool $show_in_rest Whether data associated with this setting should be included in the REST API. + * @type mixed $default Default value when calling `get_option()`. + * } + */ +function register_setting( $option_group, $option_name, $args = array() ) { + global $new_whitelist_options, $wp_registered_settings; + + $defaults = array( + 'type' => 'string', + 'group' => $option_group, + 'description' => '', + 'sanitize_callback' => null, + 'show_in_rest' => false, + ); + + // Back-compat: old sanitize callback is added. + if ( is_callable( $args ) ) { + $args = array( + 'sanitize_callback' => $args, + ); + } + + /** + * Filters the registration arguments when registering a setting. + * + * @since 4.7.0 + * + * @param array $args Array of setting registration arguments. + * @param array $defaults Array of default arguments. + * @param string $option_group Setting group. + * @param string $option_name Setting name. + */ + $args = apply_filters( 'register_setting_args', $args, $defaults, $option_group, $option_name ); + $args = wp_parse_args( $args, $defaults ); + + if ( ! is_array( $wp_registered_settings ) ) { + $wp_registered_settings = array(); + } + + if ( 'misc' == $option_group ) { + _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'misc' ) ); + $option_group = 'general'; + } + + if ( 'privacy' == $option_group ) { + _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'privacy' ) ); + $option_group = 'reading'; + } + + $new_whitelist_options[ $option_group ][] = $option_name; + if ( ! empty( $args['sanitize_callback'] ) ) { + add_filter( "sanitize_option_{$option_name}", $args['sanitize_callback'] ); + } + if ( array_key_exists( 'default', $args ) ) { + add_filter( "default_option_{$option_name}", 'filter_default_option', 10, 3 ); + } + + $wp_registered_settings[ $option_name ] = $args; +} + +/** + * Unregister a setting. + * + * @since 2.7.0 + * @since 4.7.0 `$sanitize_callback` was deprecated. The callback from `register_setting()` is now used instead. + * + * @global array $new_whitelist_options + * + * @param string $option_group The settings group name used during registration. + * @param string $option_name The name of the option to unregister. + * @param callable $deprecated Deprecated. + */ +function unregister_setting( $option_group, $option_name, $deprecated = '' ) { + global $new_whitelist_options, $wp_registered_settings; + + if ( 'misc' == $option_group ) { + _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'misc' ) ); + $option_group = 'general'; + } + + if ( 'privacy' == $option_group ) { + _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'privacy' ) ); + $option_group = 'reading'; + } + + $pos = array_search( $option_name, (array) $new_whitelist_options[ $option_group ] ); + if ( $pos !== false ) { + unset( $new_whitelist_options[ $option_group ][ $pos ] ); + } + if ( '' !== $deprecated ) { + _deprecated_argument( __FUNCTION__, '4.7.0', __( '$sanitize_callback is deprecated. The callback from register_setting() is used instead.' ) ); + remove_filter( "sanitize_option_{$option_name}", $deprecated ); + } + + if ( isset( $wp_registered_settings[ $option_name ] ) ) { + // Remove the sanitize callback if one was set during registration. + if ( ! empty( $wp_registered_settings[ $option_name ]['sanitize_callback'] ) ) { + remove_filter( "sanitize_option_{$option_name}", $wp_registered_settings[ $option_name ]['sanitize_callback'] ); + } + + unset( $wp_registered_settings[ $option_name ] ); + } +} + +/** + * Retrieves an array of registered settings. + * + * @since 4.7.0 + * + * @return array List of registered settings, keyed by option name. + */ +function get_registered_settings() { + global $wp_registered_settings; + + if ( ! is_array( $wp_registered_settings ) ) { + return array(); + } + + return $wp_registered_settings; +} + +/** + * Filter the default value for the option. + * + * For settings which register a default setting in `register_setting()`, this + * function is added as a filter to `default_option_{$option}`. + * + * @since 4.7.0 + * + * @param mixed $default Existing default value to return. + * @param string $option Option name. + * @param bool $passed_default Was `get_option()` passed a default value? + * @return mixed Filtered default value. + */ +function filter_default_option( $default, $option, $passed_default ) { + if ( $passed_default ) { + return $default; + } + + $registered = get_registered_settings(); + if ( empty( $registered[ $option ] ) ) { + return $default; + } + + return $registered[ $option ]['default']; +}