<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andy Kirchbühler</title>
    <description>The latest articles on DEV Community by Andy Kirchbühler (@rushdev).</description>
    <link>https://dev.to/rushdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3786335%2Fc1b3f47f-be02-4ad9-9b28-e700e5e8eb4f.png</url>
      <title>DEV Community: Andy Kirchbühler</title>
      <link>https://dev.to/rushdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rushdev"/>
    <language>en</language>
    <item>
      <title>WordPress, 404s, and the Cost of a Typo</title>
      <dc:creator>Andy Kirchbühler</dc:creator>
      <pubDate>Fri, 18 Sep 2026 09:47:08 +0000</pubDate>
      <link>https://dev.to/rushdev/wordpress-404s-and-the-cost-of-a-typo-1b7p</link>
      <guid>https://dev.to/rushdev/wordpress-404s-and-the-cost-of-a-typo-1b7p</guid>
      <description>&lt;h1&gt;
  
  
  WordPress, 404s, and the Cost of a Typo
&lt;/h1&gt;

&lt;p&gt;A request arrives at a WordPress site.&lt;/p&gt;

&lt;p&gt;The URL does not exist.&lt;/p&gt;

&lt;p&gt;At that point, you might expect the web server to reject it and move on.&lt;/p&gt;

&lt;p&gt;Instead, WordPress can do a surprising amount of work before it can confidently say:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;404. Nothing here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That always bothered me.&lt;/p&gt;

&lt;p&gt;Not because 404 pages are unusual. They are part of the web.&lt;/p&gt;

&lt;p&gt;What bothers me is the amount of machinery that may be involved in producing an answer that, in many cases, could have been known much earlier.&lt;/p&gt;

&lt;p&gt;And there is a second problem hiding behind the first one.&lt;/p&gt;

&lt;p&gt;Sometimes the requested resource actually does exist.&lt;/p&gt;

&lt;p&gt;Only the URL is slightly wrong.&lt;/p&gt;

&lt;p&gt;One missing letter can be enough to turn perfectly valid intent into a dead end.&lt;/p&gt;

&lt;p&gt;That combination made me wonder whether WordPress handles some requests too late.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 404 is not always a cheap answer
&lt;/h2&gt;

&lt;p&gt;WordPress is an application, not a static file server.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;When a request reaches WordPress, the application needs context before it can decide what the request means.&lt;/p&gt;

&lt;p&gt;Routing happens. Rewrite rules are evaluated. The request is parsed. Plugins may load. The theme may become involved. Database queries may happen.&lt;/p&gt;

&lt;p&gt;Eventually WordPress reaches a conclusion:&lt;/p&gt;

&lt;p&gt;There is no matching resource.&lt;/p&gt;

&lt;p&gt;The response becomes a 404.&lt;/p&gt;

&lt;p&gt;From the visitor's perspective, that sounds simple.&lt;/p&gt;

&lt;p&gt;From the server's perspective, it may not have been simple at all.&lt;/p&gt;

&lt;p&gt;This becomes especially wasteful when the request was obviously useless from the beginning.&lt;/p&gt;

&lt;p&gt;Think about automated probes, malformed URLs, abandoned paths, random scanner traffic, old links, broken bots and requests for resources that have never existed on the site.&lt;/p&gt;

&lt;p&gt;The application spends resources discovering the absence of something.&lt;/p&gt;

&lt;p&gt;That feels backwards.&lt;/p&gt;

&lt;p&gt;If the answer can already be established before the CMS is fully involved, why boot the CMS just to confirm it?&lt;/p&gt;

&lt;h2&gt;
  
  
  The usual performance discussion starts too late
&lt;/h2&gt;

&lt;p&gt;Most WordPress performance work focuses on making execution cheaper.&lt;/p&gt;

&lt;p&gt;Caching, object caching, CDNs, database tuning, PHP tuning and asset optimization all have their place.&lt;/p&gt;

&lt;p&gt;But they usually start with the same assumption:&lt;/p&gt;

&lt;p&gt;The request should reach WordPress.&lt;/p&gt;

&lt;p&gt;That is the part I started questioning.&lt;/p&gt;

&lt;p&gt;There is a difference between making work faster and avoiding unnecessary work altogether.&lt;/p&gt;

&lt;p&gt;If a request can safely be identified as irrelevant before WordPress has to process it, then the fastest version of that request is not an optimized WordPress request.&lt;/p&gt;

&lt;p&gt;It is a request WordPress never had to handle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi9wdj7d5retic1wv9c0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi9wdj7d5retic1wv9c0z.png" alt=" " width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Then there is the opposite problem
&lt;/h2&gt;

&lt;p&gt;Rejecting useless requests early sounds straightforward.&lt;/p&gt;

&lt;p&gt;But there is a trap.&lt;/p&gt;

&lt;p&gt;Not every incorrect URL represents incorrect intent.&lt;/p&gt;

&lt;p&gt;Assume this is a valid page:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/example-title/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now somebody links to:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/exampl-title/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;One letter is missing.&lt;/p&gt;

&lt;p&gt;The visitor's intention may still be obvious to a human.&lt;/p&gt;

&lt;p&gt;The resource still exists.&lt;/p&gt;

&lt;p&gt;But the path no longer identifies it reliably.&lt;/p&gt;

&lt;p&gt;If WordPress cannot determine which resource was intended, the request ends in a 404.&lt;/p&gt;

&lt;p&gt;And that exposes another form of waste.&lt;/p&gt;

&lt;p&gt;The first kind wastes server resources.&lt;/p&gt;

&lt;p&gt;The second kind wastes traffic.&lt;/p&gt;

&lt;p&gt;A visitor, search engine, external website, bookmark, email or automated system may be trying to reach a real resource. A damaged or outdated path can break that connection completely.&lt;/p&gt;

&lt;p&gt;Simply rejecting unknown requests earlier would therefore solve only half of the problem.&lt;/p&gt;

&lt;p&gt;Some requests should be rejected.&lt;/p&gt;

&lt;p&gt;Some should be recovered.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem is identity
&lt;/h2&gt;

&lt;p&gt;A typical WordPress permalink can look like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/example-title/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It is nice to read.&lt;/p&gt;

&lt;p&gt;It tells humans something about the resource.&lt;/p&gt;

&lt;p&gt;But it also has to identify the resource.&lt;/p&gt;

&lt;p&gt;Those are two different jobs.&lt;/p&gt;

&lt;p&gt;Preflight separates them.&lt;/p&gt;

&lt;p&gt;For a Post, a Preflight URL can look like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/example-title/:-:123/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first part is still semantic:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;example-title&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then comes a delimiter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:-:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And after that comes the stable resource ID:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;123&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The readable part describes the resource.&lt;/p&gt;

&lt;p&gt;The ID identifies it.&lt;/p&gt;

&lt;p&gt;That distinction changes what can happen when a URL gets damaged.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when somebody makes a typo?
&lt;/h2&gt;

&lt;p&gt;Take the canonical Preflight URL:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/example-title/:-:123/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now imagine that an external site accidentally publishes this instead:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/exampl-title/:-:123/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The semantic part is wrong.&lt;/p&gt;

&lt;p&gt;But the resource identity is still there.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;123&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Preflight does not have to guess that "exampl" probably meant "example".&lt;/p&gt;

&lt;p&gt;It does not need fuzzy matching.&lt;/p&gt;

&lt;p&gt;It can identify resource 123 directly.&lt;/p&gt;

&lt;p&gt;It can then compare the requested path with the current canonical path and see that they do not match.&lt;/p&gt;

&lt;p&gt;The result can be a permanent redirect:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;301 -&amp;gt; /example-title/:-:123/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The typo never becomes the identity of the resource.&lt;/p&gt;

&lt;p&gt;And the visit does not have to disappear into a 404.&lt;/p&gt;

&lt;p&gt;That is the part I find important.&lt;/p&gt;

&lt;p&gt;This is not typo correction in the usual sense.&lt;/p&gt;

&lt;p&gt;Preflight is not trying to be clever about spelling.&lt;/p&gt;

&lt;p&gt;The semantic part can be wrong while the stable part still says exactly which resource was requested.&lt;/p&gt;

&lt;h2&gt;
  
  
  It also works when the URL simply gets old
&lt;/h2&gt;

&lt;p&gt;Typos are only the obvious example.&lt;/p&gt;

&lt;p&gt;Imagine the resource title or slug changes later.&lt;/p&gt;

&lt;p&gt;The old URL might be:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/my-old-title/:-:123/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The current canonical URL might now be:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/my-new-title/:-:123/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The wording changed.&lt;/p&gt;

&lt;p&gt;The identity did not.&lt;/p&gt;

&lt;p&gt;That means an old external link can still carry enough information to identify the intended resource and reach its current canonical URL.&lt;/p&gt;

&lt;p&gt;The human-readable part of the URL is allowed to evolve without becoming the only source of truth about what the URL points to.&lt;/p&gt;

&lt;p&gt;This is a fairly old idea in computing.&lt;/p&gt;

&lt;p&gt;What interested me was applying it to WordPress not only for URL resilience, but also for request qualification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stable identity makes earlier decisions possible
&lt;/h2&gt;

&lt;p&gt;Once public resources have an identity that can be recognized without relying entirely on WordPress resolving an arbitrary semantic path, another possibility appears.&lt;/p&gt;

&lt;p&gt;You can ask useful questions earlier.&lt;/p&gt;

&lt;p&gt;Is this a known resource?&lt;/p&gt;

&lt;p&gt;Does it still exist?&lt;/p&gt;

&lt;p&gt;Does the requested semantic path match its canonical path?&lt;/p&gt;

&lt;p&gt;Is this request valid enough to justify handing it to WordPress?&lt;/p&gt;

&lt;p&gt;Or is there already enough information to produce the correct response?&lt;/p&gt;

&lt;p&gt;That is where the performance side and the URL side of Preflight meet.&lt;/p&gt;

&lt;p&gt;The resource ID is not there merely to make unusual-looking URLs.&lt;/p&gt;

&lt;p&gt;It provides a deterministic piece of information that can be evaluated before the normal WordPress request lifecycle has done all of its work.&lt;/p&gt;

&lt;h2&gt;
  
  
  That became Preflight
&lt;/h2&gt;

&lt;p&gt;I called the experiment &lt;strong&gt;Preflight&lt;/strong&gt; because that is essentially what it does.&lt;/p&gt;

&lt;p&gt;Before a request is handed to the full WordPress application, perform a lightweight qualification.&lt;/p&gt;

&lt;p&gt;Not a replacement router.&lt;/p&gt;

&lt;p&gt;Not another cache.&lt;/p&gt;

&lt;p&gt;Not a second CMS.&lt;/p&gt;

&lt;p&gt;Just an early decision layer in front of the expensive one.&lt;/p&gt;

&lt;p&gt;A valid request can continue normally.&lt;/p&gt;

&lt;p&gt;A known resource with an incorrect or stale semantic path can be redirected to its canonical URL.&lt;/p&gt;

&lt;p&gt;A resource known to be gone can be handled accordingly.&lt;/p&gt;

&lt;p&gt;An invalid request can be rejected early.&lt;/p&gt;

&lt;p&gt;And when Preflight cannot make a reliable decision, WordPress remains the fallback.&lt;/p&gt;

&lt;p&gt;That last point matters.&lt;/p&gt;

&lt;p&gt;Early handling only makes sense when uncertainty does not break normal application behavior.&lt;/p&gt;

&lt;p&gt;Preflight should act when it knows.&lt;/p&gt;

&lt;p&gt;Not when it guesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  There is another expensive corner: missing static files
&lt;/h2&gt;

&lt;p&gt;There is a related case that is easy to overlook.&lt;/p&gt;

&lt;p&gt;A missing image, CSS file, JavaScript file or font can also fall through the normal WordPress rewrite path on some setups.&lt;/p&gt;

&lt;p&gt;At that point the server may end up starting WordPress merely to discover that a static file does not exist.&lt;/p&gt;

&lt;p&gt;That is an impressive amount of software to answer a very small question.&lt;/p&gt;

&lt;p&gt;Preflight treats static files differently from resources such as Posts, Terms and Authors. They do not need the same identity model.&lt;/p&gt;

&lt;p&gt;Where the server configuration allows it, missing static resources can be finished at the web-server level instead of falling through to the normal WordPress front controller.&lt;/p&gt;

&lt;p&gt;Again, the principle is the same:&lt;/p&gt;

&lt;p&gt;Do not start the application when the answer does not require the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  WordPress is not doing anything irrational
&lt;/h2&gt;

&lt;p&gt;Its architecture makes sense within the assumptions it was built around.&lt;/p&gt;

&lt;p&gt;The application receives a request and figures out what that request means.&lt;/p&gt;

&lt;p&gt;The question is whether every request reaching a modern public WordPress installation still deserves that treatment.&lt;/p&gt;

&lt;p&gt;Bots probe arbitrary URLs.&lt;/p&gt;

&lt;p&gt;Scanners try common files.&lt;/p&gt;

&lt;p&gt;Old paths survive for years.&lt;/p&gt;

&lt;p&gt;Links get copied incorrectly.&lt;/p&gt;

&lt;p&gt;Automated systems invent paths.&lt;/p&gt;

&lt;p&gt;Humans make typos.&lt;/p&gt;

&lt;p&gt;Removed images remain referenced somewhere.&lt;/p&gt;

&lt;p&gt;Yet many of those requests can enter the same application pipeline as a legitimate page view.&lt;/p&gt;

&lt;p&gt;That is the part I find difficult to justify.&lt;/p&gt;

&lt;p&gt;The application should be involved when application knowledge is required.&lt;/p&gt;

&lt;p&gt;But when the answer is already known, executing the whole stack looks less like flexibility and more like unnecessary work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not every optimization has to optimize execution
&lt;/h2&gt;

&lt;p&gt;This is probably the main thing I took away from building Preflight.&lt;/p&gt;

&lt;p&gt;Performance discussions tend to focus on execution.&lt;/p&gt;

&lt;p&gt;How quickly can PHP run?&lt;/p&gt;

&lt;p&gt;How much can we cache?&lt;/p&gt;

&lt;p&gt;How many queries can we remove?&lt;/p&gt;

&lt;p&gt;How small can the page become?&lt;/p&gt;

&lt;p&gt;Those are useful questions.&lt;/p&gt;

&lt;p&gt;But there is another one:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should this request cause application execution at all?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the best query is the one that never runs.&lt;/p&gt;

&lt;p&gt;Sometimes the fastest plugin is the one that never loads.&lt;/p&gt;

&lt;p&gt;Sometimes the cheapest 404 is the one WordPress never has to discover.&lt;/p&gt;

&lt;p&gt;And sometimes a broken-looking URL should not be a 404 at all.&lt;/p&gt;

&lt;p&gt;If the stable identity still tells us which resource was intended, throwing that request away would be just as wasteful as processing an obviously invalid one through the entire application stack.&lt;/p&gt;

&lt;p&gt;That is the idea behind Preflight.&lt;/p&gt;

&lt;p&gt;Reject what is clearly invalid.&lt;/p&gt;

&lt;p&gt;Recover what is still identifiable.&lt;/p&gt;

&lt;p&gt;And involve WordPress when WordPress is actually needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wordpress.org/plugins/imedes-preflight/" rel="noopener noreferrer"&gt;https://wordpress.org/plugins/imedes-preflight/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>performance</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>Beyond WooCommerce.com’s Selective Plugin Loading</title>
      <dc:creator>Andy Kirchbühler</dc:creator>
      <pubDate>Sat, 01 Aug 2026 18:06:05 +0000</pubDate>
      <link>https://dev.to/rushdev/beyond-woocommercecoms-selective-plugin-loading-59hh</link>
      <guid>https://dev.to/rushdev/beyond-woocommercecoms-selective-plugin-loading-59hh</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why the final plugin filter is only half of the architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.woocommerce.com/2026/07/21/selective-plugin-loading/" rel="noopener noreferrer"&gt;https://developer.woocommerce.com/2026/07/21/selective-plugin-loading/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WooCommerce Engineering recently published a useful account of how WooCommerce.com reduces WordPress bootstrap cost by loading fewer plugins on selected requests.&lt;/p&gt;

&lt;p&gt;The article deserves attention for a simple reason: it names and measures a problem that WordPress performance discussions often overlook.&lt;/p&gt;

&lt;p&gt;A WordPress installation has one global list of active plugins.&lt;/p&gt;

&lt;p&gt;A single request rarely needs all of them.&lt;/p&gt;

&lt;p&gt;WooCommerce.com found that unrelated plugins could consume 10 to 20 percent of the generation time of an uncached blog request. On selected internal endpoints, loading only the required plugins reduced memory use by more than 50 percent. Reported request times dropped from around 800 ms to 475 ms and from 880 ms to 550 ms. An early test on product pages produced roughly a 10 percent improvement in page-generation time.&lt;/p&gt;

&lt;p&gt;That is valuable evidence.&lt;/p&gt;

&lt;p&gt;It confirms that plugin bootstrap is not merely theoretical overhead. Every loaded plugin may register hooks, instantiate services, read options, load translations, attach REST routes or initialize integrations that the current request never uses. Full-page caching reduces how often this work occurs, but it cannot remove the cost from cache misses, logged-in sessions, APIs and other dynamic requests.&lt;/p&gt;

&lt;p&gt;WooCommerce.com solves this with route-specific rules in an early MU-plugin. The MU-plugin filters WordPress’s active plugin list before regular plugin files are included.&lt;/p&gt;

&lt;p&gt;The result is real: excluded plugins do not execute.&lt;/p&gt;

&lt;p&gt;But the filter itself is only the final switch.&lt;/p&gt;

&lt;p&gt;The more interesting question is what had to happen before that switch could be operated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selective plugin loading is not one architecture
&lt;/h2&gt;

&lt;p&gt;Several public WordPress plugins already provide selective plugin loading.&lt;/p&gt;

&lt;p&gt;Plugin Organizer can selectively disable plugins by managed URL or post type and installs an MU component for its early loading mechanism.&lt;/p&gt;

&lt;p&gt;Freesoul Deactivate Plugins supports pages, posts, custom post types, archives, backend pages, devices and custom URLs. Its documentation explicitly states that disabled plugins do not merely lose their assets. Their PHP code does not run for the affected request.&lt;/p&gt;

&lt;p&gt;Plugin Load Filter also installs an MU-plugin component and distinguishes between administrative requests, page types, post types, devices and other WordPress contexts.&lt;/p&gt;

&lt;p&gt;These are genuine PHP execution-control tools.&lt;/p&gt;

&lt;p&gt;They should not be confused with asset managers that merely suppress CSS or JavaScript after the responsible plugin has already loaded.&lt;/p&gt;

&lt;p&gt;But the fact that several solutions eventually influence the same WordPress plugin list does not make their architectures equivalent.&lt;/p&gt;

&lt;p&gt;An MU-plugin may be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the complete selection engine&lt;/li&gt;
&lt;li&gt;a runtime rule interpreter&lt;/li&gt;
&lt;li&gt;a URL and post-type matcher&lt;/li&gt;
&lt;li&gt;or merely the handoff through which WordPress receives a decision prepared elsewhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looking only at the final filter point is like comparing two buildings because both have a light switch.&lt;/p&gt;

&lt;p&gt;The wiring still matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The hidden cost of deciding what not to load&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A WordPress-internal selector can prevent expensive regular plugins from loading. That can easily produce a net performance gain.&lt;/p&gt;

&lt;p&gt;WooCommerce.com has demonstrated exactly that.&lt;/p&gt;

&lt;p&gt;But the selection itself is not free.&lt;/p&gt;

&lt;p&gt;Before an MU-plugin can execute inside &lt;code&gt;wp-settings.php&lt;/code&gt;, a relevant part of the WordPress bootstrap already exists. Configuration has been loaded. Database and object-cache infrastructure have been initialized. Core files and the MU-plugin environment are available. The selector may then read its settings, inspect the request, evaluate route rules and modify the active plugin list.&lt;/p&gt;

&lt;p&gt;This does not necessarily mean there is one dedicated SQL query for &lt;code&gt;active_plugins&lt;/code&gt; on every request. The option may be part of WordPress’s autoloaded options or served through an object-cache layer.&lt;/p&gt;

&lt;p&gt;That distinction is technically important, but it does not remove the architectural cost.&lt;/p&gt;

&lt;p&gt;The WordPress options, database and cache infrastructure must already exist before a WordPress-internal selector can use them. A persistent object cache also requires additional infrastructure. It is not a magical property of every ordinary WordPress installation.&lt;/p&gt;

&lt;p&gt;The useful question is therefore not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Does selective plugin loading save time?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It often does.&lt;/p&gt;

&lt;p&gt;The more revealing question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How much application runtime must exist merely to decide how much application runtime should exist?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A selector can be worthwhile while still paying an avoidable WordPress-internal decision cost.&lt;/p&gt;

&lt;p&gt;Those two statements do not contradict each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  WooCommerce.com chose a pragmatic internal solution
&lt;/h2&gt;

&lt;p&gt;The WooCommerce.com implementation is designed for a large, engineering-owned platform.&lt;/p&gt;

&lt;p&gt;Its rules live in code, pass through review and deployment processes, and are monitored like other performance-sensitive changes. The team deliberately focuses on predictable, high-traffic routes where the expected plugin requirements can be understood and tested.&lt;/p&gt;

&lt;p&gt;The difficult part is not filtering the array.&lt;/p&gt;

&lt;p&gt;The difficult part is determining what a route actually needs.&lt;/p&gt;

&lt;p&gt;WooCommerce Engineering describes dependency discovery as the hard part. Developers inspect route code, follow dependencies, manually exercise request flows, add tests, deploy incrementally and monitor errors and performance data. Stateful or broad requests such as checkout, cart, account, admin, cron, webhooks and payment callbacks require extra caution.&lt;/p&gt;

&lt;p&gt;That makes the solution appropriate for WooCommerce.com.&lt;/p&gt;

&lt;p&gt;It does not automatically make it a generally reusable context engine for arbitrary WordPress installations.&lt;/p&gt;

&lt;p&gt;This is not criticism of the implementation. It is simply the boundary of the selected architecture.&lt;/p&gt;

&lt;p&gt;WooCommerce.com uses a WordPress-controlled environment to decide how much of that environment should load.&lt;/p&gt;

&lt;p&gt;That can work very well when routes are narrow, rules are owned by engineers and failures can be monitored and rolled back.&lt;/p&gt;

&lt;h2&gt;
  
  
  The enforcement point and the decision process are different things
&lt;/h2&gt;

&lt;p&gt;Selective plugin loading contains at least two separate tasks:&lt;/p&gt;

&lt;p&gt;Determine the execution scope required by the request.&lt;br&gt;
Prevent WordPress from loading plugins outside that scope.&lt;/p&gt;

&lt;p&gt;WordPress offers an early point at which the plugin list can be changed.&lt;/p&gt;

&lt;p&gt;That is the enforcement mechanism.&lt;/p&gt;

&lt;p&gt;It does not tell us how the decision was produced.&lt;/p&gt;

&lt;p&gt;A simple implementation may inspect REQUEST_URI and compare it with a list of exact paths, prefixes or patterns. A more advanced WordPress plugin may use page IDs, post types, device classes, backend screens or user-related conditions.&lt;/p&gt;

&lt;p&gt;These approaches can be useful. They can also become increasingly dependent on runtime expressions, duplicated routing knowledge and manually maintained exceptions.&lt;/p&gt;

&lt;p&gt;There is another possible abstraction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request signals
    ↓
Execution context
    ↓
Runtime bucket
    ↓
Prepared plugin scope
    ↓
WordPress loads only that scope
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The distinction is subtle but important.&lt;/p&gt;

&lt;p&gt;A URL rule asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which rule matches this URL?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A runtime bucket asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What kind of application runtime does this request require?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Several URLs, entry points or request variants may belong to the same runtime bucket. Conversely, requests that appear similar at URL level may require different execution scopes.&lt;/p&gt;

&lt;p&gt;The quality of selective loading therefore depends not only on how early plugins are filtered, but also on the resolution and reliability of the context model behind the filter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Post types are useful, but they are not the complete request universe
&lt;/h2&gt;

&lt;p&gt;WordPress-oriented selectors often begin with understandable concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pages&lt;/li&gt;
&lt;li&gt;posts&lt;/li&gt;
&lt;li&gt;custom post types&lt;/li&gt;
&lt;li&gt;archives&lt;/li&gt;
&lt;li&gt;frontend versus backend&lt;/li&gt;
&lt;li&gt;desktop versus mobile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are useful dimensions. They are also only part of the request landscape.&lt;/p&gt;

&lt;p&gt;A modern WordPress installation may also process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST requests&lt;/li&gt;
&lt;li&gt;AJAX actions&lt;/li&gt;
&lt;li&gt;cron requests&lt;/li&gt;
&lt;li&gt;login and account flows&lt;/li&gt;
&lt;li&gt;administrative screens&lt;/li&gt;
&lt;li&gt;webhooks&lt;/li&gt;
&lt;li&gt;payment callbacks&lt;/li&gt;
&lt;li&gt;feeds&lt;/li&gt;
&lt;li&gt;internal tools&lt;/li&gt;
&lt;li&gt;crawler requests&lt;/li&gt;
&lt;li&gt;cache-related operations&lt;/li&gt;
&lt;li&gt;application-specific endpoints.
Treating the whole WordPress backend as one indivisible runtime is safe, but often unnecessarily broad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Likewise, treating every custom URL as an expression that must be interpreted during the request can create its own maintenance and execution overhead.&lt;/p&gt;

&lt;p&gt;A more differentiated execution model can map requests into prepared runtime contexts instead of constructing a growing condition language around individual URLs.&lt;/p&gt;

&lt;p&gt;This does not make URL-based selection obsolete.&lt;/p&gt;

&lt;p&gt;A URL can be an excellent signal.&lt;/p&gt;

&lt;p&gt;The question is whether the URL is evaluated as an isolated runtime rule, or used as one input into an already prepared execution context.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MU-plugin does not equalize the solutions
&lt;/h2&gt;

&lt;p&gt;This point is easy to miss.&lt;/p&gt;

&lt;p&gt;If two systems both contain an MU-plugin, it is tempting to classify them as variations of the same technique.&lt;/p&gt;

&lt;p&gt;That conclusion is too quick.&lt;/p&gt;

&lt;p&gt;In one system, the MU-plugin may perform nearly everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WordPress starts
    ↓
MU-plugin loads
    ↓
settings are retrieved
    ↓
URL and context rules are evaluated
    ↓
active plugin list is filtered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In another system, the MU component may have a much narrower role:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;request context and execution scope are prepared
    ↓
WordPress reaches the early handoff
    ↓
MU component applies the prepared scope
    ↓
regular plugins load
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MU component in the second model is not the context engine.&lt;/p&gt;

&lt;p&gt;It is the bridge into WordPress.&lt;/p&gt;

&lt;p&gt;The shared enforcement point does not erase the difference between the decision paths that reached it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where WP-Rush fits
&lt;/h2&gt;

&lt;p&gt;For transparency: I am the developer of WP-Rush.&lt;/p&gt;

&lt;p&gt;WP-Rush was created because I did not want WordPress to perform most of the work required to decide how much WordPress should run.&lt;/p&gt;

&lt;p&gt;It uses a staged, request-aware execution model. The required execution scope is completed before regular plugins are loaded. WordPress then continues normally inside that selected scope.&lt;/p&gt;

&lt;p&gt;The public architectural contract is deliberately clearer than the internal implementation details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request processing begins before the regular plugin-loading phase&lt;/li&gt;
&lt;li&gt;the MU component is an early WordPress handoff, not the complete selection engine&lt;/li&gt;
&lt;li&gt;the execution scope is prepared before regular plugins initialize&lt;/li&gt;
&lt;li&gt;plugins outside that scope do not execute for the request&lt;/li&gt;
&lt;li&gt;uncertain or sensitive contexts can retain a broader or complete runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WP-Rush organizes requests through runtime buckets rather than relying only on WordPress post types or individual page rules.&lt;/p&gt;

&lt;p&gt;A bucket represents an execution context.&lt;/p&gt;

&lt;p&gt;Different public requests may share one bucket. Administrative requests can be separated into more specific runtime classes instead of treating the entire backend as one block. Asynchronous and other non-document requests can receive their own scopes.&lt;/p&gt;

&lt;p&gt;WP-Rush also provides a URL-oriented mode, but the URL mode does not require users to build a runtime expression language. URLs can be associated with prepared execution contexts rather than repeatedly interpreted through chains of conditions during every request.&lt;/p&gt;

&lt;p&gt;The point is not that URL selection is bad.&lt;/p&gt;

&lt;p&gt;The point is that URL selection does not have to mean runtime expression processing inside WordPress.&lt;/p&gt;

&lt;p&gt;The internal preparation, classification and safety mechanisms remain product implementation details. Publishing every internal step would turn an architectural explanation into a reconstruction guide.&lt;/p&gt;

&lt;p&gt;A reader can still evaluate the public system boundary:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When does context processing begin?&lt;/p&gt;

&lt;p&gt;When is the scope complete?&lt;/p&gt;

&lt;p&gt;What code is prevented from executing?&lt;/p&gt;

&lt;p&gt;What happens when the context is uncertain?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are legitimate architectural questions even when the proprietary implementation is not published line by line.&lt;/p&gt;

&lt;p&gt;WP-Rush describes itself as a request-aware execution layer that reduces the plugin runtime created for a request before normal plugin execution begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about server-level classification?
&lt;/h2&gt;

&lt;p&gt;Some infrastructure-owned systems move request classification even further toward the web server, reverse proxy or hosting layer.&lt;/p&gt;

&lt;p&gt;That is a legitimate architecture class.&lt;/p&gt;

&lt;p&gt;It may also require privileged access to Nginx, PHP pool settings or custom hosting infrastructure that ordinary WordPress installations do not provide. The discussion below the WooCommerce Engineering article itself notes that rules can exist outside the MU-plugin path, but that such approaches require deeper server access and infrastructure control.&lt;/p&gt;

&lt;p&gt;Earlier is not automatically better.&lt;/p&gt;

&lt;p&gt;A very early classifier with poor context may be less useful than a slightly later classifier with reliable information.&lt;/p&gt;

&lt;p&gt;The relevant comparison remains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;selection cost&lt;/li&gt;
&lt;li&gt;context quality&lt;/li&gt;
&lt;li&gt;scope granularity&lt;/li&gt;
&lt;li&gt;maintenance effort&lt;/li&gt;
&lt;li&gt;deployment requirements&lt;/li&gt;
&lt;li&gt;and safe fallback behaviour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without enough public technical detail, naming individual proprietary infrastructure systems would turn this article into speculation. The architectural class is worth acknowledging even when particular products cannot yet be compared fairly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five questions worth asking any selective-loading solution
&lt;/h2&gt;

&lt;p&gt;When two tools both claim to “load only the plugins that are needed,” ask more than whether they filter &lt;code&gt;active_plugins&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. How much WordPress runs before the decision exists?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Does the selector require WordPress’s database, options, object cache and its own plugin runtime before it can classify the request?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Where does the context model come from?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Is the decision based on runtime URL expressions, WordPress post types, hard-coded route rules, prepared contexts or another classification layer?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. How granular is the execution model?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can it distinguish only pages and post types, or also administrative, asynchronous, API and other request classes?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. What happens when the request is ambiguous?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Does the system guess aggressively, fail closed, or fall back to a broader safe runtime?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Is the MU component the engine or merely the handoff?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer can reveal more about the architecture than the presence of the MU-plugin itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same goal, different selection cost
&lt;/h2&gt;

&lt;p&gt;WooCommerce.com has done WordPress performance work a favour.&lt;/p&gt;

&lt;p&gt;Its Engineering article confirms three important facts:&lt;/p&gt;

&lt;p&gt;Global plugin loading can create substantial request overhead.&lt;br&gt;
Preventing unnecessary plugin execution can produce measurable improvements.&lt;br&gt;
Safely determining the required plugin scope is harder than filtering the plugin list.&lt;/p&gt;

&lt;p&gt;WooCommerce.com solves that problem with route-owned rules inside a controlled engineering environment.&lt;/p&gt;

&lt;p&gt;Plugin Organizer, Freesoul Deactivate Plugins and Plugin Load Filter provide generally available WordPress interfaces for related forms of selective plugin loading.&lt;/p&gt;

&lt;p&gt;Infrastructure-level systems may move parts of classification toward the server.&lt;/p&gt;

&lt;p&gt;WP-Rush uses a request-aware context and bucket model in which its MU component is primarily the early handoff into WordPress, not the whole decision engine.&lt;/p&gt;

&lt;p&gt;These approaches share a goal.&lt;/p&gt;

&lt;p&gt;They do not share the same selection cost, context model, granularity or operational architecture.&lt;/p&gt;

&lt;p&gt;Selective plugin loading should therefore not be compared only by asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can it remove a plugin from the final list?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How much had to run, and how much had to be known, before that list could be produced?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The final filter point is only half of the architecture.&lt;/p&gt;

&lt;p&gt;Sources: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.woocommerce.com/2026/07/21/selective-plugin-loading/" rel="noopener noreferrer"&gt;https://developer.woocommerce.com/2026/07/21/selective-plugin-loading/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/rushdev/why-wordpress-optimization-often-starts-too-late-2499"&gt;https://dev.to/rushdev/why-wordpress-optimization-often-starts-too-late-2499&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/rushdev/wordpress-optimization-has-an-architectural-blind-spot-p1e"&gt;https://dev.to/rushdev/wordpress-optimization-has-an-architectural-blind-spot-p1e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wp-rush.com" rel="noopener noreferrer"&gt;https://www.wp-rush.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>performance</category>
      <category>php</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>Why WordPress Optimization Often Starts Too Late</title>
      <dc:creator>Andy Kirchbühler</dc:creator>
      <pubDate>Thu, 12 Mar 2026 12:11:31 +0000</pubDate>
      <link>https://dev.to/rushdev/why-wordpress-optimization-often-starts-too-late-2499</link>
      <guid>https://dev.to/rushdev/why-wordpress-optimization-often-starts-too-late-2499</guid>
      <description>&lt;p&gt;Most WordPress optimization starts after the system has already done too much work.&lt;/p&gt;

&lt;p&gt;That is the blind spot.&lt;/p&gt;

&lt;p&gt;We optimize images, defer scripts, enable caching, clean databases, remove CSS, reduce plugin count, and chase better Lighthouse scores - all useful things. But very often, we do all of that without asking a more basic question first:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is WordPress doing this much work for this request at all?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question matters because many WordPress performance problems do not begin at the output layer. They begin earlier, at the execution layer.&lt;/p&gt;

&lt;p&gt;And if the system is already doing unnecessary work before the response is even ready, then a lot of optimization advice starts too late.&lt;/p&gt;

&lt;h2&gt;
  
  
  The usual optimization path
&lt;/h2&gt;

&lt;p&gt;When a WordPress site feels slow, the response pattern is familiar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enable page caching&lt;/li&gt;
&lt;li&gt;optimize images&lt;/li&gt;
&lt;li&gt;defer JavaScript&lt;/li&gt;
&lt;li&gt;minify CSS&lt;/li&gt;
&lt;li&gt;remove unused plugins&lt;/li&gt;
&lt;li&gt;add a CDN&lt;/li&gt;
&lt;li&gt;improve Core Web Vitals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is wrong.&lt;/p&gt;

&lt;p&gt;The problem is not that these steps are useless. The problem is that they usually focus on making an existing workload cheaper, not on questioning whether that workload should exist in the first place.&lt;/p&gt;

&lt;p&gt;That is a big difference.&lt;/p&gt;

&lt;p&gt;Because a system can be "optimized" and still be structurally wasteful.&lt;/p&gt;

&lt;h2&gt;
  
  
  WordPress often executes broadly, not selectively
&lt;/h2&gt;

&lt;p&gt;This is where WordPress becomes interesting.&lt;/p&gt;

&lt;p&gt;A typical request in WordPress does not begin with strong selectivity. It often begins with broad availability. Themes, plugins, hooks, builders, commerce logic, helper layers, integrations, marketing additions, and general-purpose code can all become part of the request path before the system has seriously justified why this specific URL needs them.&lt;/p&gt;

&lt;p&gt;That is the architectural blind spot.&lt;/p&gt;

&lt;p&gt;The system behaves as if every request deserves access to most of the machinery, and only later do we try to reduce the cost of that decision.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress performance is often treated as an optimization problem when it is partly an execution scope problem.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple example
&lt;/h2&gt;

&lt;p&gt;Imagine a site that uses WooCommerce, a page builder, analytics plugins, form plugins, search helpers, and several utility plugins.&lt;/p&gt;

&lt;p&gt;Now imagine a request for a very simple informational page.&lt;/p&gt;

&lt;p&gt;From a human point of view, that page may only need a fraction of the site's total functionality. But from WordPress's point of view, the request may still pass through a large amount of generalized code because the system is designed around broad plugin availability and shared hooks.&lt;/p&gt;

&lt;p&gt;So what happens?&lt;/p&gt;

&lt;p&gt;The request becomes expensive before frontend optimization even begins.&lt;/p&gt;

&lt;p&gt;At that point, image optimization, asset minification, and caching may still help - but they are helping after the system has already accepted too much execution as normal.&lt;/p&gt;

&lt;p&gt;That is why some optimization wins feel real but incomplete. The page gets lighter, but the request model remains permissive.&lt;/p&gt;

&lt;p&gt;Output optimization is not the same as execution reduction&lt;/p&gt;

&lt;p&gt;This distinction is easy to miss.&lt;/p&gt;

&lt;p&gt;A lot of WordPress performance work is really output optimization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;smaller files&lt;/li&gt;
&lt;li&gt;fewer requests&lt;/li&gt;
&lt;li&gt;delayed scripts&lt;/li&gt;
&lt;li&gt;cached responses&lt;/li&gt;
&lt;li&gt;compressed assets&lt;/li&gt;
&lt;li&gt;better delivery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, all useful.&lt;/p&gt;

&lt;p&gt;But none of this necessarily reduces how much WordPress had to execute to produce the response in the first place.&lt;/p&gt;

&lt;p&gt;That is a different category of problem.&lt;/p&gt;

&lt;p&gt;You can improve delivery without improving selectivity.&lt;br&gt;
You can improve rendering without improving execution scope.&lt;br&gt;
You can improve scores without questioning workload generation.&lt;/p&gt;

&lt;p&gt;And that is often where WordPress performance advice becomes misleading.&lt;/p&gt;

&lt;p&gt;It creates the impression that performance is mainly about polishing output, when in many cases a large part of the problem begins earlier: the system is simply doing too much for the request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why caching does not solve the underlying issue
&lt;/h2&gt;

&lt;p&gt;Caching is probably the most important example here.&lt;/p&gt;

&lt;p&gt;Page caching is useful because it avoids repeating the same expensive work on every request. That is valuable. On busy sites, it can make a dramatic difference.&lt;/p&gt;

&lt;p&gt;But caching does not answer the deeper architectural question. It does not ask whether the uncached request path is justified. It only makes repeated use of that path less costly.&lt;/p&gt;

&lt;p&gt;So caching should be understood for what it is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a powerful amortization layer, not a cure for excessive execution scope.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is why a site can appear "fast enough" under cache while still having an unnecessarily heavy uncached request model underneath. And that matters whenever cache is bypassed, missed, invalidated, varied, or simply unavailable in certain contexts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The earlier performance question
&lt;/h2&gt;

&lt;p&gt;Before tuning output, it is worth asking a more structural set of questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why is this code running on this request?&lt;/li&gt;
&lt;li&gt;Why is this plugin active in this context?&lt;/li&gt;
&lt;li&gt;Why is this subsystem loaded here?&lt;/li&gt;
&lt;li&gt;Why is this query executed for this URL?&lt;/li&gt;
&lt;li&gt;Why does this request get the full machinery?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not classic optimization questions. They are architecture and execution questions.&lt;/p&gt;

&lt;p&gt;And they often lead to a different kind of performance thinking:&lt;/p&gt;

&lt;p&gt;not just &lt;strong&gt;"How do we make this faster?"&lt;/strong&gt;&lt;br&gt;
but also&lt;br&gt;
&lt;strong&gt;"How do we stop irrelevant work from happening here at all?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That shift matters.&lt;/p&gt;

&lt;p&gt;Because once you start thinking in terms of workload prevention instead of workload polishing, the whole diagnosis changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this changes in practice
&lt;/h2&gt;

&lt;p&gt;This does not mean developers should stop optimizing assets, caching, or frontend behavior.&lt;/p&gt;

&lt;p&gt;It means those things should not be the only lens.&lt;/p&gt;

&lt;p&gt;A more complete approach to WordPress performance starts by separating two concerns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. How much work is WordPress doing for this request?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2. How efficiently is the result delivered once that work is done?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most optimization discussions begin with question 2.&lt;/p&gt;

&lt;p&gt;But in many cases, question 1 deserves to come first.&lt;/p&gt;

&lt;p&gt;That changes how you inspect a slow site. Instead of only asking which assets are too large or which scores are too low, you also ask whether the request path itself is overloaded by unnecessary global behavior.&lt;/p&gt;

&lt;p&gt;That is a very different mindset.&lt;/p&gt;

&lt;p&gt;And in WordPress, it is often the more important one.&lt;/p&gt;

&lt;h2&gt;
  
  
  A better mental model
&lt;/h2&gt;

&lt;p&gt;A useful way to think about this is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimization improves the cost of work&lt;/li&gt;
&lt;li&gt;Prevention improves the necessity of work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both matter.&lt;/p&gt;

&lt;p&gt;But necessity comes first.&lt;/p&gt;

&lt;p&gt;Because if the system is generating avoidable work, then improving the cost of that work is only part of the answer. The cleaner answer is to reduce or prevent the irrelevant execution before it spreads through the request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Most WordPress optimization starts too late because it begins after the system has already accepted too much execution as normal.&lt;/p&gt;

&lt;p&gt;That is the architectural blind spot.&lt;/p&gt;

&lt;p&gt;The usual tools - caching, minification, image optimization, CDN delivery, script deferral - are still useful. But they often work downstream of the more important question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is WordPress doing this much work for this request at all?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the question more developers should ask earlier.&lt;/p&gt;

&lt;p&gt;Because better performance is not only about delivering the result more efficiently.&lt;/p&gt;

&lt;p&gt;It is also about preventing unnecessary execution before it becomes a result that needs optimization in the first place.&lt;/p&gt;

&lt;p&gt;That is why "WordPress optimization" is sometimes too narrow a phrase.&lt;/p&gt;

&lt;p&gt;In many cases, the real issue is not just optimization. It is workload governance.&lt;/p&gt;

&lt;p&gt;Learn more about the consequences of starting Page Optimization too late and how to solve this serious problem: &lt;a href="https://www.wp-rush.com" rel="noopener noreferrer"&gt;https://www.wp-rush.com&lt;/a&gt; "WP-Rush - WordPress Performance by Prevention"&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>performance</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>WordPress Optimization Has an Architectural Blind Spot</title>
      <dc:creator>Andy Kirchbühler</dc:creator>
      <pubDate>Thu, 26 Feb 2026 09:44:35 +0000</pubDate>
      <link>https://dev.to/rushdev/wordpress-optimization-has-an-architectural-blind-spot-p1e</link>
      <guid>https://dev.to/rushdev/wordpress-optimization-has-an-architectural-blind-spot-p1e</guid>
      <description>&lt;p&gt;Most WordPress performance discussions focus on compression, caching, asset minification, and render timing. These techniques are effective — but they operate at the end of the request lifecycle.&lt;/p&gt;

&lt;p&gt;There’s a structural layer that often goes unexamined. And it sits at the very beginning of every request.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Boot Sequence Nobody Talks About&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before a single template is rendered, before output buffering begins, WordPress performs a full bootstrap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core loads&lt;/li&gt;
&lt;li&gt;All active plugins are included&lt;/li&gt;
&lt;li&gt;Hooks are registered&lt;/li&gt;
&lt;li&gt;Classes are instantiated&lt;/li&gt;
&lt;li&gt;Conditional logic is wired&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This happens before WordPress fully resolves what the request actually needs. In other words: execution scope is determined globally, not contextually.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Context-Blind Initialization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During &lt;code&gt;plugins_loaded&lt;/code&gt;, WordPress iterates over every active plugin.&lt;/p&gt;

&lt;p&gt;That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;eCommerce logic on non-commerce pages&lt;/li&gt;
&lt;li&gt;Membership frameworks on public landing pages&lt;/li&gt;
&lt;li&gt;Slider libraries on pages without sliders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if those plugins later decide not to output anything, their initialization cost has already been paid.&lt;/p&gt;

&lt;p&gt;This is not a bug. It’s an architectural characteristic.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Output Optimization vs Execution Scope&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most optimization plugins intervene late:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minifying assets&lt;/li&gt;
&lt;li&gt;Deferring scripts&lt;/li&gt;
&lt;li&gt;Manipulating output buffers&lt;/li&gt;
&lt;li&gt;Rewriting HTML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These improve delivery efficiency. But they do not reduce execution scope.&lt;/p&gt;

&lt;p&gt;There’s a distinction between:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reducing the size or timing of the response&lt;/li&gt;
&lt;li&gt;Reducing the amount of code that runs to generate that response&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both affect perceived performance. Only one affects server workload at its root.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rzalhy1vuet18a4v2o7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rzalhy1vuet18a4v2o7.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Caching Is Not the Same Thing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Page caching improves performance dramatically. But it amortizes work — it does not eliminate the underlying execution path.&lt;/p&gt;

&lt;p&gt;At some point, the full stack executed. If uncached requests are significantly slower, that gap reveals the actual execution cost.&lt;/p&gt;

&lt;p&gt;Caching reduces frequency of work. It does not redefine necessary work.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Architectural Question&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What if performance discussions separated these layers explicitly?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delivery optimization&lt;/li&gt;
&lt;li&gt;Execution scope control&lt;/li&gt;
&lt;li&gt;Work avoidance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of treating all three as variations of the same concept. If a system loads everything for every request, optimization will always be reactive. If execution scope is context-aware early in the request lifecycle, optimization becomes preventive.&lt;/p&gt;

&lt;p&gt;That’s not ideology. It’s a difference in intervention timing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;A Shift in Framing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How do we optimize what runs?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We might ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why does it run in the first place?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That single question changes the entire performance conversation. And it’s surprisingly absent from most WordPress optimization debates.&lt;/p&gt;

&lt;p&gt;WordPress Performance by Prevention: &lt;a href="https://www.wp-rush.com/" rel="noopener noreferrer"&gt;https://www.wp-rush.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
