I was troubleshooting a client’s site last week, a big multisite network with maybe 500+ subsites, and the main dashboard kept timing out for super admins. After some digging I found the culprit: the default WordPress News widget. It was calling fetch_feed() on every dashboard load, for every site, which created a serious bottleneck. These are the obscure problems that drive clients crazy and are no fun to debug. My first instinct was to dequeue the widget entirely, quick and dirty, but that felt like a hack rather than a fix, especially since the client liked seeing the news updates. It is a good example of the small but real WordPress 6.9 developer changes that just landed.
How WordPress 6.9 quietly fixed this mess
In WordPress 6.9, fetch_feed() now uses site transients instead of single-site transients on multisite installs. In plain terms, the feed is fetched once and cached across the whole network. The problem I spent an hour diagnosing is now handled at the core level, with no custom code and no widget removal needed. These are the updates that get little press but make a real difference day to day. The full list of miscellaneous changes is on the official WordPress dev blog, but a few others are worth calling out.
Finally, sane taxonomy templates
We have all been there. You build a custom template for a category, say taxonomy-product_cat-new-arrivals.php. A week later the client renames “New Arrivals” to “Latest Gear,” the slug changes, and your template breaks. WordPress 6.9 handles this more reliably by letting you use term IDs in the template name. The new format is taxonomy-$taxonomy-{$term->term_id}.php. It is not exciting, but it is stable, and stable is what clients pay for.
<?php
// Old way, breaks if 'new-arrivals' slug changes
// taxonomy-product_cat-new-arrivals.php
// New way in 6.9, rock solid.
// taxonomy-product_cat-123.php
?>
A few other changes worth knowing
A couple of other things stood out. First, WordPress now ships polyfills for PHP 8.5’s new array_first() and array_last() functions, so you can write cleaner, more modern PHP without breaking sites on older versions. Second, and this one matters for plugin developers, is the new validate_plugin_requirements hook. You can now stop a plugin from activating if its dependencies are not met, such as a required PHP extension or a minimum version of another plugin.
<?php
add_filter( 'validate_plugin_requirements', function( $requirements, $plugin_file ) {
// Only run for our specific plugin
if ( 'bbioon-plugin/bbioon-plugin.php' !== $plugin_file ) {
return $requirements;
}
// Check if the cURL extension is loaded
if ( ! extension_loaded( 'curl' ) ) {
$requirements['php_extensions']['curl'] = [
'name' => 'cURL',
'required' => true,
];
}
return $requirements;
}, 10, 2 );
?>
Why the small changes matter
The major features get all the attention, but these under-the-hood tweaks are often what set experienced developers apart. Knowing that a new hook or template format exists can save you hours and keep you from building a fragile custom workaround. It comes down to knowing your toolset well.
This gets complicated quickly. If you are tired of untangling someone else’s mess and just want your site to work, get in touch with my team. We have probably seen it before.
What small core change has saved you the most time on a project?