summaryrefslogtreecommitdiffstats
path: root/wp-includes/option.php
diff options
context:
space:
mode:
Diffstat (limited to 'wp-includes/option.php')
-rw-r--r--wp-includes/option.php397
1 files changed, 320 insertions, 77 deletions
diff --git a/wp-includes/option.php b/wp-includes/option.php
index 36bfcf6..4dee6ce 100644
--- a/wp-includes/option.php
+++ b/wp-includes/option.php
@@ -392,16 +392,16 @@ function wp_set_option_autoload_values( array $options ) {
}
$grouped_options = array(
- 'yes' => array(),
- 'no' => array(),
+ 'on' => array(),
+ 'off' => array(),
);
$results = array();
foreach ( $options as $option => $autoload ) {
wp_protect_special_option( $option ); // Ensure only valid options can be passed.
- if ( 'no' === $autoload || false === $autoload ) { // Sanitize autoload value and categorize accordingly.
- $grouped_options['no'][] = $option;
+ if ( 'off' === $autoload || 'no' === $autoload || false === $autoload ) { // Sanitize autoload value and categorize accordingly.
+ $grouped_options['off'][] = $option;
} else {
- $grouped_options['yes'][] = $option;
+ $grouped_options['on'][] = $option;
}
$results[ $option ] = false; // Initialize result value.
}
@@ -465,19 +465,19 @@ function wp_set_option_autoload_values( array $options ) {
}
/*
- * If any options were changed to 'yes', delete their individual caches, and delete 'alloptions' cache so that it
+ * If any options were changed to 'on', delete their individual caches, and delete 'alloptions' cache so that it
* is refreshed as needed.
- * If no options were changed to 'yes' but any options were changed to 'no', delete them from the 'alloptions'
- * cache. This is not necessary when options were changed to 'yes', since in that situation the entire cache is
+ * If no options were changed to 'on' but any options were changed to 'no', delete them from the 'alloptions'
+ * cache. This is not necessary when options were changed to 'on', since in that situation the entire cache is
* deleted anyway.
*/
- if ( $grouped_options['yes'] ) {
- wp_cache_delete_multiple( $grouped_options['yes'], 'options' );
+ if ( $grouped_options['on'] ) {
+ wp_cache_delete_multiple( $grouped_options['on'], 'options' );
wp_cache_delete( 'alloptions', 'options' );
- } elseif ( $grouped_options['no'] ) {
+ } elseif ( $grouped_options['off'] ) {
$alloptions = wp_load_alloptions( true );
- foreach ( $grouped_options['no'] as $option ) {
+ foreach ( $grouped_options['off'] as $option ) {
if ( isset( $alloptions[ $option ] ) ) {
unset( $alloptions[ $option ] );
}
@@ -606,7 +606,8 @@ function wp_load_alloptions( $force_cache = false ) {
if ( ! $alloptions ) {
$suppress = $wpdb->suppress_errors();
- $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 WHERE autoload IN ( '" . implode( "', '", esc_sql( wp_autoload_values_to_autoload() ) ) . "' )" );
+
if ( ! $alloptions_db ) {
$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" );
}
@@ -642,50 +643,150 @@ function wp_load_alloptions( $force_cache = false ) {
}
/**
- * Loads and primes caches of certain often requested network options if is_multisite().
+ * Primes specific network options for the current network into the cache with a single database query.
*
- * @since 3.0.0
- * @since 6.3.0 Also prime caches for network options when persistent object cache is enabled.
+ * Only network options that do not already exist in cache will be loaded.
+ *
+ * If site is not multisite, then call wp_prime_option_caches().
+ *
+ * @since 6.6.0
+ *
+ * @see wp_prime_network_option_caches()
+ *
+ * @param string[] $options An array of option names to be loaded.
+ */
+function wp_prime_site_option_caches( array $options ) {
+ wp_prime_network_option_caches( null, $options );
+}
+
+/**
+ * Primes specific network options into the cache with a single database query.
+ *
+ * Only network options that do not already exist in cache will be loaded.
+ *
+ * If site is not multisite, then call wp_prime_option_caches().
+ *
+ * @since 6.6.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
- * @param int $network_id Optional. Network ID of network for which to prime network options cache. Defaults to current network.
+ * @param int $network_id ID of the network. Can be null to default to the current network ID.
+ * @param string[] $options An array of option names to be loaded.
*/
-function wp_load_core_site_options( $network_id = null ) {
+function wp_prime_network_option_caches( $network_id, array $options ) {
global $wpdb;
- if ( ! is_multisite() || wp_installing() ) {
+ if ( wp_installing() ) {
return;
}
- if ( empty( $network_id ) ) {
+ if ( ! is_multisite() ) {
+ wp_prime_option_caches( $options );
+ return;
+ }
+
+ if ( $network_id && ! is_numeric( $network_id ) ) {
+ return;
+ }
+
+ $network_id = (int) $network_id;
+
+ // Fallback to the current network if a network ID is not specified.
+ if ( ! $network_id ) {
$network_id = get_current_network_id();
}
- $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' );
+ $cache_keys = array();
+ foreach ( $options as $option ) {
+ $cache_keys[ $option ] = "{$network_id}:{$option}";
+ }
- if ( wp_using_ext_object_cache() ) {
- $cache_keys = array();
- foreach ( $core_options as $option ) {
- $cache_keys[] = "{$network_id}:{$option}";
+ $cache_group = 'site-options';
+ $cached_options = wp_cache_get_multiple( array_values( $cache_keys ), $cache_group );
+
+ $notoptions_key = "$network_id:notoptions";
+ $notoptions = wp_cache_get( $notoptions_key, $cache_group );
+
+ if ( ! is_array( $notoptions ) ) {
+ $notoptions = array();
+ }
+
+ // Filter options that are not in the cache.
+ $options_to_prime = array();
+ foreach ( $cache_keys as $option => $cache_key ) {
+ if (
+ ( ! isset( $cached_options[ $cache_key ] ) || false === $cached_options[ $cache_key ] )
+ && ! isset( $notoptions[ $option ] )
+ ) {
+ $options_to_prime[] = $option;
}
- wp_cache_get_multiple( $cache_keys, 'site-options' );
+ }
+ // Bail early if there are no options to be loaded.
+ if ( empty( $options_to_prime ) ) {
return;
}
- $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", $network_id ) );
+ $query_args = $options_to_prime;
+ $query_args[] = $network_id;
+ $results = $wpdb->get_results(
+ $wpdb->prepare(
+ sprintf(
+ "SELECT meta_key, meta_value FROM $wpdb->sitemeta WHERE meta_key IN (%s) AND site_id = %s",
+ implode( ',', array_fill( 0, count( $options_to_prime ), '%s' ) ),
+ '%d'
+ ),
+ $query_args
+ )
+ );
- $data = array();
- foreach ( $options as $option ) {
- $key = $option->meta_key;
- $cache_key = "{$network_id}:$key";
- $option->meta_value = maybe_unserialize( $option->meta_value );
+ $data = array();
+ $options_found = array();
+ foreach ( $results as $result ) {
+ $key = $result->meta_key;
+ $cache_key = $cache_keys[ $key ];
+ $data[ $cache_key ] = maybe_unserialize( $result->meta_value );
+ $options_found[] = $key;
+ }
+ wp_cache_set_multiple( $data, $cache_group );
+ // If all options were found, no need to update `notoptions` cache.
+ if ( count( $options_found ) === count( $options_to_prime ) ) {
+ return;
+ }
+
+ $options_not_found = array_diff( $options_to_prime, $options_found );
- $data[ $cache_key ] = $option->meta_value;
+ // Add the options that were not found to the cache.
+ $update_notoptions = false;
+ foreach ( $options_not_found as $option_name ) {
+ if ( ! isset( $notoptions[ $option_name ] ) ) {
+ $notoptions[ $option_name ] = true;
+ $update_notoptions = true;
+ }
+ }
+
+ // Only update the cache if it was modified.
+ if ( $update_notoptions ) {
+ wp_cache_set( $notoptions_key, $notoptions, $cache_group );
}
- wp_cache_set_multiple( $data, 'site-options' );
+}
+
+/**
+ * Loads and primes caches of certain often requested network options if is_multisite().
+ *
+ * @since 3.0.0
+ * @since 6.3.0 Also prime caches for network options when persistent object cache is enabled.
+ * @since 6.6.0 Uses wp_prime_network_option_caches().
+ *
+ * @param int $network_id Optional. Network ID of network for which to prime network options cache. Defaults to current network.
+ */
+function wp_load_core_site_options( $network_id = null ) {
+ if ( ! is_multisite() || wp_installing() ) {
+ return;
+ }
+ $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', 'WPLANG' );
+
+ wp_prime_network_option_caches( $network_id, $core_options );
}
/**
@@ -705,17 +806,21 @@ function wp_load_core_site_options( $network_id = null ) {
*
* @global wpdb $wpdb WordPress database abstraction object.
*
- * @param string $option Name of the option to update. Expected to not be SQL-escaped.
- * @param mixed $value Option value. Must be serializable if non-scalar. Expected to not be SQL-escaped.
- * @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.
- * Accepts 'yes'|true to enable or 'no'|false to disable.
- * Autoloading too many options can lead to performance problems, especially if the
- * options are not frequently used. For options which are accessed across several places
- * in the frontend, it is recommended to autoload them, by using 'yes'|true.
- * For options which are accessed only on few specific URLs, it is recommended
- * to not autoload them, by using 'no'|false. For non-existent options, the default value
- * is 'yes'. Default null.
+ * @param string $option Name of the option to update. Expected to not be SQL-escaped.
+ * @param mixed $value Option value. Must be serializable if non-scalar. Expected to not be SQL-escaped.
+ * @param bool|null $autoload Optional. Whether to load the option when WordPress starts up.
+ * Accepts a boolean, or `null` to stick with the initial value or, if no initial value is set,
+ * to leave the decision up to default heuristics in WordPress.
+ * For existing options,
+ * `$autoload` can only be updated using `update_option()` if `$value` is also changed.
+ * For backward compatibility 'yes' and 'no' are also accepted.
+ * Autoloading too many options can lead to performance problems, especially if the
+ * options are not frequently used. For options which are accessed across several places
+ * in the frontend, it is recommended to autoload them, by using true.
+ * For options which are accessed only on few specific URLs, it is recommended
+ * to not autoload them, by using false.
+ * For non-existent options, the default is null, which means WordPress will determine
+ * the autoload value.
* @return bool True if the value was updated, false otherwise.
*/
function update_option( $option, $value, $autoload = null ) {
@@ -801,11 +906,6 @@ function update_option( $option, $value, $autoload = null ) {
/** This filter is documented in wp-includes/option.php */
if ( apply_filters( "default_option_{$option}", false, $option, false ) === $old_value ) {
- // Default setting for new options is 'yes'.
- if ( null === $autoload ) {
- $autoload = 'yes';
- }
-
return add_option( $option, $value, '', $autoload );
}
@@ -827,7 +927,17 @@ function update_option( $option, $value, $autoload = null ) {
);
if ( null !== $autoload ) {
- $update_args['autoload'] = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes';
+ $update_args['autoload'] = wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload );
+ } else {
+ // Retrieve the current autoload value to reevaluate it in case it was set automatically.
+ $raw_autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );
+ $allow_values = array( 'auto-on', 'auto-off', 'auto' );
+ if ( in_array( $raw_autoload, $allow_values, true ) ) {
+ $autoload = wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload );
+ if ( $autoload !== $raw_autoload ) {
+ $update_args['autoload'] = $autoload;
+ }
+ }
}
$result = $wpdb->update( $wpdb->options, $update_args, array( 'option_name' => $option ) );
@@ -853,7 +963,7 @@ function update_option( $option, $value, $autoload = null ) {
} else {
wp_cache_set( $option, $serialized_value, 'options' );
}
- } elseif ( 'yes' === $update_args['autoload'] ) {
+ } elseif ( in_array( $update_args['autoload'], wp_autoload_values_to_autoload(), true ) ) {
// Delete the individual cache, then set in alloptions cache.
wp_cache_delete( $option, 'options' );
@@ -915,23 +1025,26 @@ function update_option( $option, $value, $autoload = null ) {
* options the same as the ones which are protected.
*
* @since 1.0.0
+ * @since 6.6.0 The $autoload parameter's default value was changed to null.
*
* @global wpdb $wpdb WordPress database abstraction object.
*
- * @param string $option Name of the 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.
- * @param string|bool $autoload Optional. Whether to load the option when WordPress starts up.
- * Accepts 'yes'|true to enable or 'no'|false to disable.
- * Autoloading too many options can lead to performance problems, especially if the
- * options are not frequently used. For options which are accessed across several places
- * in the frontend, it is recommended to autoload them, by using 'yes'|true.
- * For options which are accessed only on few specific URLs, it is recommended
- * to not autoload them, by using 'no'|false. Default 'yes'.
+ * @param string $option Name of the 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.
+ * @param bool|null $autoload Optional. Whether to load the option when WordPress starts up.
+ * Accepts a boolean, or `null` to leave the decision up to default heuristics in WordPress.
+ * For backward compatibility 'yes' and 'no' are also accepted.
+ * Autoloading too many options can lead to performance problems, especially if the
+ * options are not frequently used. For options which are accessed across several places
+ * in the frontend, it is recommended to autoload them, by using 'yes'|true.
+ * For options which are accessed only on few specific URLs, it is recommended
+ * to not autoload them, by using false.
+ * Default is null, which means WordPress will determine the autoload value.
* @return bool True if the option was added, false otherwise.
*/
-function add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' ) {
+function add_option( $option, $value = '', $deprecated = '', $autoload = null ) {
global $wpdb;
if ( ! empty( $deprecated ) ) {
@@ -991,7 +1104,8 @@ function add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' )
}
$serialized_value = maybe_serialize( $value );
- $autoload = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes';
+
+ $autoload = wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload );
/**
* Fires before an option is added.
@@ -1009,7 +1123,7 @@ function add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' )
}
if ( ! wp_installing() ) {
- if ( 'yes' === $autoload ) {
+ if ( in_array( $autoload, wp_autoload_values_to_autoload(), true ) ) {
$alloptions = wp_load_alloptions( true );
$alloptions[ $option ] = $serialized_value;
wp_cache_set( 'alloptions', $alloptions, 'options' );
@@ -1093,7 +1207,7 @@ function delete_option( $option ) {
$result = $wpdb->delete( $wpdb->options, array( 'option_name' => $option ) );
if ( ! wp_installing() ) {
- if ( 'yes' === $row->autoload ) {
+ if ( in_array( $row->autoload, wp_autoload_values_to_autoload(), true ) ) {
$alloptions = wp_load_alloptions( true );
if ( is_array( $alloptions ) && isset( $alloptions[ $option ] ) ) {
@@ -1134,6 +1248,96 @@ function delete_option( $option ) {
}
/**
+ * Determines the appropriate autoload value for an option based on input.
+ *
+ * This function checks the provided autoload value and returns a standardized value
+ * ('on', 'off', 'auto-on', 'auto-off', or 'auto') based on specific conditions.
+ *
+ * If no explicit autoload value is provided, the function will check for certain heuristics around the given option.
+ * It will return `auto-on` to indicate autoloading, `auto-off` to indicate not autoloading, or `auto` if no clear
+ * decision could be made.
+ *
+ * @since 6.6.0
+ * @access private
+ *
+ * @param string $option The name of the option.
+ * @param mixed $value The value of the option to check its autoload value.
+ * @param mixed $serialized_value The serialized value of the option to check its autoload value.
+ * @param bool|null $autoload The autoload value to check.
+ * Accepts 'on'|true to enable or 'off'|false to disable, or
+ * 'auto-on', 'auto-off', or 'auto' for internal purposes.
+ * Any other autoload value will be forced to either 'auto-on',
+ * 'auto-off', or 'auto'.
+ * 'yes' and 'no' are supported for backward compatibility.
+ * @return string Returns the original $autoload value if explicit, or 'auto-on', 'auto-off',
+ * or 'auto' depending on default heuristics.
+ */
+function wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload ) {
+
+ // Check if autoload is a boolean.
+ if ( is_bool( $autoload ) ) {
+ return $autoload ? 'on' : 'off';
+ }
+
+ switch ( $autoload ) {
+ case 'on':
+ case 'yes':
+ return 'on';
+ case 'off':
+ case 'no':
+ return 'off';
+ }
+
+ /**
+ * Allows to determine the default autoload value for an option where no explicit value is passed.
+ *
+ * @since 6.6.0
+ *
+ * @param bool|null $autoload The default autoload value to set. Returning true will be set as 'auto-on' in the
+ * database, false will be set as 'auto-off', and null will be set as 'auto'.
+ * @param string $option The passed option name.
+ * @param mixed $value The passed option value to be saved.
+ */
+ $autoload = apply_filters( 'wp_default_autoload_value', null, $option, $value, $serialized_value );
+ if ( is_bool( $autoload ) ) {
+ return $autoload ? 'auto-on' : 'auto-off';
+ }
+
+ return 'auto';
+}
+
+/**
+ * Filters the default autoload value to disable autoloading if the option value is too large.
+ *
+ * @since 6.6.0
+ * @access private
+ *
+ * @param bool|null $autoload The default autoload value to set.
+ * @param string $option The passed option name.
+ * @param mixed $value The passed option value to be saved.
+ * @param mixed $serialized_value The passed option value to be saved, in serialized form.
+ * @return bool|null Potentially modified $default.
+ */
+function wp_filter_default_autoload_value_via_option_size( $autoload, $option, $value, $serialized_value ) {
+ /**
+ * Filters the maximum size of option value in bytes.
+ *
+ * @since 6.6.0
+ *
+ * @param int $max_option_size The option-size threshold, in bytes. Default 150000.
+ * @param string $option The name of the option.
+ */
+ $max_option_size = (int) apply_filters( 'wp_max_autoloaded_option_size', 150000, $option );
+ $size = ! empty( $serialized_value ) ? strlen( $serialized_value ) : 0;
+
+ if ( $size > $max_option_size ) {
+ return false;
+ }
+
+ return $autoload;
+}
+
+/**
* Deletes a transient.
*
* @since 2.8.0
@@ -1226,7 +1430,8 @@ function get_transient( $transient ) {
if ( ! isset( $alloptions[ $transient_option ] ) ) {
$transient_timeout = '_transient_timeout_' . $transient;
- $timeout = get_option( $transient_timeout );
+ wp_prime_option_caches( array( $transient_option, $transient_timeout ) );
+ $timeout = get_option( $transient_timeout );
if ( false !== $timeout && $timeout < time() ) {
delete_option( $transient_option );
delete_option( $transient_timeout );
@@ -1306,12 +1511,13 @@ function set_transient( $transient, $value, $expiration = 0 ) {
} else {
$transient_timeout = '_transient_timeout_' . $transient;
$transient_option = '_transient_' . $transient;
+ wp_prime_option_caches( array( $transient_option, $transient_timeout ) );
if ( false === get_option( $transient_option ) ) {
- $autoload = 'yes';
+ $autoload = true;
if ( $expiration ) {
- $autoload = 'no';
- add_option( $transient_timeout, time() + $expiration, '', 'no' );
+ $autoload = false;
+ add_option( $transient_timeout, time() + $expiration, '', false );
}
$result = add_option( $transient_option, $value, '', $autoload );
} else {
@@ -1324,8 +1530,8 @@ function set_transient( $transient, $value, $expiration = 0 ) {
if ( $expiration ) {
if ( false === get_option( $transient_timeout ) ) {
delete_option( $transient_option );
- add_option( $transient_timeout, time() + $expiration, '', 'no' );
- $result = add_option( $transient_option, $value, '', 'no' );
+ add_option( $transient_timeout, time() + $expiration, '', false );
+ $result = add_option( $transient_option, $value, '', false );
$update = false;
} else {
update_option( $transient_timeout, time() + $expiration );
@@ -1913,7 +2119,7 @@ function add_network_option( $network_id, $option, $value ) {
$notoptions_key = "$network_id:notoptions";
if ( ! is_multisite() ) {
- $result = add_option( $option, $value, '', 'no' );
+ $result = add_option( $option, $value, '', false );
} else {
$cache_key = "$network_id:$option";
@@ -2159,7 +2365,7 @@ function update_network_option( $network_id, $option, $value ) {
}
if ( ! is_multisite() ) {
- $result = update_option( $option, $value, 'no' );
+ $result = update_option( $option, $value, false );
} else {
$value = sanitize_option( $option, $value );
@@ -2309,7 +2515,9 @@ function get_site_transient( $transient ) {
$transient_option = '_site_transient_' . $transient;
if ( ! in_array( $transient, $no_timeout, true ) ) {
$transient_timeout = '_site_transient_timeout_' . $transient;
- $timeout = get_site_option( $transient_timeout );
+ wp_prime_site_option_caches( array( $transient_option, $transient_timeout ) );
+
+ $timeout = get_site_option( $transient_timeout );
if ( false !== $timeout && $timeout < time() ) {
delete_site_option( $transient_option );
delete_site_option( $transient_timeout );
@@ -2387,6 +2595,7 @@ function set_site_transient( $transient, $value, $expiration = 0 ) {
} else {
$transient_timeout = '_site_transient_timeout_' . $transient;
$option = '_site_transient_' . $transient;
+ wp_prime_site_option_caches( array( $option, $transient_timeout ) );
if ( false === get_site_option( $option ) ) {
if ( $expiration ) {
@@ -2450,6 +2659,7 @@ function register_initial_settings() {
'name' => 'title',
),
'type' => 'string',
+ 'label' => __( 'Title' ),
'description' => __( 'Site title.' ),
)
);
@@ -2462,6 +2672,7 @@ function register_initial_settings() {
'name' => 'description',
),
'type' => 'string',
+ 'label' => __( 'Tagline' ),
'description' => __( 'Site tagline.' ),
)
);
@@ -2592,6 +2803,7 @@ function register_initial_settings() {
array(
'show_in_rest' => true,
'type' => 'integer',
+ 'label' => __( 'Maximum posts per page' ),
'description' => __( 'Blog pages show at most.' ),
'default' => 10,
)
@@ -2603,6 +2815,7 @@ function register_initial_settings() {
array(
'show_in_rest' => true,
'type' => 'string',
+ 'label' => __( 'Show on front' ),
'description' => __( 'What to show on the front page' ),
)
);
@@ -2613,6 +2826,7 @@ function register_initial_settings() {
array(
'show_in_rest' => true,
'type' => 'integer',
+ 'label' => __( 'Page on front' ),
'description' => __( 'The ID of the page that should be displayed on the front page' ),
)
);
@@ -2651,6 +2865,7 @@ function register_initial_settings() {
),
),
'type' => 'string',
+ 'label' => __( 'Allow comments on new posts' ),
'description' => __( 'Allow people to submit comments on new posts.' ),
)
);
@@ -2665,6 +2880,7 @@ function register_initial_settings() {
* @since 4.7.0 `$args` can be passed to set flags on the setting, similar to `register_meta()`.
* @since 5.5.0 `$new_whitelist_options` was renamed to `$new_allowed_options`.
* Please consider writing more inclusive code.
+ * @since 6.6.0 Added the `label` argument.
*
* @global array $new_allowed_options
* @global array $wp_registered_settings
@@ -2678,6 +2894,7 @@ function register_initial_settings() {
*
* @type string $type The type of data associated with this setting.
* Valid values are 'string', 'boolean', 'integer', 'number', 'array', and 'object'.
+ * @type string $label A label of the data attached to 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|array $show_in_rest Whether data associated with this setting should be included in the REST API.
@@ -2698,6 +2915,7 @@ function register_setting( $option_group, $option_name, $args = array() ) {
$defaults = array(
'type' => 'string',
'group' => $option_group,
+ 'label' => '',
'description' => '',
'sanitize_callback' => null,
'show_in_rest' => false,
@@ -2924,3 +3142,28 @@ function filter_default_option( $default_value, $option, $passed_default ) {
return $registered[ $option ]['default'];
}
+
+/**
+ * Returns the values that trigger autoloading from the options table.
+ *
+ * @since 6.6.0
+ *
+ * @return string[] The values that trigger autoloading.
+ */
+function wp_autoload_values_to_autoload() {
+ $autoload_values = array( 'yes', 'on', 'auto-on', 'auto' );
+
+ /**
+ * Filters the autoload values that should be considered for autoloading from the options table.
+ *
+ * The filter can only be used to remove autoload values from the default list.
+ *
+ * @since 6.6.0
+ *
+ * @param string[] $autoload_values Autoload values used to autoload option.
+ * Default list contains 'yes', 'on', 'auto-on', and 'auto'.
+ */
+ $filtered_values = apply_filters( 'wp_autoload_values_to_autoload', $autoload_values );
+
+ return array_intersect( $filtered_values, $autoload_values );
+}