diff options
Diffstat (limited to 'wp-includes/option.php')
-rw-r--r-- | wp-includes/option.php | 397 |
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 ); +} |