<!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>[59016] trunk/src: Administration: Increase frequency of heartbeat API requests.</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/59016">59016</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/59016","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>peterwilsoncc</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2024-09-11 23:07:26 +0000 (Wed, 11 Sep 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'>Administration: Increase frequency of heartbeat API requests.

Increases the frequency of heartbeat API requests from once every 15 seconds to once every 10 seconds.

The purpose of this change is to reduce the length of time before a post becomes unlocked as a user navigates around the WordPress Dashboard and ceases editing a post.

`wp.heartbeat.interval()` has been modified to allow theme and plugin authors to set the heartbeat interval to any value between one second and one hour rather than limiting them to a fixed set of values.

Props azaozz, annezazu, jorbin, kirasong.
Fixes <a href="https://core.trac.wordpress.org/ticket/61960">#61960</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcjs_enqueuesadmininlineeditpostjs">trunk/src/js/_enqueues/admin/inline-edit-post.js</a></li>
<li><a href="#trunksrcjs_enqueuesadminpostjs">trunk/src/js/_enqueues/admin/post.js</a></li>
<li><a href="#trunksrcjs_enqueueswpheartbeatjs">trunk/src/js/_enqueues/wp/heartbeat.js</a></li>
<li><a href="#trunksrcwpadmineditformblocksphp">trunk/src/wp-admin/edit-form-blocks.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcjs_enqueuesadmininlineeditpostjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/js/_enqueues/admin/inline-edit-post.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/js/_enqueues/admin/inline-edit-post.js  2024-09-11 22:39:45 UTC (rev 59015)
+++ trunk/src/js/_enqueues/admin/inline-edit-post.js    2024-09-11 23:07:26 UTC (rev 59016)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -250,7 +250,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( ! $( this ).parent().find( 'input[name="indeterminate_post_category[]"]' ).length ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        // Get the term label text.
</span><span class="cx" style="display: block; padding: 0 10px">                                        var label = $( this ).parent().text();
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        // Set indeterminate states for the backend. Add accessible text for indeterminate inputs. 
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 // Set indeterminate states for the backend. Add accessible text for indeterminate inputs.
</ins><span class="cx" style="display: block; padding: 0 10px">                                         $( this ).after( '<input type="hidden" name="indeterminate_post_category[]" value="' + $( this ).val() + '">' ).attr( 'aria-label', label.trim() + ': ' + wp.i18n.__( 'Some selected posts have this category' ) );
</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">@@ -603,9 +603,9 @@
</span><span class="cx" style="display: block; padding: 0 10px"> // Show/hide locks on posts.
</span><span class="cx" style="display: block; padding: 0 10px"> $( function() {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        // Set the heartbeat interval to 15 seconds.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Set the heartbeat interval to 10 seconds.
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( typeof wp !== 'undefined' && wp.heartbeat ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                wp.heartbeat.interval( 15 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         wp.heartbeat.interval( 10 );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> }).on( 'heartbeat-tick.wp-check-locked-posts', function( e, data ) {
</span><span class="cx" style="display: block; padding: 0 10px">        var locked = data['wp-check-locked-posts'] || {};
</span></span></pre></div>
<a id="trunksrcjs_enqueuesadminpostjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/js/_enqueues/admin/post.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/js/_enqueues/admin/post.js      2024-09-11 22:39:45 UTC (rev 59015)
+++ trunk/src/js/_enqueues/admin/post.js        2024-09-11 23:07:26 UTC (rev 59016)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -343,9 +343,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }).filter(':visible').find('.wp-tab-first').trigger( 'focus' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        // Set the heartbeat interval to 15 seconds if post lock dialogs are enabled.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Set the heartbeat interval to 10 seconds if post lock dialogs are enabled.
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( wp.heartbeat && $('#post-lock-dialog').length ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                wp.heartbeat.interval( 15 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         wp.heartbeat.interval( 10 );
</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">        // The form is being submitted by the user.
</span></span></pre></div>
<a id="trunksrcjs_enqueueswpheartbeatjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/js/_enqueues/wp/heartbeat.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/js/_enqueues/wp/heartbeat.js    2024-09-11 22:39:45 UTC (rev 59015)
+++ trunk/src/js/_enqueues/wp/heartbeat.js      2024-09-11 23:07:26 UTC (rev 59016)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -132,16 +132,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">                                /*
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                 * The interval can be from 15 to 120 seconds and can be set temporarily to 5 seconds.
-                                * It can be set in the initial options or changed later through JS and/or through PHP.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                          * Logic check: the interval can be from 1 to 3600 seconds and can be set temporarily
+                                * to 5 seconds. It can be set in the initial options or changed later from JS
+                                * or from PHP through the AJAX responses.
</ins><span class="cx" style="display: block; padding: 0 10px">                                  */
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( options.interval ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        settings.mainInterval = options.interval;
</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 ( settings.mainInterval < 15 ) {
-                                               settings.mainInterval = 15;
-                                       } else if ( settings.mainInterval > 120 ) {
-                                               settings.mainInterval = 120;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 if ( settings.mainInterval < 1 ) {
+                                               settings.mainInterval = 1;
+                                       } else if ( settings.mainInterval > 3600 ) {
+                                               settings.mainInterval = 3600;
</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">@@ -721,10 +722,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 *
</span><span class="cx" style="display: block; padding: 0 10px">                 * @memberOf wp.heartbeat.prototype
</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|number} speed Interval: 'fast' or 5, 15, 30, 60, 120.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+          * @param {string|number} speed Interval: 'fast' or integer between 1 and 3600 (seconds).
</ins><span class="cx" style="display: block; padding: 0 10px">                  *                              Fast equals 5.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                 * @param {string}        ticks Tells how many ticks before the interval reverts
-                *                              back. Used with speed = 'fast' or 5.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+          * @param {number}        ticks Tells how many ticks before the interval reverts back.
+                *                              Value must be between 1 and 30. Used with speed = 'fast' or 5.
</ins><span class="cx" style="display: block; padding: 0 10px">                  *
</span><span class="cx" style="display: block; padding: 0 10px">                 * @return {number} Current interval in seconds.
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -733,29 +734,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                oldInterval = settings.tempInterval ? settings.tempInterval : settings.mainInterval;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( speed ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                switch ( speed ) {
-                                       case 'fast':
-                                       case 5:
-                                               newInterval = 5000;
-                                               break;
-                                       case 15:
-                                               newInterval = 15000;
-                                               break;
-                                       case 30:
-                                               newInterval = 30000;
-                                               break;
-                                       case 60:
-                                               newInterval = 60000;
-                                               break;
-                                       case 120:
-                                               newInterval = 120000;
-                                               break;
-                                       case 'long-polling':
-                                               // Allow long polling (experimental).
-                                               settings.mainInterval = 0;
-                                               return 0;
-                                       default:
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         if ( 'fast' === speed ) {
+                                       // Special case, see below.
+                                       newInterval = 5000;
+                               } else if ( 'long-polling' === speed ) {
+                                       // Allow long polling (experimental).
+                                       settings.mainInterval = 0;
+                                       return 0;
+                               } else {
+                                       speed = parseInt( speed, 10 );
+
+                                       if ( speed >= 1 && speed <= 3600 ) {
+                                               newInterval = speed * 1000;
+                                       } else {
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 newInterval = settings.originalInterval;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                        }
</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">                                if ( settings.minimalInterval && newInterval < settings.minimalInterval ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -762,6 +755,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                        newInterval = settings.minimalInterval;
</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">+                                // Special case, runs for a number of ticks then reverts to the previous interval.
</ins><span class="cx" style="display: block; padding: 0 10px">                                 if ( 5000 === newInterval ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        ticks = parseInt( ticks, 10 ) || 30;
</span><span class="cx" style="display: block; padding: 0 10px">                                        ticks = ticks < 1 || ticks > 30 ? 30 : ticks;
</span></span></pre></div>
<a id="trunksrcwpadmineditformblocksphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/edit-form-blocks.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/edit-form-blocks.php   2024-09-11 22:39:45 UTC (rev 59015)
+++ trunk/src/wp-admin/edit-form-blocks.php     2024-09-11 23:07:26 UTC (rev 59016)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -123,6 +123,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">        'before'
</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">+// Set Heartbeat interval to 10 seconds, used to refresh post locks.
+wp_add_inline_script(
+       'heartbeat',
+       'if ( window.wp && window.wp.heartbeat ) {
+               window.wp.heartbeat.interval( 10 );
+       }'
+);
+
</ins><span class="cx" style="display: block; padding: 0 10px"> /*
</span><span class="cx" style="display: block; padding: 0 10px">  * Get all available templates for the post/page attributes meta-box.
</span><span class="cx" style="display: block; padding: 0 10px">  * The "Default template" array element should only be added if the array is
</span></span></pre>
</div>
</div>

</body>
</html>