{"id":"crzg3rjby3xum3y","title":"WordPress Plugin Tax: Performance Debt I Remove First","slug":"wordpress-plugin-performance-tax","summary":"Every plugin is PHP, SQL, CSS, and JS on every request until proven otherwise. I audit active plugins like credit card statements.","imageUrl":"https://briancrabtree.me/images/journal-wordpress-plugin-performance-tax.webp","category":"Backend","date":"2026-02-23T18:00:00.000Z","featured":false,"likes":33,"author":"Brian Crabtree","content":"<h2>Plugins are features plus liability</h2>\n\n<p>Page builders, sliders, related posts, and social feeds each enqueue assets globally even when shortcodes appear on one page. I list active plugins and ask what breaks if we deactivate on staging. Surprises are common.</p>\n\n<p>Premium plugins add database options bloat and autoloaded rows that slow every admin and front request. I grep autoload=yes in wp_options and trim.</p>\n\n<p>Object cache without persistent backend only helps within one request lifecycle on some hosts. I verify Redis or Memcached is actually wired before celebrating plugin install.</p>\n\n<pre><code>// Audit: deactivate plugins one-by-one, measure TBT on homepage\n// Headless WP removes plugin front-end CSS/JS from public HTML</code></pre>\n\n<h2>Query monitor is non-negotiable</h2>\n\n<p>Query Monitor plugin on staging shows slow queries, duplicate hooks, and HTTP API calls during render. I fix N+1 meta queries before debating CDN tiers. Object caching helps but does not excuse fifty queries per post.</p>\n\n<p>Cron sprawl from plugins scheduling hourly remote checks adds background load. I consolidate real cron on the server and disable wp-cron traffic on public requests where possible.</p>\n\n<p>Admin bar on front for logged-in editors skews PSI when executives test while logged in. I test logged out or use role plugin to disable bar on front.</p>\n\n<h2>Asset dequeue strategies</h2>\n\n<p>Conditional wp_dequeue_style and script on templates that do not need slider JS. Block themes simplify some paths; classic themes need explicit guards. I never dequeue jQuery on admin; on front, often yes if nothing real depends on it.</p>\n\n<p>Combine is tempting; HTTP/2 reduced the win from concatenation monsters. I prefer fewer files via fewer plugins over giant bundles that break cache on any change.</p>\n\n<p>Transients cleanup plugins exist because transients became garbage. Fix source plugins instead of eternal cleanup cron wars.</p>\n\n<h2>Caching layers honestly</h2>\n\n<p>Full-page cache plugins help anonymous traffic. Logged-in WooCommerce carts still hit PHP. I separate marketing pages that can cache aggressively from dynamic routes that need edge bypass rules.</p>\n\n<p>Image optimization plugins help when they do not regenerate thumbnails on every request. Offload to build-time WebP like any modern stack.</p>\n\n<p>Gutenberg block themes reduce some classic enqueue chaos but blocks can still import unnecessary view scripts. I audit block-level asset registration.</p>\n\n<h2>Security and performance overlap</h2>\n\n<p>Firewall plugins scan bodies and add latency. Necessary sometimes, but I whitelist admin IPs and tune rules. Outdated plugins are both CVEs and dead weight; I update on schedule or remove.</p>\n\n<p>Disable XML-RPC if unused. Close REST user enumeration if not needed. Small hardening cuts noise and attack surface.</p>\n\n<p>Staging plugin parity with prod matters. Deactivating on staging then activating only in prod causes surprise launch day weight.</p>\n\n<h2>Migration off WordPress without fantasy</h2>\n\n<p>Some clients need headless WordPress as CMS only with Next front. Others need static export for marketing while shop stays WP. I scope hybrid instead of big-bang rewrite when plugins are the pain but content workflow is fine.</p>\n\n<p>I document a plugin allowlist in README with owner email per plugin. Renewal of annual licenses gets assigned, not forgotten.</p>\n\n<p>When I audit backend stacks, Migration off WordPress without fantasy is where hours disappear if nobody owns the outcome. I write before-and-after notes, attach PSI or waterfall screenshots, and leave the team a three-item follow-up list. Reproducible wins beat toolchain debates in sprint review. If this section matches your bottleneck, send the URL and whether LCP, INP, CLS, or crawl coverage is the pain point.</p>\n\n<h2>What I need from you</h2>\n\n<p>Export active plugin list and staging URL. I will return a keep, replace, delete table with expected Lighthouse delta. WordPress can be fast; plugin sprawl is usually why it is not.</p>\n\n<p>Headless WP still runs PHP for editors. Performance win is front CDN, not zero backend discipline.</p>\n\n<p>When I audit backend stacks, What I need from you is where hours disappear if nobody owns the outcome. I write before-and-after notes, attach PSI or waterfall screenshots, and leave the team a three-item follow-up list. Reproducible wins beat toolchain debates in sprint review. If this section matches your bottleneck, send the URL and whether LCP, INP, CLS, or crawl coverage is the pain point. For a related angle I keep coming back to, see <a href=\"/journal/headless-wordpress-when-plugins-become-product/\">Headless WordPress When Plugins Become the Product</a>.</p>","tags":["wordpress","plugins","performance"],"views":87}