<?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>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>
