The WordPress 6.9.2 release was meant to be a routine security patch. It turned into a week of fast-follow updates, with security commits missing from the package and classic themes refusing to render. I have pushed hundreds of client sites through minor releases that went sideways, and this one still stands out.
The Security Team shipped the main release before the backports to the 22 older supported branches were finished, hoping to take pressure off the schedule. It did the opposite. Three critical security fixes never made it into the initial package. At WordPress scale the bottleneck is still people, not build servers.
The regression: stringable objects in template_include
Right after the release, the forums filled up with classic themes that could not load their templates. The ones doing something unusual with template loading hit a regression in the template_include filter. The documentation has always said that filter takes a string, the file path. A fair number of developers have been returning “stringable” objects instead, for years, and it worked.
The 6.9.2 changes did not account for those objects, and the front end went down completely. I went through the fix in more detail in my post on WordPress 6.9.3 and stringable objects. The pattern that caused the headache looks like this:
<?php
/**
* The Naive Approach: Returning an object in template_include
* This worked by accident in older versions but broke in 6.9.2.
*/
add_filter( 'template_include', function( $template ) {
// Imagine $template_provider is an object with a __toString method
$template_provider = new bbioon_Template_Handler();
// Returning the object instead of the string path
return $template_provider;
} );
6.9.3 went out eight hours later purely to restore compatibility. Behavior that is unsupported but widely used still forces the Core team’s hand. The initial security advisory explains why the patch was urgent enough to rush in the first place.
Human error in the minor release process
The part that worries me is WordPress 6.9.4. About 20 hours after the initial release, someone noticed that 3 of the 10 security commits were not in the package at all. They had been merged into trunk and never landed on the 6.9 branch.
Nothing exotic caused that. There was no independent verification, and the process trusted whoever ran the merge to get it right the first time. The team is updating the minor release checklist so double verification and TTL adjustments become requirements rather than habits.
Backporting to 22 branches
Supporting 22 older versions is impressive, and it is also running out of road. During this cycle the SVN pre-commit hooks broke and blocked updates for 5.2 and earlier. Sites on those versions sat unpatched for days while the systems team fought the build server.
Which is why the advice I give clients has not changed: stay on the latest branch. The Security Team offers the backports as a courtesy, and patching two decades of code carries its own risk, most of it in the friction of getting the patch built and out the door.
If keeping up with releases like this is eating your dev hours, I can take it on. I have been working with WordPress since the 4.x days.
What changes next
Action points are already moving: more unit test coverage on the template_include filter, and better automation for backports. Matt Mullenweg floated AI-assisted risk assessment for releases. I would settle for a peer-review checklist somebody has to sign off on.
For the rest of us, the lesson is that a minor release is not automatically just a patch. Test on staging, and be extra careful when security commits are moving across several branches under time pressure.