<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[57920] trunk: Options, Meta APIs: Use more sensible default for autoloading options which allows WordPress core to make a decision.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/57920">57920</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/57920","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>flixos90</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2024-04-03 21:29:13 +0000 (Wed, 03 Apr 2024)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Options, Meta APIs: Use more sensible default for autoloading options which allows WordPress core to make a decision.

An excessive amount of autoloaded options is a common cause for slow database responses, sometimes caused by very large individual autoloaded options. As it is not mandatory to provide an autoload value when adding an option to the database, it tends to be ignored, which in combination with a default value of "yes" and lack of documentation can lead to the aforementioned problem.

This changeset enhances the option autoloading behavior in several ways:
* Update the function documentation to encourage the use of boolean `true` or `false` to explicitly provide an autoload value for an option.
* Use new string values `on` and `off` for explicitly provided values stored in the database, to distinguish them from `yes` and `no`, since `yes` does not allow determining whether it was set intentionally by the developer or only as a default.
* Effectively deprecate the values `yes` and `no`. They are still supported for backward compatibility, but now discouraged.
* Use `null` as new default autoload value for `add_option()`. If the developer does not provide an explicit value, this will now trigger WordPress logic to determine an autoload value to use:
    * If WordPress determines that the option should not be autoloaded, it is stored in the database as `auto-off`. As part of this changeset, the single heuristic introduced for that is to check whether the option size is larger than a threshold of 150k bytes. This threshold is filterable via a new `wp_max_autoloaded_option_size` filter.
    * If WordPress determines that the option should be autoloaded, it is stored in the database as `auto-on`. No logic to make such a decision is introduced as part of this changeset, but a new filter `wp_default_autoload_value` can be used to define such heuristics, e.g. by optimization plugins.
    * If WordPress cannot determine whether or not to autoload the option, it is stored in the database as `auto`.
    * This effectively means that any option without an explicit autoload value provided by the developer will be stored with an autoload value of `auto`, unless the option's size exceeds the aforementioned threshold. Options with a value of `auto` are still autoloaded as of today, most importantly for backward compatibility. A new function `wp_autoload_values_to_autoload()` returns the list of autolaod values that dictate for an option to be autoloaded, and a new filter `wp_autoload_values_to_autoload` can be used to alter that list.

These behavioral changes encourage developers to be more mindful of autoloading, while providing WordPress core and optimization plugins with additional control over heuristics for autoloading options where no explicit autoload value was provided.

At the same time, the changes are fully backward compatible from a functionality perspective, with the only exception being that very large options will now no longer be autoloaded if the developer did not explicitly request for them to be autoloaded. Neither WordPress core nor plugins are able to override an explicitly provided value, which is intentional to continue giving developers full control over their own options.

Props pbearne, flixos90, joemcgill, azaozz, spacedmonkey, swissspidy, mukesh27, markjaquith.
Fixes <a href="https://core.trac.wordpress.org/ticket/42441">#42441</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesdefaultfiltersphp">trunk/src/wp-includes/default-filters.php</a></li>
<li><a href="#trunksrcwpincludesoptionphp">trunk/src/wp-includes/option.php</a></li>
<li><a href="#trunktestsphpunittestscustomizesettingphp">trunk/tests/phpunit/tests/customize/setting.php</a></li>
<li><a href="#trunktestsphpunittestsoptionoptionphp">trunk/tests/phpunit/tests/option/option.php</a></li>
<li><a href="#trunktestsphpunittestsoptionwpLoadAlloptionsphp">trunk/tests/phpunit/tests/option/wpLoadAlloptions.php</a></li>
<li><a href="#trunktestsphpunittestsoptionwpSetOptionAutoloadphp">trunk/tests/phpunit/tests/option/wpSetOptionAutoload.php</a></li>
<li><a href="#trunktestsphpunittestsoptionwpSetOptionAutoloadValuesphp">trunk/tests/phpunit/tests/option/wpSetOptionAutoloadValues.php</a></li>
<li><a href="#trunktestsphpunittestsoptionwpSetOptionsAutoloadphp">trunk/tests/phpunit/tests/option/wpSetOptionsAutoload.php</a></li>
<li><a href="#trunktestsphpunitteststhemeautoloadThemeModsphp">trunk/tests/phpunit/tests/theme/autoloadThemeMods.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunktestsphpunittestsoptionwpAutoloadValuesToAutoloadphp">trunk/tests/phpunit/tests/option/wpAutoloadValuesToAutoload.php</a></li>
<li><a href="#trunktestsphpunittestsoptionwpDetermineOptionAutoloadValuephp">trunk/tests/phpunit/tests/option/wpDetermineOptionAutoloadValue.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpincludesdefaultfiltersphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/default-filters.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/default-filters.php 2024-04-03 15:09:38 UTC (rev 57919)
+++ trunk/src/wp-includes/default-filters.php   2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -286,6 +286,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> // Misc filters.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+add_filter( 'wp_default_autoload_value', 'wp_filter_default_autoload_value_via_option_size', 10, 4 );
</ins><span class="cx" style="display: block; padding: 0 10px"> add_filter( 'option_ping_sites', 'privacy_ping_filter' );
</span><span class="cx" style="display: block; padding: 0 10px"> add_filter( 'option_blog_charset', '_wp_specialchars' ); // IMPORTANT: This must not be wp_specialchars() or esc_html() or it'll cause an infinite loop.
</span><span class="cx" style="display: block; padding: 0 10px"> add_filter( 'option_blog_charset', '_canonical_charset' );
</span></span></pre></div>
<a id="trunksrcwpincludesoptionphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/option.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/option.php  2024-04-03 15:09:38 UTC (rev 57919)
+++ trunk/src/wp-includes/option.php    2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -392,16 +392,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $grouped_options = array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                'yes' => array(),
-               'no'  => array(),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         'on'  => array(),
+               'off' => array(),
</ins><span class="cx" style="display: block; padding: 0 10px">         );
</span><span class="cx" style="display: block; padding: 0 10px">        $results         = array();
</span><span class="cx" style="display: block; padding: 0 10px">        foreach ( $options as $option => $autoload ) {
</span><span class="cx" style="display: block; padding: 0 10px">                wp_protect_special_option( $option ); // Ensure only valid options can be passed.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( 'no' === $autoload || false === $autoload ) { // Sanitize autoload value and categorize accordingly.
-                       $grouped_options['no'][] = $option;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( 'off' === $autoload || 'no' === $autoload || false === $autoload ) { // Sanitize autoload value and categorize accordingly.
+                       $grouped_options['off'][] = $option;
</ins><span class="cx" style="display: block; padding: 0 10px">                 } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $grouped_options['yes'][] = $option;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $grouped_options['on'][] = $option;
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">                $results[ $option ] = false; // Initialize result value.
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -465,19 +465,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /*
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * If any options were changed to 'yes', delete their individual caches, and delete 'alloptions' cache so that it
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * If any options were changed to 'on', delete their individual caches, and delete 'alloptions' cache so that it
</ins><span class="cx" style="display: block; padding: 0 10px">          * is refreshed as needed.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * 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
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * 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
</ins><span class="cx" style="display: block; padding: 0 10px">          * deleted anyway.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $grouped_options['yes'] ) {
-               wp_cache_delete_multiple( $grouped_options['yes'], 'options' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $grouped_options['on'] ) {
+               wp_cache_delete_multiple( $grouped_options['on'], 'options' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 wp_cache_delete( 'alloptions', 'options' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } elseif ( $grouped_options['no'] ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ } elseif ( $grouped_options['off'] ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $alloptions = wp_load_alloptions( true );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                foreach ( $grouped_options['no'] as $option ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         foreach ( $grouped_options['off'] as $option ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         if ( isset( $alloptions[ $option ] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                unset( $alloptions[ $option ] );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -606,7 +606,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! $alloptions ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $suppress      = $wpdb->suppress_errors();
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'" );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE autoload IN ( '" . implode( "', '", wp_autoload_values_to_autoload() ) . "' )" );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( ! $alloptions_db ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -705,17 +706,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @global wpdb $wpdb WordPress database abstraction object.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @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.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @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.
</ins><span class="cx" style="display: block; padding: 0 10px">  * @return bool True if the value was updated, false otherwise.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function update_option( $option, $value, $autoload = null ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -801,11 +806,6 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /** This filter is documented in wp-includes/option.php */
</span><span class="cx" style="display: block; padding: 0 10px">        if ( apply_filters( "default_option_{$option}", false, $option, false ) === $old_value ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // Default setting for new options is 'yes'.
-               if ( null === $autoload ) {
-                       $autoload = 'yes';
-               }
-
</del><span class="cx" style="display: block; padding: 0 10px">                 return add_option( $option, $value, '', $autoload );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -827,7 +827,17 @@
</span><span class="cx" style="display: block; padding: 0 10px">        );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( null !== $autoload ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $update_args['autoload'] = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $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;
+                       }
+               }
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $result = $wpdb->update( $wpdb->options, $update_args, array( 'option_name' => $option ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -853,7 +863,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        } else {
</span><span class="cx" style="display: block; padding: 0 10px">                                wp_cache_set( $option, $serialized_value, 'options' );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                } elseif ( 'yes' === $update_args['autoload'] ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         } elseif ( in_array( $update_args['autoload'], wp_autoload_values_to_autoload(), true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         // Delete the individual cache, then set in alloptions cache.
</span><span class="cx" style="display: block; padding: 0 10px">                        wp_cache_delete( $option, 'options' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -915,23 +925,26 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * options the same as the ones which are protected.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 1.0.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 6.6.0 The $autoload parameter's default value was changed to null.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @global wpdb $wpdb WordPress database abstraction object.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @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'.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @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.
</ins><span class="cx" style="display: block; padding: 0 10px">  * @return bool True if the option was added, false otherwise.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function add_option( $option, $value = '', $deprecated = '', $autoload = null ) {
</ins><span class="cx" style="display: block; padding: 0 10px">         global $wpdb;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! empty( $deprecated ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -991,8 +1004,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $serialized_value = maybe_serialize( $value );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $autoload         = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes';
</del><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $autoload = wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Fires before an option is added.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1009,7 +1023,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! wp_installing() ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( 'yes' === $autoload ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( in_array( $autoload, wp_autoload_values_to_autoload(), true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $alloptions            = wp_load_alloptions( true );
</span><span class="cx" style="display: block; padding: 0 10px">                        $alloptions[ $option ] = $serialized_value;
</span><span class="cx" style="display: block; padding: 0 10px">                        wp_cache_set( 'alloptions', $alloptions, 'options' );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1093,7 +1107,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        $result = $wpdb->delete( $wpdb->options, array( 'option_name' => $option ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! wp_installing() ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( 'yes' === $row->autoload ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( in_array( $row->autoload, wp_autoload_values_to_autoload(), true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $alloptions = wp_load_alloptions( true );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( is_array( $alloptions ) && isset( $alloptions[ $option ] ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1134,6 +1148,96 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ *  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;
+}
+
+/**
</ins><span class="cx" style="display: block; padding: 0 10px">  * Deletes a transient.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.8.0
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2924,3 +3028,28 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        return $registered[ $option ]['default'];
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+/**
+ * Returns the values that trigger autoloading from the options table.
+ *
+ * @since 6.6.0
+ *
+ * @return array 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 array $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 );
+}
</ins></span></pre></div>
<a id="trunktestsphpunittestscustomizesettingphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/customize/setting.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/customize/setting.php   2024-04-03 15:09:38 UTC (rev 57919)
+++ trunk/tests/phpunit/tests/customize/setting.php     2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -610,7 +610,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->manager->set_post_value( $setting->id, $value );
</span><span class="cx" style="display: block; padding: 0 10px">                $setting->save();
</span><span class="cx" style="display: block; padding: 0 10px">                $autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $setting->id ) );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'yes', $autoload );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'on', $autoload );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->assertSame( $value, get_option( $name ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $name    = 'autoloaded2';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -626,7 +626,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->manager->set_post_value( $setting->id, $value );
</span><span class="cx" style="display: block; padding: 0 10px">                $setting->save();
</span><span class="cx" style="display: block; padding: 0 10px">                $autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $setting->id ) );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'yes', $autoload );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'on', $autoload );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->assertSame( $value, get_option( $name ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $name    = 'not-autoloaded1';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -642,7 +642,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->manager->set_post_value( $setting->id, $value );
</span><span class="cx" style="display: block; padding: 0 10px">                $setting->save();
</span><span class="cx" style="display: block; padding: 0 10px">                $autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $setting->id ) );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'no', $autoload );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'off', $autoload );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->assertSame( $value, get_option( $name ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $id_base  = 'multi-not-autoloaded';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -665,7 +665,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->manager->set_post_value( $setting2->id, 'value2' );
</span><span class="cx" style="display: block; padding: 0 10px">                $setting1->save();
</span><span class="cx" style="display: block; padding: 0 10px">                $autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $id_base ) );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'no', $autoload, 'Even though setting1 did not indicate autoload (thus normally true), since another multidimensional option setting of the base did say autoload=false, it should be autoload=no' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'off', $autoload, 'Even though setting1 did not indicate autoload (thus normally true), since another multidimensional option setting of the base did say autoload=false, it should be autoload=no' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span></span></pre></div>
<a id="trunktestsphpunittestsoptionoptionphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/option/option.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/option/option.php       2024-04-03 15:09:38 UTC (rev 57919)
+++ trunk/tests/phpunit/tests/option/option.php 2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -308,9 +308,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return array(
</span><span class="cx" style="display: block; padding: 0 10px">                        'string 123'   => array( '123' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'integer 123'  => array( 123 ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'integer -123' => array( -123 ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'integer -123' => array( - 123 ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'float 12.3'   => array( 12.3 ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'float -1.23'  => array( -1.23 ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'float -1.23'  => array( - 1.23 ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'boolean true' => array( true ),
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -359,17 +359,95 @@
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public function data_option_autoloading() {
</span><span class="cx" style="display: block; padding: 0 10px">                return array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        array( 'autoload_yes', 'yes', 'yes' ),
-                       array( 'autoload_true', true, 'yes' ),
-                       array( 'autoload_string', 'foo', 'yes' ),
-                       array( 'autoload_int', 123456, 'yes' ),
-                       array( 'autoload_array', array(), 'yes' ),
-                       array( 'autoload_no', 'no', 'no' ),
-                       array( 'autoload_false', false, 'no' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 // Supported values.
+                       array( 'autoload_yes', 'yes', 'on' ),
+                       array( 'autoload_true', true, 'on' ),
+                       array( 'autoload_no', 'no', 'off' ),
+                       array( 'autoload_false', false, 'off' ),
+                       array( 'autoload_null', null, 'auto' ),
+
+                       // Technically unsupported values.
+                       array( 'autoload_string', 'foo', 'auto' ),
+                       array( 'autoload_int', 123456, 'auto' ),
+                       array( 'autoload_array', array(), 'auto' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                 );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @ticket 42441
+        *
+        * @covers ::update_option
+        *
+        * @dataProvider data_option_autoloading_large_option
+        */
+       public function test_update_option_autoloading_large_option( $autoload, $expected ) {
+               global $wpdb;
+               $name = 'foo';
+               add_option( $name, 'bar' );
+               add_filter( 'wp_max_autoloaded_option_size', array( $this, 'filter_max_option_size' ) );
+               $value   = file( DIR_TESTDATA . '/formatting/entities.txt' );
+               $updated = update_option( $name, $value, $autoload );
+               $this->assertTrue( $updated );
+
+               $actual = $wpdb->get_row( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s LIMIT 1", $name ) );
+               $this->assertSame( $expected, $actual->autoload );
+       }
+
+       public function data_option_autoloading_large_option() {
+               return array(
+                       'on'    => array(
+                               'autoload' => 'on',
+                               'expected' => 'on',
+                       ),
+                       'off'   => array(
+                               'autoload' => 'off',
+                               'expected' => 'off',
+                       ),
+                       'yes'   => array(
+                               'autoload' => 'yes',
+                               'expected' => 'on',
+                       ),
+                       'true'  => array(
+                               'autoload' => true,
+                               'expected' => 'on',
+                       ),
+                       'no'    => array(
+                               'autoload' => 'no',
+                               'expected' => 'off',
+                       ),
+                       'false' => array(
+                               'autoload' => false,
+                               'expected' => 'off',
+                       ),
+                       'null'  => array(
+                               'autoload' => null,
+                               'expected' => 'auto-off',
+                       ),
+               );
+       }
+
+       public function filter_max_option_size( $current ) {
+               return 1000;
+       }
+
+       /**
+        * @ticket 42441
+        *
+        * @covers ::update_option
+        */
+       public function test_update_option_autoloading_small_option_auto() {
+               global $wpdb;
+
+               $name = 'foo';
+               add_option( $name, 'bar' );
+               $updated = update_option( $name, 'small_option_data' );
+               $this->assertTrue( $updated );
+
+               $actual = $wpdb->get_row( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s LIMIT 1", $name ) );
+               $this->assertSame( 'auto', $actual->autoload );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Tests that calling update_option() with changed autoload from 'no' to 'yes' updates the cache correctly.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * This ensures that no stale data is served in case the option is deleted after.
</span></span></pre></div>
<a id="trunktestsphpunittestsoptionwpAutoloadValuesToAutoloadphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/tests/phpunit/tests/option/wpAutoloadValuesToAutoload.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/option/wpAutoloadValuesToAutoload.php                           (rev 0)
+++ trunk/tests/phpunit/tests/option/wpAutoloadValuesToAutoload.php     2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,63 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+
+/**
+ * Tests for the wp_autoload_values_to_autoload function.
+ *
+ * @group Option
+ *
+ * @covers ::wp_autoload_values_to_autoload
+ */
+class Tests_Option_wpAutoloadValuesToAutoload extends WP_UnitTestCase {
+
+       /**
+        * @ticket 42441
+        */
+       public function test_wp_autoload_values_to_autoload() {
+               $this->assertSameSets( array( 'yes', 'on', 'auto-on', 'auto' ), wp_autoload_values_to_autoload() );
+       }
+
+       /**
+        * @ticket 42441
+        */
+       public function test_wp_autoload_values_to_autoload_filter_remove() {
+
+               add_filter(
+                       'wp_autoload_values_to_autoload',
+                       static function () {
+                               return array( 'yes' );
+                       }
+               );
+
+               $this->assertSameSets( array( 'yes' ), wp_autoload_values_to_autoload() );
+       }
+
+       /**
+        * @ticket 42441
+        */
+       public function test_wp_autoload_values_to_autoload_filter_extra() {
+
+               add_filter(
+                       'wp_autoload_values_to_autoload',
+                       static function () {
+                               return array( 'yes', 'on', 'auto-on', 'auto', 'extra' );
+                       }
+               );
+
+               $this->assertSameSets( array( 'yes', 'on', 'auto-on', 'auto' ), wp_autoload_values_to_autoload() );
+       }
+
+       /**
+        * @ticket 42441
+        */
+       public function test_wp_autoload_values_to_autoload_filter_replace() {
+
+               add_filter(
+                       'wp_autoload_values_to_autoload',
+                       static function () {
+                               return array( 'yes', 'on', 'auto-on', 'extra' );
+                       }
+               );
+
+               $this->assertSameSets( array( 'yes', 'on', 'auto-on' ), wp_autoload_values_to_autoload() );
+       }
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: trunk/tests/phpunit/tests/option/wpAutoloadValuesToAutoload.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="trunktestsphpunittestsoptionwpDetermineOptionAutoloadValuephp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/tests/phpunit/tests/option/wpDetermineOptionAutoloadValue.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/option/wpDetermineOptionAutoloadValue.php                               (rev 0)
+++ trunk/tests/phpunit/tests/option/wpDetermineOptionAutoloadValue.php 2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,107 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+
+/**
+ * @group option
+ *
+ * @covers ::wp_determine_option_autoload_value
+ */
+class Tests_WP_Determine_Option_Autoload_Value extends WP_UnitTestCase {
+       public function set_up() {
+               add_filter( 'wp_max_autoloaded_option_size', array( $this, 'filter_max_option_size' ) );
+               parent::set_up();
+       }
+
+       /**
+        * @ticket 42441
+        *
+        * @dataProvider data_values
+        *
+        * @param $autoload
+        * @param $expected
+        */
+       public function test_determine_option_autoload_value( $autoload, $expected ) {
+               $test = wp_determine_option_autoload_value( null, '', '', $autoload );
+               $this->assertSame( $expected, $test );
+       }
+
+       public function data_values() {
+               return array(
+                       'yes'      => array(
+                               'autoload' => 'yes',
+                               'expected' => 'on',
+                       ),
+                       'on'       => array(
+                               'autoload' => 'on',
+                               'expected' => 'on',
+                       ),
+                       'true'     => array(
+                               'autoload' => true,
+                               'expected' => 'on',
+                       ),
+                       'no'       => array(
+                               'autoload' => 'no',
+                               'expected' => 'off',
+                       ),
+                       'off'      => array(
+                               'autoload' => 'off',
+                               'expected' => 'off',
+                       ),
+                       'false'    => array(
+                               'autoload' => false,
+                               'expected' => 'off',
+                       ),
+                       'invalid'  => array(
+                               'autoload' => 'foo',
+                               'expected' => 'auto',
+                       ),
+                       'null'     => array(
+                               'autoload' => null,
+                               'expected' => 'auto',
+                       ),
+                       'auto'     => array(
+                               'autoload' => 'auto',
+                               'expected' => 'auto',
+                       ),
+                       'auto-on'  => array(
+                               'autoload' => 'auto-on',
+                               'expected' => 'auto',
+                       ),
+                       'auto-off' => array(
+                               'autoload' => 'auto-off',
+                               'expected' => 'auto',
+                       ),
+               );
+       }
+
+       /**
+        * @ticket 42441
+        */
+       public function test_small_option() {
+               $test = wp_determine_option_autoload_value( 'foo', 'bar', 'bar', null );
+               $this->assertSame( 'auto', $test );
+       }
+
+       /**
+        * @ticket 42441
+        */
+       public function test_large_option() {
+               $value            = file( DIR_TESTDATA . '/formatting/entities.txt' );
+               $serialized_value = maybe_serialize( $value );
+               $test             = wp_determine_option_autoload_value( 'foo', $value, $serialized_value, null );
+               $this->assertSame( 'auto-off', $test );
+       }
+
+       /**
+        * @ticket 42441
+        */
+       public function test_large_option_json() {
+               $value            = file( DIR_TESTDATA . '/themedir1/block-theme/theme.json' );
+               $serialized_value = maybe_serialize( $value );
+               $test             = wp_determine_option_autoload_value( 'foo', $value, $serialized_value, null );
+               $this->assertSame( 'auto-off', $test );
+       }
+
+       public function filter_max_option_size( $current ) {
+               return 1000;
+       }
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: trunk/tests/phpunit/tests/option/wpDetermineOptionAutoloadValue.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="trunktestsphpunittestsoptionwpLoadAlloptionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/option/wpLoadAlloptions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/option/wpLoadAlloptions.php     2024-04-03 15:09:38 UTC (rev 57919)
+++ trunk/tests/phpunit/tests/option/wpLoadAlloptions.php       2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -20,6 +20,32 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @ticket 42441
+        *
+        * @covers ::wp_load_alloptions
+        */
+       public function test_default_and_yes() {
+               add_option( 'foo', 'bar' );
+               add_option( 'bar', 'foo', '', 'yes' );
+               $alloptions = wp_load_alloptions();
+               $this->assertArrayHasKey( 'foo', $alloptions );
+               $this->assertArrayHasKey( 'bar', $alloptions );
+       }
+
+       /**
+        * @ticket 42441
+        *
+        * @covers ::wp_load_alloptions
+        */
+       public function test_default_and_no() {
+               add_option( 'foo', 'bar' );
+               add_option( 'bar', 'foo', '', 'no' );
+               $alloptions = wp_load_alloptions();
+               $this->assertArrayHasKey( 'foo', $alloptions );
+               $this->assertArrayNotHasKey( 'bar', $alloptions );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * @depends test_if_alloptions_is_cached
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @covers ::wp_cache_delete
</span></span></pre></div>
<a id="trunktestsphpunittestsoptionwpSetOptionAutoloadphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/option/wpSetOptionAutoload.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/option/wpSetOptionAutoload.php  2024-04-03 15:09:38 UTC (rev 57919)
+++ trunk/tests/phpunit/tests/option/wpSetOptionAutoload.php    2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -22,7 +22,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                add_option( $option, $value, '', 'no' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertTrue( wp_set_option_autoload( $option, 'yes' ), 'Function did not succeed' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'yes', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'on', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->assertFalse( wp_cache_get( $option, 'options' ), 'Option not deleted from individual cache' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertFalse( wp_cache_get( 'alloptions', 'options' ), 'Alloptions cache not cleared' );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -41,7 +41,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                add_option( $option, $value, '', 'yes' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertTrue( wp_set_option_autoload( $option, 'no' ), 'Function did not succeed' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'no', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'off', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->assertArrayNotHasKey( $option, wp_cache_get( 'alloptions', 'options' ), 'Option not deleted from alloptions cache' );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -59,7 +59,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                add_option( $option, $value, '', 'yes' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertFalse( wp_set_option_autoload( $option, 'yes' ), 'Function did unexpectedly succeed' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'yes', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value unexpectedly updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'on', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value unexpectedly updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -92,7 +92,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                add_option( $option, $value, '', false );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertTrue( wp_set_option_autoload( $option, true ), 'Function did not succeed' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'yes', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'on', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -109,6 +109,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                add_option( $option, $value, '', true );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertTrue( wp_set_option_autoload( $option, false ), 'Function did not succeed' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'no', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'off', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ), 'Option autoload value not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunktestsphpunittestsoptionwpSetOptionAutoloadValuesphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/option/wpSetOptionAutoloadValues.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/option/wpSetOptionAutoloadValues.php    2024-04-03 15:09:38 UTC (rev 57919)
+++ trunk/tests/phpunit/tests/option/wpSetOptionAutoloadValues.php      2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -30,7 +30,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = get_num_queries();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_option_autoload_values( $options ), 'Function produced unexpected result' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries + 2, get_num_queries(), 'Function made unexpected amount of database queries' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'yes', 'yes' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'on', 'on' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 foreach ( $options as $option => $autoload ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->assertFalse( wp_cache_get( $option, 'options' ), sprintf( 'Option %s not deleted from individual cache', $option ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -61,7 +61,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = get_num_queries();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_option_autoload_values( $options ), 'Function produced unexpected result' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries + 2, get_num_queries(), 'Function made unexpected amount of database queries' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'no', 'no' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'off', 'off' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 foreach ( $options as $option => $autoload ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->assertArrayNotHasKey( $option, wp_cache_get( 'alloptions', 'options' ), sprintf( 'Option %s not deleted from alloptions cache', $option ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -89,7 +89,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = get_num_queries();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_option_autoload_values( $options ), 'Function produced unexpected result' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries + 1, get_num_queries(), 'Function made unexpected amount of database queries' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'yes', 'yes' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'on', 'on' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 foreach ( $options as $option => $autoload ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->assertArrayHasKey( $option, wp_cache_get( 'alloptions', 'options' ), sprintf( 'Option %s unexpectedly deleted from alloptions cache', $option ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -124,7 +124,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = get_num_queries();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_option_autoload_values( $options ), 'Function produced unexpected result' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries + 3, get_num_queries(), 'Function made unexpected amount of database queries' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSameSets( array( 'yes', 'no', 'yes' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSameSets( array( 'on', 'off', 'on' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 foreach ( $options as $option => $autoload ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->assertFalse( wp_cache_get( $option, 'options' ), sprintf( 'Option %s not deleted from individual cache', $option ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -158,7 +158,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = get_num_queries();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_option_autoload_values( $options ), 'Function produced unexpected result' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries + 2, get_num_queries(), 'Function made unexpected amount of database queries' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSameSets( array( 'yes', 'no', 'yes' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSameSets( array( 'on', 'off', 'on' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 foreach ( $options as $option => $autoload ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( 'no' === $autoload ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $this->assertArrayNotHasKey( $option, wp_cache_get( 'alloptions', 'options' ), sprintf( 'Option %s not deleted from alloptions cache', $option ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -199,7 +199,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_option_autoload_values( $options ), 'Function produced unexpected result' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'no', 'no' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'off', 'off' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -224,7 +224,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = get_num_queries();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_option_autoload_values( $options ), 'Function produced unexpected result' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries + 3, get_num_queries(), 'Function made unexpected amount of database queries' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSameSets( array( 'yes', 'no' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSameSets( array( 'on', 'off' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span></span></pre></div>
<a id="trunktestsphpunittestsoptionwpSetOptionsAutoloadphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/option/wpSetOptionsAutoload.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/option/wpSetOptionsAutoload.php 2024-04-03 15:09:38 UTC (rev 57919)
+++ trunk/tests/phpunit/tests/option/wpSetOptionsAutoload.php   2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -30,7 +30,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = get_num_queries();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_options_autoload( array_keys( $options ), 'yes' ), 'Function did not succeed' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries + 2, get_num_queries(), 'Updating options autoload value ran too many queries' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'yes', 'yes' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'on', 'on' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 foreach ( $options as $option => $value ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->assertFalse( wp_cache_get( $option, 'options' ), sprintf( 'Option %s not deleted from individual cache', $option ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -59,7 +59,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = get_num_queries();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_options_autoload( array_keys( $options ), 'no' ), 'Function did not succeed' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries + 2, get_num_queries(), 'Updating options autoload value ran too many queries' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'no', 'no' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'off', 'off' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 foreach ( $options as $option => $value ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->assertArrayNotHasKey( $option, wp_cache_get( 'alloptions', 'options' ), sprintf( 'Option %s not deleted from alloptions cache', $option ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -87,7 +87,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = get_num_queries();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_options_autoload( array_keys( $options ), 'yes' ), 'Function did unexpectedly succeed' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries + 1, get_num_queries(), 'Function attempted to update options autoload value in database' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'yes', 'yes' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Options autoload value unexpectedly updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'on', 'on' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Options autoload value unexpectedly updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -133,7 +133,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_options_autoload( array_keys( $options ), 'yes' ), 'Function produced unexpected result' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'yes', 'yes' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'on', 'on' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 foreach ( $options as $option => $value ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->assertFalse( wp_cache_get( $option, 'options' ), sprintf( 'Option %s not deleted from individual cache', $option ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -161,7 +161,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_options_autoload( array_keys( $options ), true ), 'Function produced unexpected result' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'yes', 'yes' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'on', 'on' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -185,6 +185,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $expected, wp_set_options_autoload( array_keys( $options ), false ), 'Function produced unexpected result' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( array( 'no', 'no' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( array( 'off', 'off' ), $wpdb->get_col( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name IN (" . implode( ',', array_fill( 0, count( $options ), '%s' ) ) . ')', ...array_keys( $options ) ) ), 'Option autoload values not updated in database' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunktestsphpunitteststhemeautoloadThemeModsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/theme/autoloadThemeMods.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/theme/autoloadThemeMods.php     2024-04-03 15:09:38 UTC (rev 57919)
+++ trunk/tests/phpunit/tests/theme/autoloadThemeMods.php       2024-04-03 21:29:13 UTC (rev 57920)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -28,13 +28,13 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                switch_theme( $new_theme_stylesheet );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'no', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", "theme_mods_$current_theme_stylesheet" ) ), 'Theme mods autoload value not set to no in database' );
-               $this->assertSame( 'yes', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", "theme_mods_$new_theme_stylesheet" ) ), 'Theme mods autoload value not set to yes in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'off', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", "theme_mods_$current_theme_stylesheet" ) ), 'Theme mods autoload value not set to no in database' );
+               $this->assertSame( 'on', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", "theme_mods_$new_theme_stylesheet" ) ), 'Theme mods autoload value not set to yes in database' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                switch_theme( $current_theme_stylesheet );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertSame( 'yes', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", "theme_mods_$current_theme_stylesheet" ) ), 'Theme mods autoload value not set to yes in database' );
-               $this->assertSame( 'no', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", "theme_mods_$new_theme_stylesheet" ) ), 'Theme mods autoload value not set to no in database' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertSame( 'on', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", "theme_mods_$current_theme_stylesheet" ) ), 'Theme mods autoload value not set to yes in database' );
+               $this->assertSame( 'off', $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", "theme_mods_$new_theme_stylesheet" ) ), 'Theme mods autoload value not set to no in database' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Basic assertion to make sure that we haven't lost the mods.
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( 'a-value', get_theme_mod( 'foo-bar-option' ) );
</span></span></pre>
</div>
</div>

</body>
</html>