<?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: WP Multitool</title>
    <description>The latest articles on DEV Community by WP Multitool (@wpmultitool).</description>
    <link>https://dev.to/wpmultitool</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3789072%2Fc09bc813-ee4e-48e4-87c1-f277e9f2aacf.png</url>
      <title>DEV Community: WP Multitool</title>
      <link>https://dev.to/wpmultitool</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wpmultitool"/>
    <language>en</language>
    <item>
      <title>Do You Really Need 6 WordPress Plugins for Performance?</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:40:50 +0000</pubDate>
      <link>https://dev.to/wpmultitool/do-you-really-need-6-wordpress-plugins-for-performance-4l55</link>
      <guid>https://dev.to/wpmultitool/do-you-really-need-6-wordpress-plugins-for-performance-4l55</guid>
      <description>&lt;p&gt;I counted the plugins on a client's site last month. Six of them existed purely to help manage WordPress itself. Not to add features. Not to serve visitors. Just... maintenance tools.&lt;/p&gt;

&lt;p&gt;Query Monitor for debugging. WP-Optimize for database cleanup. Health Check for troubleshooting. WP Config File Editor for constants. Asset CleanUp for frontend bloat. And WP-CLI commands scattered across five different terminal windows.&lt;/p&gt;

&lt;p&gt;Six plugins. Six update cycles. Six potential conflicts. Six sets of admin pages cluttering the sidebar. All doing things that should probably be one tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Plugin Stack Problem
&lt;/h2&gt;

&lt;p&gt;Every plugin you install adds weight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory overhead&lt;/strong&gt; - each plugin loads its PHP files on every request, even if you only use it once a week&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autoload bloat&lt;/strong&gt; - many plugins store options with &lt;code&gt;autoload = yes&lt;/code&gt;, meaning they load on every single page request even when inactive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update fatigue&lt;/strong&gt; - six plugins means six update notifications, six changelogs to read, six chances for a breaking change&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conflict risk&lt;/strong&gt; - more plugins means more hooks, more filters, more chances of stepping on each other&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't theoretical. On one client's site, the debugging and optimization plugins together were using several megabytes of extra memory per request. The tools meant to find performance problems were adding to the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Six-Plugin Stack (And What Each Does)
&lt;/h2&gt;

&lt;p&gt;Here's the typical WordPress maintenance stack and what each plugin handles:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Query Monitor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Shows database queries, PHP errors, hooks, HTTP calls, template hierarchy on the current page.&lt;br&gt;
&lt;strong&gt;Why you install it:&lt;/strong&gt; Something is slow and you need to figure out what.&lt;br&gt;
&lt;strong&gt;The gap:&lt;/strong&gt; No persistent logging. No production monitoring. No fix suggestions. You close the tab, the data is gone.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. WP-Optimize
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Database cleanup (revisions, transients, orphaned data), image compression, basic caching.&lt;br&gt;
&lt;strong&gt;Why you install it:&lt;/strong&gt; The database has 50,000 post revisions and someone told you to clean them.&lt;br&gt;
&lt;strong&gt;The gap:&lt;/strong&gt; Doesn't tell you which queries are slow. Doesn't touch autoload settings. Cleanup without diagnosis.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Health Check &amp;amp; Troubleshooting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; System info, troubleshooting mode that disables plugins/themes for your session only while other visitors see the normal site.&lt;br&gt;
&lt;strong&gt;Why you install it:&lt;/strong&gt; You need to figure out which plugin is causing a conflict without taking the site down.&lt;br&gt;
&lt;strong&gt;The gap:&lt;/strong&gt; The troubleshooting mode is genuinely clever. But outside of conflict diagnosis, it sits there doing nothing. You use it twice a year.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. WP Config File Editor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; GUI for editing wp-config.php constants (WP_DEBUG, memory limits, etc.)&lt;br&gt;
&lt;strong&gt;Why you install it:&lt;/strong&gt; Because editing wp-config.php via SSH/FTP is annoying and error-prone.&lt;br&gt;
&lt;strong&gt;The gap:&lt;/strong&gt; A narrow tool for a narrow job. Works, but it's one more plugin in the pile.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Asset CleanUp (Perfmatters, etc.)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Removes unnecessary scripts and styles from pages, defers JavaScript, disables features like emojis and dashicons.&lt;br&gt;
&lt;strong&gt;Why you install it:&lt;/strong&gt; PageSpeed Insights told you to "eliminate render-blocking resources."&lt;br&gt;
&lt;strong&gt;The gap:&lt;/strong&gt; The free version handles per-page script unloading well. But site-wide rules, more granular control, and advanced features are premium ($49+).&lt;/p&gt;

&lt;h3&gt;
  
  
  6. WP-CLI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Command-line interface for WordPress management.&lt;br&gt;
&lt;strong&gt;Why you use it:&lt;/strong&gt; Database queries, cache management, cron jobs, bulk operations.&lt;br&gt;
&lt;strong&gt;The gap:&lt;/strong&gt; Not a plugin, but part of the stack. Requires SSH access and command-line knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total: 5 plugins + 1 CLI tool.&lt;/strong&gt; Each one loading its own PHP files, hooks, and options on every request.&lt;/p&gt;

&lt;h2&gt;
  
  
  The One-Plugin Alternative
&lt;/h2&gt;

&lt;p&gt;Here's how WP Multitool's 14 modules map to each of these tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your Current Plugin&lt;/th&gt;
&lt;th&gt;WP Multitool Module&lt;/th&gt;
&lt;th&gt;What Changes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Query Monitor&lt;/td&gt;
&lt;td&gt;Slow Query Analyzer + Find Slow Callbacks&lt;/td&gt;
&lt;td&gt;Persistent logging, EXPLAIN analysis, production-safe monitoring. Still use QM for quick debugging - they complement each other.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WP-Optimize&lt;/td&gt;
&lt;td&gt;Database Optimizer + Autoloader Optimizer&lt;/td&gt;
&lt;td&gt;Same cleanup, plus autoload optimization that WP-Optimize doesn't touch. No image compression or caching (use a dedicated caching plugin).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health Check&lt;/td&gt;
&lt;td&gt;System Info + Plugin Reactivator&lt;/td&gt;
&lt;td&gt;Server diagnostics + one-click plugin reactivation for troubleshooting.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WP Config File Editor&lt;/td&gt;
&lt;td&gt;Config Manager&lt;/td&gt;
&lt;td&gt;Edit wp-config.php constants from admin. Backup before changes. Actively maintained.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asset CleanUp&lt;/td&gt;
&lt;td&gt;Frontend Optimizer&lt;/td&gt;
&lt;td&gt;Defer scripts, remove jQuery Migrate, disable dashicons/emojis, clean head. The 80% of Asset CleanUp you actually use.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WP-CLI (for performance)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;wp multitool&lt;/code&gt; CLI commands&lt;/td&gt;
&lt;td&gt;7 subcommands: status, health, db-health, autoload, slow-queries, frontend, clean.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Plus 6 modules that none of those plugins offer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://wpmultitool.com/blog/plugin-performance-score/" rel="noopener noreferrer"&gt;Plugin Performance Score&lt;/a&gt;&lt;/strong&gt; - benchmark scores for every installed plugin, right on the Plugins page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Manager&lt;/strong&gt; - manage and remove unused image sizes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shortcode Inspector&lt;/strong&gt; - find and test every registered shortcode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick Updater&lt;/strong&gt; - drag-drop plugin updates from ZIP files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Package Downloader&lt;/strong&gt; - download any installed plugin/theme as ZIP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard Widget Manager&lt;/strong&gt; - control what shows on the admin dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Math
&lt;/h2&gt;

&lt;p&gt;Let's do the honest calculation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;6-Plugin Stack&lt;/th&gt;
&lt;th&gt;WP Multitool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Plugins to maintain&lt;/td&gt;
&lt;td&gt;5-6&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admin menu items&lt;/td&gt;
&lt;td&gt;5-8&lt;/td&gt;
&lt;td&gt;1 (with subpages)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update notifications&lt;/td&gt;
&lt;td&gt;5-6/month&lt;/td&gt;
&lt;td&gt;1/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Combined cost&lt;/td&gt;
&lt;td&gt;$0-$250+ (if using premium versions)&lt;/td&gt;
&lt;td&gt;$199/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conflict risk&lt;/td&gt;
&lt;td&gt;Moderate (overlapping hooks)&lt;/td&gt;
&lt;td&gt;None (one codebase)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modules you can disable&lt;/td&gt;
&lt;td&gt;Sometimes&lt;/td&gt;
&lt;td&gt;Always (enable only what you need)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The cost comparison depends on your stack. If you're using all free versions, WP Multitool costs more. If you're paying for Asset CleanUp Pro and WP-Optimize Premium (starting at $49/year each), the math is closer to even - and you get significantly more functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Lose
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend WP Multitool replaces everything perfectly. Here's what you'd miss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Query Monitor's breadth&lt;/strong&gt; - QM shows hooks, template hierarchy, conditionals, HTTP calls. WP Multitool focuses on query and callback performance. I still recommend keeping QM installed for deep debugging sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WP-Optimize's image compression&lt;/strong&gt; - WP Multitool doesn't compress images. Use ShortPixel, Imagify, or similar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WP-Optimize's page caching&lt;/strong&gt; - WP Multitool doesn't cache. Use WP Super Cache, W3 Total Cache, or your host's caching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health Check's troubleshooting mode&lt;/strong&gt; - The "enable safe mode for your session" feature is unique to Health Check. WP Multitool's Reactivator is simpler.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So realistically, you might go from 6 tools to 3: WP Multitool + a caching plugin + QM for the occasional deep dive. That's still cutting your maintenance stack in half.&lt;/p&gt;

&lt;h2&gt;
  
  
  When This Makes Sense
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;This consolidation makes sense if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You manage multiple WordPress sites and want fewer plugins to track&lt;/li&gt;
&lt;li&gt;You're hitting memory limits and need to reduce plugin overhead&lt;/li&gt;
&lt;li&gt;You want &lt;a href="https://wpmultitool.com/blog/wp-options-autoload-trap/" rel="noopener noreferrer"&gt;autoload optimization&lt;/a&gt; and slow query detection that none of the free plugins offer&lt;/li&gt;
&lt;li&gt;You're tired of 6 different admin interfaces for related tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stick with the individual plugins if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You only need one specific feature (just cleanup? WP-Optimize is fine)&lt;/li&gt;
&lt;li&gt;Budget is zero (most of the 6-plugin stack is free)&lt;/li&gt;
&lt;li&gt;You have a workflow that works and change isn't worth the disruption&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;The full module list with documentation is at &lt;a href="https://wpmultitool.com" rel="noopener noreferrer"&gt;wpmultitool.com&lt;/a&gt;. Every module can be enabled or disabled independently - you don't have to use all 14.&lt;/p&gt;

&lt;p&gt;Use code &lt;strong&gt;startups2026&lt;/strong&gt; for 10% off if any of this resonated.&lt;/p&gt;

&lt;p&gt;And if you want to read more about &lt;a href="https://wpmultitool.com/blog/why-caching-plugins-dont-fix-slow-wordpress/" rel="noopener noreferrer"&gt;why caching plugins don't fix slow sites&lt;/a&gt; or &lt;a href="https://wpmultitool.com/blog/how-to-read-mysql-explain-wordpress/" rel="noopener noreferrer"&gt;how to read a MySQL EXPLAIN plan&lt;/a&gt; - those are the rabbit holes that led me to build this thing in the first place.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://wpmultitool.com/blog/do-you-need-6-wordpress-plugins/" rel="noopener noreferrer"&gt;https://wpmultitool.com/blog/do-you-need-6-wordpress-plugins/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>performance</category>
      <category>plugins</category>
    </item>
    <item>
      <title>WP-Optimize Cleans Your Database. That's About It.</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:40:48 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wp-optimize-cleans-your-database-thats-about-it-4l00</link>
      <guid>https://dev.to/wpmultitool/wp-optimize-cleans-your-database-thats-about-it-4l00</guid>
      <description>&lt;p&gt;Every WordPress developer has that moment. The site is slow, someone says "just install WP-Optimize," and you clean up 5,000 post revisions. The site loads 200ms faster. You feel good about it.&lt;/p&gt;

&lt;p&gt;Then a week later, it's slow again. Because the problem was never the revisions.&lt;/p&gt;

&lt;p&gt;If you've been looking for a wp-optimize alternative that goes deeper than database cleanup, this comparison breaks down where each tool fits - and where it doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What WP-Optimize Does
&lt;/h2&gt;

&lt;p&gt;WP-Optimize by Team Updraft (the same team behind UpdraftPlus) has been around for years. Over 1 million active installs. It does three things:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Database Cleanup
&lt;/h3&gt;

&lt;p&gt;This is the core feature. It removes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post revisions&lt;/li&gt;
&lt;li&gt;Auto-drafts&lt;/li&gt;
&lt;li&gt;Trashed posts&lt;/li&gt;
&lt;li&gt;Spam and trashed comments&lt;/li&gt;
&lt;li&gt;Expired transients&lt;/li&gt;
&lt;li&gt;Orphaned postmeta and commentmeta&lt;/li&gt;
&lt;li&gt;Pingbacks and trackbacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can schedule these cleanups to run automatically. The premium version adds multisite support and more granular control.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Image Compression
&lt;/h3&gt;

&lt;p&gt;Even the free version includes image compression via reSmush.it - lossy and lossless compression, WebP conversion, and bulk optimization. The premium version adds lazy loading and unused image size removal.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Page Caching
&lt;/h3&gt;

&lt;p&gt;WP-Optimize added caching in recent versions. Page caching with preloading, browser caching headers, and GZIP compression.&lt;/p&gt;

&lt;p&gt;That's the full picture. Database cleanup, image compression (even in the free version), and caching. Three features, one plugin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where WP-Optimize Stops
&lt;/h2&gt;

&lt;p&gt;Here's what WP-Optimize doesn't touch:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't tell you WHY your database is slow.&lt;/strong&gt; It removes old data, but it never looks at which queries are actually causing problems. You might have 50 slow queries from a WooCommerce meta_query, and cleaning up revisions won't help with any of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't analyze autoload bloat.&lt;/strong&gt; The &lt;code&gt;wp_options&lt;/code&gt; table is often the biggest performance killer in WordPress, and the problem isn't old data - it's autoloaded options from plugins you deactivated months ago. WP-Optimize doesn't touch autoload settings. If you want to understand why autoload matters, I wrote about &lt;a href="https://wpmultitool.com/blog/wp-options-autoload-trap/" rel="noopener noreferrer"&gt;the wp_options autoload trap&lt;/a&gt; in detail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't help with debugging.&lt;/strong&gt; No slow query detection, no callback profiling, no system diagnostics. If something is wrong, WP-Optimize can't tell you what.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't manage your configuration.&lt;/strong&gt; Need to toggle &lt;code&gt;WP_DEBUG&lt;/code&gt; or change &lt;code&gt;WP_MEMORY_LIMIT&lt;/code&gt;? You're editing wp-config.php by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What WP Multitool Does Differently
&lt;/h2&gt;

&lt;p&gt;WP Multitool isn't a database cleanup plugin. It's 14 modules covering optimization, debugging, and site management. But let me focus on the overlap first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Database Cleanup: Both Do It
&lt;/h3&gt;

&lt;p&gt;WP Multitool's Database Optimizer module handles the same cleanup tasks - revisions, transients, orphaned data, table optimization. No meaningful difference here. Both get the job done.&lt;/p&gt;

&lt;h3&gt;
  
  
  Autoload Optimization: Only WP Multitool
&lt;/h3&gt;

&lt;p&gt;This is where it gets interesting. WP Multitool's &lt;a href="https://wpmultitool.com/blog/wp-options-autoload-trap/" rel="noopener noreferrer"&gt;Autoloader Optimizer&lt;/a&gt; scans every autoloaded option in &lt;code&gt;wp_options&lt;/code&gt; and classifies them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Active plugin options&lt;/strong&gt; - never touched (safe)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inactive plugin options&lt;/strong&gt; - candidates for optimization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oversized options&lt;/strong&gt; (&amp;gt;10KB) - flagged for review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Known bloat patterns&lt;/strong&gt; - tracker/cache leftovers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then it disables autoload on the candidates. Not delete - just stop loading them on every single page request. With a full backup and one-click restore if anything breaks.&lt;/p&gt;

&lt;p&gt;Depending on how many deactivated plugins left options behind, disabling their autoload can save 100KB-2MB of memory per request. WP-Optimize doesn't even look at this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slow Query Detection: Only WP Multitool
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://wpmultitool.com" rel="noopener noreferrer"&gt;Slow Query Analyzer&lt;/a&gt; monitors your database queries and catches the ones that take too long. Then it runs MySQL EXPLAIN to tell you exactly why - missing index, full table scan, bad join. And it gives you the SQL to fix it.&lt;/p&gt;

&lt;p&gt;WP-Optimize cleans up old data. WP Multitool catches the queries that are slow right now.&lt;/p&gt;

&lt;h3&gt;
  
  
  Everything Else: Only WP Multitool
&lt;/h3&gt;

&lt;p&gt;Here's the full list of what WP Multitool includes beyond what WP-Optimize offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Config Manager&lt;/strong&gt; - &lt;a href="https://wpmultitool.com/blog/stop-editing-wp-config-by-hand/" rel="noopener noreferrer"&gt;edit wp-config.php from the admin&lt;/a&gt;, no SSH needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find Slow Callbacks&lt;/strong&gt; - profile every hook callback to find bottlenecks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend Optimizer&lt;/strong&gt; - defer scripts, remove jQuery Migrate, disable dashicons, clean head&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://wpmultitool.com/blog/plugin-performance-score/" rel="noopener noreferrer"&gt;Plugin Performance Score&lt;/a&gt;&lt;/strong&gt; - see which of your plugins is the heaviest, right on the Plugins page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Info&lt;/strong&gt; - PHP, MySQL, server config at a glance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Manager&lt;/strong&gt; - manage image sizes, remove unused ones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shortcode Inspector&lt;/strong&gt; - find and test every shortcode on your site&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick Updater&lt;/strong&gt; - drag-drop plugin updates from ZIP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Package Downloader&lt;/strong&gt; - download any plugin/theme as ZIP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin Reactivator&lt;/strong&gt; - one-click deactivate+reactivate for troubleshooting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard Widget Manager&lt;/strong&gt; - control what shows on the dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's &lt;a href="https://wpmultitool.com/blog/replaced-6-wordpress-plugins-with-one/" rel="noopener noreferrer"&gt;14 modules replacing what used to take 6 separate plugins&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;WP-Optimize (Free)&lt;/th&gt;
&lt;th&gt;WP-Optimize (Premium)&lt;/th&gt;
&lt;th&gt;WP Multitool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database cleanup&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduled cleanup&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (more granular)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image compression&lt;/td&gt;
&lt;td&gt;Yes (via reSmush.it)&lt;/td&gt;
&lt;td&gt;Yes + lazy loading&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page caching&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (advanced)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autoload optimization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Slow query detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EXPLAIN analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Config management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hook profiling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend optimization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plugin benchmarks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;System diagnostics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multisite support&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$49-$199/year&lt;/td&gt;
&lt;td&gt;$199/year&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice something? WP-Optimize and WP Multitool barely overlap. The only shared feature is database cleanup. Everything else is different.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Which
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use WP-Optimize when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You just need database cleanup and maybe image compression&lt;/li&gt;
&lt;li&gt;You want scheduled automatic cleanups&lt;/li&gt;
&lt;li&gt;You need page caching and don't want a separate caching plugin&lt;/li&gt;
&lt;li&gt;Budget is tight (free version covers the basics)&lt;/li&gt;
&lt;li&gt;You're running multisite (premium feature)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use WP Multitool when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database cleanup isn't solving your performance problems&lt;/li&gt;
&lt;li&gt;You need to understand WHY your site is slow, not just clean old data&lt;/li&gt;
&lt;li&gt;Autoload bloat is killing your memory usage&lt;/li&gt;
&lt;li&gt;You want one plugin instead of six separate tools&lt;/li&gt;
&lt;li&gt;You manage client sites and need debugging + optimization in one place&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use both when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Honestly? There's less reason to run both than with Query Monitor. WP Multitool's Database Optimizer covers the cleanup. But if you're already using WP-Optimize for image compression and caching, there's no conflict - they don't overlap on anything else.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Real Difference
&lt;/h2&gt;

&lt;p&gt;WP-Optimize is a janitor. It cleans up after the mess.&lt;/p&gt;

&lt;p&gt;WP Multitool is a mechanic. It finds what's broken and helps you fix it.&lt;/p&gt;

&lt;p&gt;Both are useful. But if your site is slow and you've already cleaned the database, the janitor can't help you anymore. You need someone who can look under the hood.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;WP-Optimize is on &lt;a href="https://wordpress.org/plugins/wp-optimize/" rel="noopener noreferrer"&gt;wordpress.org&lt;/a&gt; - solid choice if database cleanup is all you need.&lt;/p&gt;

&lt;p&gt;If you need more, &lt;a href="https://wpmultitool.com" rel="noopener noreferrer"&gt;check out WP Multitool&lt;/a&gt;. Use code &lt;strong&gt;startups2026&lt;/strong&gt; for 10% off.&lt;/p&gt;

&lt;p&gt;And if you're not sure whether your problem is old data or slow queries - read &lt;a href="https://wpmultitool.com/blog/why-caching-plugins-dont-fix-slow-wordpress/" rel="noopener noreferrer"&gt;why caching plugins don't fix slow WordPress sites&lt;/a&gt;. It might save you hours of troubleshooting.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://wpmultitool.com/blog/wp-multitool-vs-wp-optimize/" rel="noopener noreferrer"&gt;https://wpmultitool.com/blog/wp-multitool-vs-wp-optimize/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>performance</category>
      <category>database</category>
    </item>
    <item>
      <title>Query Monitor Shows You the Problem. It Won't Fix It.</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:27:57 +0000</pubDate>
      <link>https://dev.to/wpmultitool/query-monitor-shows-you-the-problem-it-wont-fix-it-33d</link>
      <guid>https://dev.to/wpmultitool/query-monitor-shows-you-the-problem-it-wont-fix-it-33d</guid>
      <description>&lt;p&gt;You found the slow query. Now what?&lt;/p&gt;

&lt;p&gt;That's the question I kept asking myself after staring at Query Monitor's panel for the hundredth time. It tells you which queries are slow. It shows you which plugin is responsible. It even highlights duplicates. But then it just... stops. If you've ever googled "query monitor alternative" hoping to find something that goes beyond diagnosis - this is the honest comparison I wish I'd had a year ago. Not a "our tool is better" sales pitch - an actual breakdown of when each tool makes sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Query Monitor Does Well
&lt;/h2&gt;

&lt;p&gt;Let me be clear - Query Monitor is an excellent plugin. John Blackbourn has maintained it for years, Automattic sponsors it, and it has 200,000+ active installs for a reason.&lt;/p&gt;

&lt;p&gt;Here's what QM gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every database query on the current page&lt;/strong&gt; - with execution time, caller function, and component attribution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP errors&lt;/strong&gt; with full stack traces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP API calls&lt;/strong&gt; - response codes, timing, which plugin triggered them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks and actions&lt;/strong&gt; - every callback attached, in order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enqueued scripts and stylesheets&lt;/strong&gt; - including broken dependency chains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template hierarchy&lt;/strong&gt; - which template files loaded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment info&lt;/strong&gt; - PHP version, database, server config&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional checks&lt;/strong&gt; - &lt;code&gt;is_single()&lt;/code&gt;, &lt;code&gt;is_home()&lt;/code&gt;, all of them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The v4.0 rewrite with Preact made the UI faster too. For quick debugging sessions - "why is this page loading 47 queries?" - nothing beats it.&lt;/p&gt;

&lt;p&gt;It's free, it's lightweight when you need it, and every WordPress developer should have it in their toolkit. I still use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where QM Stops
&lt;/h2&gt;

&lt;p&gt;Here's the problem. QM is a debugger. It shows you a snapshot of what's happening on one page, at one moment, while you're watching.&lt;/p&gt;

&lt;p&gt;That creates three blind spots:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. No Historical Data
&lt;/h3&gt;

&lt;p&gt;QM shows the current page load. Close the tab, the data is gone. You can't answer "are slow queries getting worse this month?" or "which queries spiked after Tuesday's update?" There's no log. No trends. No baseline to compare against.&lt;/p&gt;

&lt;p&gt;I've had situations where a client reports their site was slow yesterday evening. By the time I check, everything looks fine in QM. The slow query happened during a WooCommerce cron job at 11 PM. QM never saw it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. No Production Monitoring
&lt;/h3&gt;

&lt;p&gt;QM is a dev tool. It adds overhead - it hooks into every query, every hook, every HTTP call to build its debug panel. That's fine during development, but you don't want that running on production 24/7.&lt;/p&gt;

&lt;p&gt;But slow queries don't happen in your local Docker container with 50 products. They happen on production with 50,000 products, 200 concurrent users, and a cron job running in the background. The exact environment where QM shouldn't be active.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. No Actionable Fixes
&lt;/h3&gt;

&lt;p&gt;This is the biggest one. QM tells you: "this query took 1.2 seconds." Ok. Now what?&lt;/p&gt;

&lt;p&gt;If you're a senior developer, you know to run EXPLAIN on it, check for missing indexes, maybe rewrite the query. But QM doesn't do any of that for you. It's a microscope, not a surgeon.&lt;/p&gt;

&lt;p&gt;For a site owner or a junior dev, that slow query number is basically useless information. You know something is wrong but you don't know how to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What WP Multitool Does Differently
&lt;/h2&gt;

&lt;p&gt;WP Multitool's &lt;a href="https://wpmultitool.com" rel="noopener noreferrer"&gt;Slow Query Analyzer&lt;/a&gt; approaches the problem from the other end. Instead of showing everything happening on one page, it continuously monitors for slow queries and then analyzes them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Always-On Monitoring
&lt;/h3&gt;

&lt;p&gt;A lightweight MU-plugin hooks into WordPress's query system and captures any query exceeding your threshold (default: 0.1 seconds). It uses WordPress's built-in &lt;code&gt;SAVEQUERIES&lt;/code&gt; constant, so it works with the same mechanism QM uses - but selectively.&lt;/p&gt;

&lt;p&gt;By default, it only monitors admin pages to keep overhead minimal. But you can flip the "Monitor Admin Only" toggle off, and it captures everything - frontend requests, cron jobs, REST API calls. That 11 PM WooCommerce cron job your client complained about? Logged. The query that only gets slow when &lt;code&gt;wp_options&lt;/code&gt; hits 500 autoloaded rows? Logged.&lt;/p&gt;

&lt;p&gt;Everything goes into a &lt;code&gt;wp_slow_query_log&lt;/code&gt; table with auto-purge at 5,000 entries, so it doesn't bloat your database.&lt;/p&gt;

&lt;h3&gt;
  
  
  EXPLAIN-Based Analysis
&lt;/h3&gt;

&lt;p&gt;Here's where it gets interesting. For each captured slow query, the analyzer runs MySQL's &lt;code&gt;EXPLAIN&lt;/code&gt; command and breaks down what's actually happening:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meta_value&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_posts&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; 
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;wp_postmeta&lt;/span&gt; &lt;span class="n"&gt;pm&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meta_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'_price'&lt;/span&gt; 
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meta_value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; 
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meta_value&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A health score (1-10) based on the EXPLAIN output&lt;/li&gt;
&lt;li&gt;Whether it's doing a full table scan&lt;/li&gt;
&lt;li&gt;Which indexes exist and which are missing&lt;/li&gt;
&lt;li&gt;A ready-to-run &lt;code&gt;CREATE INDEX&lt;/code&gt; statement if one would help&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've ever tried to &lt;a href="https://wpmultitool.com/blog/how-to-read-mysql-explain-wordpress/" rel="noopener noreferrer"&gt;read a MySQL EXPLAIN plan&lt;/a&gt; manually, you know it's not exactly beginner-friendly. The analyzer translates it into plain language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analysis at Shutdown
&lt;/h3&gt;

&lt;p&gt;When a slow query is detected, the EXPLAIN analysis runs during WordPress's &lt;code&gt;shutdown&lt;/code&gt; hook - after the response has been sent to the browser. So the visitor gets their page, and then the analysis happens. For queries that need re-analysis, there's also a WP-Cron batch process that picks them up later.&lt;/p&gt;

&lt;h3&gt;
  
  
  It Doesn't Auto-Fix Anything
&lt;/h3&gt;

&lt;p&gt;This is important. WP Multitool suggests fixes - it will tell you "add this index" or "this query needs a rewrite." But it never runs those fixes automatically. You review, you decide, you execute. No surprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;p&gt;Here's the honest breakdown:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Query Monitor&lt;/th&gt;
&lt;th&gt;WP Multitool (SQAA)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;See queries on current page&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP error tracking&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hook/action inspection&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Template hierarchy&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Script/style dependencies&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP API monitoring&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistent query logging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Production-safe monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EXPLAIN analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Index recommendations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Historical trends&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Post-response analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;N/A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overhead&lt;/td&gt;
&lt;td&gt;Moderate (hooks everything)&lt;/td&gt;
&lt;td&gt;Low (only slow queries)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$199/year (14 modules)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active installs&lt;/td&gt;
&lt;td&gt;200,000+&lt;/td&gt;
&lt;td&gt;New&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Look at that table. QM wins on breadth of debugging data. WP Multitool wins on depth of query analysis and production monitoring. They're not really competing - they're solving different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Which
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use Query Monitor when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're debugging a specific page that's loading slow right now&lt;/li&gt;
&lt;li&gt;You need to trace which plugin is enqueuing a broken script&lt;/li&gt;
&lt;li&gt;You want to see the full hook execution order&lt;/li&gt;
&lt;li&gt;You're developing locally and need real-time feedback&lt;/li&gt;
&lt;li&gt;You need to check template hierarchy or conditional functions&lt;/li&gt;
&lt;li&gt;Budget is zero (QM is free and always will be)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use WP Multitool when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need ongoing production monitoring for slow queries&lt;/li&gt;
&lt;li&gt;You want to know WHY a query is slow, not just THAT it's slow&lt;/li&gt;
&lt;li&gt;You need index recommendations you can actually implement&lt;/li&gt;
&lt;li&gt;Your client reports "the site was slow yesterday" and you need data&lt;/li&gt;
&lt;li&gt;You want historical trends to catch regressions after updates&lt;/li&gt;
&lt;li&gt;You also need &lt;a href="https://wpmultitool.com/blog/wp-options-autoload-trap/" rel="noopener noreferrer"&gt;autoload optimization&lt;/a&gt;, &lt;a href="https://wpmultitool.com/blog/stop-editing-wp-config-by-hand/" rel="noopener noreferrer"&gt;config management&lt;/a&gt;, &lt;a href="https://wpmultitool.com/blog/plugin-performance-score/" rel="noopener noreferrer"&gt;plugin performance scoring&lt;/a&gt;, and &lt;a href="https://wpmultitool.com/blog/replaced-6-wordpress-plugins-with-one/" rel="noopener noreferrer"&gt;11 other modules&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use both when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're a developer managing production WordPress sites. QM for active debugging sessions, WP Multitool for the 23 hours a day when you're not watching.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Real Question
&lt;/h2&gt;

&lt;p&gt;The comparison isn't really QM vs WP Multitool. It's debugging vs monitoring.&lt;/p&gt;

&lt;p&gt;Debugging is reactive. Something breaks, you investigate, you fix it, you move on. QM is perfect for this.&lt;/p&gt;

&lt;p&gt;Monitoring is proactive. You catch the problem before users complain - or better yet, before it becomes a problem. You see trends. You can prove that last week's plugin update added 3 slow queries that weren't there before. That's what the Slow Query Analyzer does.&lt;/p&gt;

&lt;p&gt;Most WordPress sites need both. A site without debugging tools is flying blind during development. A site without monitoring is flying blind in production.&lt;/p&gt;

&lt;p&gt;The difference is what happens between your debugging sessions. With QM alone, you have no idea what's happening while you're not looking. And in my experience, that's when the worst problems happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Query Monitor is on &lt;a href="https://wordpress.org/plugins/query-monitor/" rel="noopener noreferrer"&gt;wordpress.org&lt;/a&gt; - install it if you haven't already. Seriously. Every developer should have it.&lt;/p&gt;

&lt;p&gt;WP Multitool ships the Slow Query Analyzer as one of 14 modules. &lt;a href="https://wpmultitool.com" rel="noopener noreferrer"&gt;Check it out at wpmultitool.com&lt;/a&gt; - and if the comparison here helped you decide, use code &lt;strong&gt;startups2026&lt;/strong&gt; for 10% off.&lt;/p&gt;

&lt;p&gt;If you're curious about reading those EXPLAIN plans yourself, I wrote a &lt;a href="https://wpmultitool.com/blog/how-to-read-mysql-explain-wordpress/" rel="noopener noreferrer"&gt;complete guide to MySQL EXPLAIN for WordPress&lt;/a&gt; that covers everything the analyzer does under the hood.&lt;/p&gt;

&lt;p&gt;And if you're wondering whether your site even has slow query problems - &lt;a href="https://wpmultitool.com/blog/why-caching-plugins-dont-fix-slow-wordpress/" rel="noopener noreferrer"&gt;caching alone won't save you&lt;/a&gt;. That's a different rabbit hole, but worth reading.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://wpmultitool.com/blog/wp-multitool-vs-query-monitor/" rel="noopener noreferrer"&gt;https://wpmultitool.com/blog/wp-multitool-vs-query-monitor/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>performance</category>
      <category>database</category>
    </item>
    <item>
      <title>I Benchmarked 4,999 WordPress Plugins for Speed. Here Are the Results.</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:25:39 +0000</pubDate>
      <link>https://dev.to/wpmultitool/i-benchmarked-4999-wordpress-plugins-for-speed-here-are-the-results-271g</link>
      <guid>https://dev.to/wpmultitool/i-benchmarked-4999-wordpress-plugins-for-speed-here-are-the-results-271g</guid>
      <description>&lt;p&gt;I benchmarked 4,999 WordPress plugins for their exact speed impact. Here are the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;Each plugin was tested in a clean WordPress environment. Metrics captured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TTFB (Time to First Byte) impact&lt;/li&gt;
&lt;li&gt;Database queries added per page load&lt;/li&gt;
&lt;li&gt;Memory usage overhead&lt;/li&gt;
&lt;li&gt;HTTP requests added&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Lighthouse scores. No synthetic tests. Server-side measurement only.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  WooCommerce scored F
&lt;/h3&gt;

&lt;p&gt;The most popular WordPress e-commerce plugin (5M+ active installs) is the heaviest plugin in the entire database. It adds &lt;strong&gt;19 database queries to every single page load&lt;/strong&gt; - not just product pages. Your blog post, your about page, your contact page - all taxed equally.&lt;/p&gt;

&lt;h3&gt;
  
  
  86% of plugins are fine
&lt;/h3&gt;

&lt;p&gt;2,357 plugins scored A. Another 1,945 scored A-. That's 86% with negligible performance impact.&lt;/p&gt;

&lt;p&gt;The popular advice of "fewer plugins = faster site" is wrong. It's not about count. It's about &lt;em&gt;which&lt;/em&gt; plugins you install.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 23x page builder gap
&lt;/h3&gt;

&lt;p&gt;Elementor adds approximately 47ms to every page load. Beaver Builder adds 2ms. Same category, same purpose, 23x performance difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contact Form 7 is invisible
&lt;/h3&gt;

&lt;p&gt;0ms added load time. 0 extra database queries. 0 additional memory. If every plugin developer built like CF7, nobody would need performance optimization plugins.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yoast SEO is surprisingly well-optimized
&lt;/h3&gt;

&lt;p&gt;Despite being massive in scope, Yoast scores A. Credit where it's due.&lt;/p&gt;

&lt;h2&gt;
  
  
  Score Distribution
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Percentage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;2,357&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A-&lt;/td&gt;
&lt;td&gt;1,945&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B+&lt;/td&gt;
&lt;td&gt;199&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;113&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B-&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C+&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C-&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;0.06%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The F-Grade Plugins
&lt;/h2&gt;

&lt;p&gt;Only 3 plugins out of 4,999 scored F:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;WooCommerce&lt;/strong&gt; - 19 database queries per page load&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EditorsKit&lt;/strong&gt; - Gutenberg block toolkit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cozy Blocks&lt;/strong&gt; - Another Gutenberg toolkit&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Notable Scores for Popular Plugins
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yoast SEO&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Well optimized despite scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wordfence Security&lt;/td&gt;
&lt;td&gt;A-&lt;/td&gt;
&lt;td&gt;Better than expected for a security plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contact Form 7&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Zero measurable impact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elementor&lt;/td&gt;
&lt;td&gt;C-&lt;/td&gt;
&lt;td&gt;Heavy page builder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jetpack Boost&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Ironic for a "speed" plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All in One SEO&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Significant overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WooCommerce&lt;/td&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;19 queries per page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Database
&lt;/h2&gt;

&lt;p&gt;The full database is free to search at &lt;a href="https://makewpfast.com" rel="noopener noreferrer"&gt;makewpfast.com&lt;/a&gt;. No signup, no paywall. Look up any of the 4,999 tested plugins before you install them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology
&lt;/h2&gt;

&lt;p&gt;Each test runs on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean WordPress install (latest version)&lt;/li&gt;
&lt;li&gt;Default theme (Twenty Twenty-Four)&lt;/li&gt;
&lt;li&gt;PHP 8.3, MySQL 8.0&lt;/li&gt;
&lt;li&gt;Measured with SAVEQUERIES + server-side timing&lt;/li&gt;
&lt;li&gt;5 page loads per test, averaged&lt;/li&gt;
&lt;li&gt;Scores are relative to baseline (clean WP with no plugins)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you think the methodology could be improved, I'm genuinely interested in feedback.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I built this as part of &lt;a href="https://makewpfast.com" rel="noopener noreferrer"&gt;MakeWPFast&lt;/a&gt;, a WordPress plugin performance database. I also maintain &lt;a href="https://wpmultitool.com" rel="noopener noreferrer"&gt;WP Multitool&lt;/a&gt; - a developer toolkit for WordPress performance optimization.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>webdev</category>
      <category>database</category>
    </item>
    <item>
      <title>Emergency WordPress Recovery: What to Do When Your Site Goes Down</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:14:35 +0000</pubDate>
      <link>https://dev.to/wpmultitool/emergency-wordpress-recovery-what-to-do-when-your-site-goes-down-8n9</link>
      <guid>https://dev.to/wpmultitool/emergency-wordpress-recovery-what-to-do-when-your-site-goes-down-8n9</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://makewpfast.com/emergency-wordpress-recovery-what-to-do-when-your-site-goes-down/" rel="noopener noreferrer"&gt;https://makewpfast.com/emergency-wordpress-recovery-what-to-do-when-your-site-goes-down/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your site is down. Visitors see an error page. Revenue is dropping by the minute. Panic sets in. Here is your emergency action plan — a calm, systematic approach to getting your WordPress site back online as fast as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Confirm the Outage (30 seconds)
&lt;/h2&gt;

&lt;p&gt;Before doing anything, verify the site is actually down and it is not just your connection:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Try from a different device or network (mobile data)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use an external uptime checker like downfor.io or isitdown.site&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check if it is the entire site or just wp-admin&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Identify the Error (2 minutes)
&lt;/h2&gt;

&lt;p&gt;The error message tells you where to look:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;White screen&lt;/strong&gt; → PHP fatal error (check error logs)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;500 Internal Server Error&lt;/strong&gt; → Server-side issue (check error logs, .htaccess)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;502/504 Gateway Timeout&lt;/strong&gt; → PHP-FPM crashed or overloaded&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database connection error&lt;/strong&gt; → MySQL is down or credentials are wrong&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;“Briefly unavailable for maintenance”&lt;/strong&gt; → Stuck update (delete .maintenance file)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;403 Forbidden&lt;/strong&gt; → Permission issue or security plugin lockout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DNS or SSL error&lt;/strong&gt; → Domain/hosting configuration issue&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Apply the Targeted Fix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PHP Fatal Error / White Screen
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Check &lt;code&gt;wp-content/debug.log&lt;/code&gt; or server error log&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rename the offending plugin/theme folder via FTP/SSH&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you cannot identify the cause, rename the entire &lt;code&gt;plugins&lt;/code&gt; folder&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Database Connection Error
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Verify MySQL is running: &lt;code&gt;systemctl status mysql&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check &lt;code&gt;wp-config.php&lt;/code&gt; credentials match your database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check if the database disk is full: &lt;code&gt;df -h&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stuck Maintenance Mode
&lt;/h3&gt;

&lt;p&gt;Delete the &lt;code&gt;.maintenance&lt;/code&gt; file in your WordPress root directory. That is it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security Plugin Lockout
&lt;/h3&gt;

&lt;p&gt;If a security plugin (Wordfence, Sucuri, iThemes) locked you out, rename its folder via FTP/SSH to deactivate it. Then log in and reconfigure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Verify the Fix
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Load the homepage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Log into wp-admin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test key functionality (forms, checkout, login)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the error log for new errors&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When You Cannot Fix It Yourself
&lt;/h2&gt;

&lt;p&gt;If you have gone through these steps and your site is still down — or if you do not have FTP/SSH access — you need professional help fast. &lt;a href="https://fix-wp.com" rel="noopener noreferrer"&gt;fix-wp.com&lt;/a&gt; is built for exactly this moment. Submit your site, and AI-powered diagnostics identify and fix the issue, usually within an hour. A full backup is created before any changes, you get live progress updates, and you only pay if the fix works.&lt;/p&gt;

&lt;h2&gt;
  
  
  After Recovery: Build Your Safety Net
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Set up automated daily backups (and test restoring them)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable uptime monitoring with instant alerts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep a recovery document with your hosting credentials and emergency steps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintain a staging environment for testing changes before they go live&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every site goes down eventually. The difference between an hour of downtime and a day of downtime is preparation.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Get WordPress Performance Tips
    Join developers and agency owners who get backend optimization strategies, tool releases, and deep-dive guides.





        Join Free


    No spam. Unsubscribe anytime. We respect your privacy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Optimizing WordPress for Core Web Vitals in 2026</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:13:58 +0000</pubDate>
      <link>https://dev.to/wpmultitool/optimizing-wordpress-for-core-web-vitals-in-2026-4bn</link>
      <guid>https://dev.to/wpmultitool/optimizing-wordpress-for-core-web-vitals-in-2026-4bn</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://makewpfast.com/optimizing-wordpress-for-core-web-vitals-in-2026/" rel="noopener noreferrer"&gt;https://makewpfast.com/optimizing-wordpress-for-core-web-vitals-in-2026/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Core Web Vitals are Google’s metrics for measuring real-world user experience. They directly impact your search rankings. In 2026, the three metrics that matter are Largest Contentful Paint (LCP), Interaction to Next Paint (INP), and Cumulative Layout Shift (CLS).&lt;/p&gt;

&lt;h2&gt;
  
  
  Largest Contentful Paint (LCP): Under 2.5 Seconds
&lt;/h2&gt;

&lt;p&gt;LCP measures how long it takes for the largest visible element (usually a hero image or heading) to render. Common WordPress LCP killers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unoptimized images&lt;/strong&gt; — Serve WebP/AVIF, use proper sizing, add width/height attributes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Render-blocking resources&lt;/strong&gt; — Defer non-critical JavaScript and CSS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Slow server response (TTFB)&lt;/strong&gt; — Use page caching, Redis object cache, and a CDN&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lazy-loading the LCP image&lt;/strong&gt; — Never lazy-load your hero image. Use &lt;code&gt;fetchpriority="high"&lt;/code&gt; instead.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Interaction to Next Paint (INP): Under 200ms
&lt;/h2&gt;

&lt;p&gt;INP replaced First Input Delay (FID) in 2024. It measures the latency of all user interactions throughout the page lifecycle, not just the first click. WordPress-specific INP issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Heavy JavaScript execution&lt;/strong&gt; — Every plugin adding JS increases INP. Audit what actually needs to run.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Long tasks on the main thread&lt;/strong&gt; — Break up heavy operations using &lt;code&gt;requestIdleCallback&lt;/code&gt; or web workers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Third-party scripts&lt;/strong&gt; — Analytics, chat widgets, and ad scripts often dominate main thread time&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cumulative Layout Shift (CLS): Under 0.1
&lt;/h2&gt;

&lt;p&gt;CLS measures unexpected visual movement. WordPress sites commonly fail CLS because of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Images without dimensions&lt;/strong&gt; — Always specify width and height attributes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ads and embeds loading late&lt;/strong&gt; — Reserve space with CSS aspect-ratio or min-height&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Web fonts causing FOUT&lt;/strong&gt; — Use &lt;code&gt;font-display: swap&lt;/code&gt; with preloaded fonts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic content injection&lt;/strong&gt; — Cookie banners, newsletter popups, notification bars pushing content down&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  WordPress-Specific Quick Wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable page caching&lt;/strong&gt; — Reduces TTFB from 2-3 seconds to under 200ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use a CDN&lt;/strong&gt; — Cloudflare free tier handles static assets and gives you a global edge&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimize images on upload&lt;/strong&gt; — Convert to WebP, resize to actual display dimensions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reduce plugin count&lt;/strong&gt; — Each plugin adds potential render-blocking resources and main thread work&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Preload critical resources&lt;/strong&gt; — LCP image, primary font files, critical CSS&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Measuring and Monitoring
&lt;/h2&gt;

&lt;p&gt;Use Google Search Console’s Core Web Vitals report for field data (real user metrics). Use PageSpeed Insights for lab data and specific recommendations. Track changes over time — a single optimization session is not enough.&lt;/p&gt;

&lt;p&gt;For backend-side optimizations — slow queries, autoload bloat, memory issues — that directly impact TTFB and therefore LCP, &lt;a href="https://wpmultitool.com" rel="noopener noreferrer"&gt;WP Multitool&lt;/a&gt; provides the diagnostic tools to identify and fix server-side bottlenecks.&lt;/p&gt;

&lt;p&gt;Core Web Vitals are not just an SEO checkbox. They measure the experience your visitors actually have. Invest in them.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Get WordPress Performance Tips
    Join developers and agency owners who get backend optimization strategies, tool releases, and deep-dive guides.





        Join Free


    No spam. Unsubscribe anytime. We respect your privacy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Do Shortcodes Slow Down WordPress? What the Data Shows</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:13:20 +0000</pubDate>
      <link>https://dev.to/wpmultitool/do-shortcodes-slow-down-wordpress-what-the-data-shows-2eod</link>
      <guid>https://dev.to/wpmultitool/do-shortcodes-slow-down-wordpress-what-the-data-shows-2eod</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://makewpfast.com/do-shortcodes-slow-down-wordpress/" rel="noopener noreferrer"&gt;https://makewpfast.com/do-shortcodes-slow-down-wordpress/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;WordPress shortcodes have been around since version 2.5. They’re everywhere — page builders use them, contact form plugins use them, even some themes rely on them for basic layout. But do they actually slow down your site?&lt;/p&gt;

&lt;p&gt;The short answer: shortcodes themselves are nearly free. What’s expensive is the code they execute. Let me show you what the data says.&lt;/p&gt;

&lt;h2&gt;
  
  
  How WordPress Shortcodes Work Internally
&lt;/h2&gt;

&lt;p&gt;Every time WordPress renders a page, it runs &lt;code&gt;do_shortcode()&lt;/code&gt; on the post content. This function uses a single regex pattern to find all registered shortcode tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// wp-includes/shortcodes.php&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;do_shortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$ignore_html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Build regex from all registered shortcode tags&lt;/span&gt;
    &lt;span class="nv"&gt;$pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_shortcode_regex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$tagnames&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;preg_replace_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;"/&lt;/span&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'do_shortcode_tag'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$content&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The regex matches anything that looks like &lt;code&gt;[shortcode_tag]&lt;/code&gt;, extracts the tag name and attributes, then calls the registered callback function. WordPress builds the regex dynamically from &lt;code&gt;$shortcode_tags&lt;/code&gt; — a global array where every &lt;code&gt;add_shortcode()&lt;/code&gt; call registers a tag-to-callback mapping.&lt;/p&gt;

&lt;p&gt;This happens on every single page load. There’s no caching layer between the raw post content and the rendered output. The regex runs, callbacks fire, and the result gets sent to the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actual Cost of Shortcode Parsing
&lt;/h2&gt;

&lt;p&gt;Here’s where most articles get it wrong. They blame the shortcode system itself. But the parsing overhead is trivial.&lt;/p&gt;

&lt;p&gt;I benchmarked &lt;code&gt;do_shortcode()&lt;/code&gt; on a 10KB post with 33 registered shortcodes on a production VPS (Mikrus anna152). The full parse-and-render cycle — regex matching, attribute parsing, and executing trivial callbacks — takes &lt;strong&gt;0.06ms&lt;/strong&gt;. With 73 registered shortcodes, it rises to 0.07ms. Still under 0.1ms.&lt;/p&gt;

&lt;p&gt;For comparison, a single uncached database query takes 1-5ms. A remote API call takes 100-500ms. The shortcode regex is noise.&lt;/p&gt;

&lt;p&gt;The performance problem is never the square brackets. It’s what happens when the callback runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Heavy Shortcodes: Where the Real Cost Lives
&lt;/h2&gt;

&lt;p&gt;Page builder shortcodes are the worst offenders. Here’s what a single Elementor section shortcode can trigger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;3-8 database queries&lt;/strong&gt; to fetch element settings, global widgets, and template data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;200-500KB of CSS&lt;/strong&gt; generated inline or loaded from dynamically-built stylesheets&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;300-800KB of JavaScript&lt;/strong&gt; for frontend interactivity, animations, and the builder framework&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multiple HTTP requests&lt;/strong&gt; for fonts, icons, and lazy-loaded assets&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Divi page with 20 shortcode-based modules can easily add 1.2MB of frontend assets and 40+ database queries. That’s not a shortcode problem — that’s a plugin architecture problem.&lt;/p&gt;

&lt;p&gt;Other heavy shortcodes to watch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gallery plugins&lt;/strong&gt; (NextGEN, Envira) — each instance can load its own JS/CSS bundle plus thumbnail generation queries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contact forms&lt;/strong&gt; (Contact Form 7, WPForms) — load form assets on every page, not just pages with forms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Social feeds&lt;/strong&gt; — external API calls on every uncached page load&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Table plugins&lt;/strong&gt; — some load DataTables.js (90KB+) per shortcode instance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lightweight Shortcodes: Zero Concern
&lt;/h2&gt;

&lt;p&gt;Not all shortcodes are created equal. A shortcode like this has essentially zero performance impact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_shortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'year'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Y'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;add_shortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'site_name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;get_bloginfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These execute in microseconds. No database queries, no external assets, no DOM manipulation. Even shortcodes that do simple string formatting or conditional display logic are perfectly fine.&lt;/p&gt;

&lt;p&gt;The rule of thumb: if your shortcode callback doesn’t query the database, load external assets, or make HTTP requests, it’s not a performance concern.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Nested Shortcode Problem
&lt;/h2&gt;

&lt;p&gt;WordPress supports shortcodes inside shortcodes. Page builders rely on this heavily:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[row]
  [column width="1/2"]
    [heading]Title[/heading]
    [text]Content here[/text]
  [/column]
  [column width="1/2"]
    [image src="photo.jpg"]
    [button url="/contact"]Get in touch[/button]
  [/column]
[/row]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each level requires another pass of &lt;code&gt;do_shortcode()&lt;/code&gt;. The outer shortcode renders first, and its output contains inner shortcodes that trigger additional regex passes. With deeply nested structures (common in Divi and Visual Composer), you can get 4-6 recursive passes over the same content.&lt;/p&gt;

&lt;p&gt;Again — the regex passes themselves are cheap. But each shortcode callback fires sequentially. If every callback triggers a database query, you get multiplicative slowdown. A page with 50 nested shortcodes each making 2 DB queries means 100 queries just from shortcode rendering. I’ve seen Visual Composer pages hit 200+ queries from shortcode nesting alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Identify Slow Shortcodes
&lt;/h2&gt;

&lt;p&gt;Install &lt;a href="https://wordpress.org/plugins/query-monitor/" rel="noopener noreferrer"&gt;Query Monitor&lt;/a&gt;. It’s the single most useful WordPress profiling tool. Look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Queries by Component&lt;/strong&gt; — shows which plugin triggers the most database queries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Queries by Caller&lt;/strong&gt; — trace individual queries back to specific shortcode callbacks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HTTP API Calls&lt;/strong&gt; — reveals shortcodes making external requests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more granular shortcode profiling, you can wrap &lt;code&gt;do_shortcode()&lt;/code&gt; with timing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'the_content'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$content&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;do_shortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$content&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$start&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$elapsed&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Log anything over 10ms&lt;/span&gt;
        &lt;span class="nb"&gt;error_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;"do_shortcode took &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$elapsed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;ms on post "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;get_the_ID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Priority 9 = runs before default priority 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check your enqueued scripts and styles too. Many shortcode plugins load assets globally using &lt;code&gt;wp_enqueue_script()&lt;/code&gt; in &lt;code&gt;wp_head&lt;/code&gt; rather than conditionally when the shortcode is actually present. That means every page pays the cost, even pages without the shortcode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Alternatives
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gutenberg blocks&lt;/strong&gt; are the modern replacement. Blocks render at save time — the HTML is stored in the database, not generated on each request. A block-based page serves static HTML with no runtime parsing. The performance difference is real: blocks eliminate the runtime regex parsing and callback execution entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom PHP templates&lt;/strong&gt; skip the shortcode layer entirely. If you’re building custom functionality, a template part or a &lt;code&gt;get_template_part()&lt;/code&gt; call is faster and more maintainable than a shortcode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Direct HTML in the block editor&lt;/strong&gt; works for simple use cases. A Custom HTML block with a styled div beats a shortcode that just wraps content in a div.&lt;/p&gt;

&lt;p&gt;That said, don’t refactor working shortcodes purely for performance. If your shortcode callbacks are lightweight, the migration effort isn’t worth the negligible speed gain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shortcode parsing is not your bottleneck.&lt;/strong&gt; The regex engine handles it in microseconds. Stop blaming the syntax.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit what your shortcodes execute.&lt;/strong&gt; Use Query Monitor to count database queries and external calls triggered by each shortcode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Page builder shortcodes are the real problem.&lt;/strong&gt; If you’re using Elementor, Divi, or Visual Composer, the shortcode overhead is a symptom of the plugin’s architecture, not WordPress core.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conditional asset loading matters more.&lt;/strong&gt; A shortcode that loads 200KB of JS on every page is worse than one that loads it only when the shortcode is present.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cache the output.&lt;/strong&gt; If your shortcode’s output doesn’t change per request, use the Transients API or full-page caching to avoid re-executing callbacks on every load.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prefer blocks for new development.&lt;/strong&gt; The save-time rendering model is fundamentally more efficient than runtime shortcode parsing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bottom line: shortcodes don’t slow down WordPress. Bloated plugins behind shortcodes do. If you can identify which shortcodes trigger heavy operations and either replace them or cache their output, the shortcode system itself will never be your performance bottleneck.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Get WordPress Performance Tips
    Join developers and agency owners who get backend optimization strategies, tool releases, and deep-dive guides.





        Join Free


    No spam. Unsubscribe anytime. We respect your privacy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Does Hotjar Slow Down WordPress? Performance Impact Tested</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:12:42 +0000</pubDate>
      <link>https://dev.to/wpmultitool/does-hotjar-slow-down-wordpress-performance-impact-tested-3pb9</link>
      <guid>https://dev.to/wpmultitool/does-hotjar-slow-down-wordpress-performance-impact-tested-3pb9</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://makewpfast.com/hotjar-slow-down-wordpress-performance/" rel="noopener noreferrer"&gt;https://makewpfast.com/hotjar-slow-down-wordpress-performance/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hotjar is one of the most popular behavior analytics tools for WordPress. Heatmaps, session recordings, feedback polls — it gives you visibility into how users actually interact with your site. But every third-party script has a cost, and Hotjar is no exception.&lt;/p&gt;

&lt;p&gt;Here’s what Hotjar actually loads, how much it impacts performance, and what you can do about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hotjar Loads on Your Pages
&lt;/h2&gt;

&lt;p&gt;When you install the Hotjar tracking snippet, your pages gain the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bootstrap loader&lt;/strong&gt; — 15KB uncompressed (~6KB gzipped) from &lt;code&gt;static.hotjar.com&lt;/code&gt;, with a surprisingly short 60-second cache TTL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Main module bundle&lt;/strong&gt; — dynamically loaded from &lt;code&gt;script.hotjar.com&lt;/code&gt;, typically 80-120KB compressed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Session recording module&lt;/strong&gt; — additional JS for capturing DOM mutations, mouse movements, scroll events, and form interactions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analytics beacon&lt;/strong&gt; — requests to &lt;code&gt;metrics.hotjar.io&lt;/code&gt; for event tracking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Feedback widgets&lt;/strong&gt; — if you use polls or surveys, additional UI code from &lt;code&gt;voc.hotjar.com&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In total, you’re looking at &lt;strong&gt;100-150KB compressed JavaScript&lt;/strong&gt; across multiple domains, plus a WebSocket connection that persists throughout the session. The 60-second cache TTL on the bootstrap script means repeat visitors re-download it on nearly every visit — unusual for third-party scripts that typically cache for days.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actual Performance Impact: The Numbers
&lt;/h2&gt;

&lt;p&gt;I ran Lighthouse (mobile, simulated throttling) against makewpfast.com — a production WordPress site on a Mikrus VPS running GeneratePress. Three runs, averaged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Baseline Without Hotjar (Measured)
&lt;/h3&gt;

&lt;p&gt;Metric&lt;br&gt;
Average (3 runs)&lt;/p&gt;

&lt;p&gt;Performance Score&lt;br&gt;
99&lt;/p&gt;

&lt;p&gt;First Contentful Paint&lt;br&gt;
985ms&lt;/p&gt;

&lt;p&gt;Largest Contentful Paint&lt;br&gt;
1,983ms&lt;/p&gt;

&lt;p&gt;Total Blocking Time&lt;br&gt;
0ms&lt;/p&gt;

&lt;p&gt;Cumulative Layout Shift&lt;br&gt;
0&lt;/p&gt;

&lt;p&gt;Total Transfer Size&lt;br&gt;
~100KB&lt;/p&gt;
&lt;h3&gt;
  
  
  Projected Impact With Hotjar
&lt;/h3&gt;

&lt;p&gt;Hotjar adds 100-150KB of compressed JavaScript across 3+ new origins. Based on the script analysis (not a live install test), the expected impact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transfer size&lt;/strong&gt; — roughly doubles, from ~100KB to ~200-250KB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TBT&lt;/strong&gt; — the biggest concern. Parsing and executing ~400KB of uncompressed JS on the main thread adds significant blocking time, especially on mobile CPUs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LCP&lt;/strong&gt; — minimal impact since Hotjar loads asynchronously&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Score&lt;/strong&gt; — expect a drop from 99 to somewhere in the low 90s on a lean site like this&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; these projections are based on script size analysis, not a direct before/after Lighthouse test with Hotjar installed. Your actual impact depends on which Hotjar features are active, your baseline score, and your visitors’ devices. Always measure on your own site.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Measure Hotjar’s Impact on Your Site
&lt;/h2&gt;

&lt;p&gt;Don’t trust generic benchmarks — measure on your own site. Here’s how:&lt;/p&gt;
&lt;h3&gt;
  
  
  Method 1: Lighthouse Before/After
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run from Chrome DevTools or CLI&lt;/span&gt;
&lt;span class="c"&gt;# First: disable Hotjar (deactivate plugin or remove snippet)&lt;/span&gt;
lighthouse https://yoursite.com &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json &lt;span class="nt"&gt;--output-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./without-hotjar.json

&lt;span class="c"&gt;# Re-enable Hotjar, clear caches&lt;/span&gt;
lighthouse https://yoursite.com &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json &lt;span class="nt"&gt;--output-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./with-hotjar.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run each test 3-5 times and average the results. Single Lighthouse runs have too much variance to be reliable.&lt;/p&gt;
&lt;h3&gt;
  
  
  Method 2: WebPageTest with Script Blocking
&lt;/h3&gt;

&lt;p&gt;WebPageTest lets you block specific domains. Run two tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Normal test with Hotjar active&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Same test with &lt;code&gt;static.hotjar.com&lt;/code&gt; and &lt;code&gt;script.hotjar.com&lt;/code&gt; added to the block list&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare the filmstrip view and waterfall charts. This is the most accurate method because it isolates Hotjar’s network impact without changing anything else on your site.&lt;/p&gt;
&lt;h3&gt;
  
  
  Method 3: Chrome DevTools Performance Tab
&lt;/h3&gt;

&lt;p&gt;Record a performance trace with Hotjar enabled. Filter the flame chart for “hotjar” to see exactly how much main thread time it consumes. Look for long tasks (&amp;gt;50ms) that Hotjar contributes to.&lt;/p&gt;
&lt;h2&gt;
  
  
  Mitigation Strategies
&lt;/h2&gt;

&lt;p&gt;You don’t have to choose between Hotjar and performance. These strategies let you keep the insights while reducing the cost.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Load Hotjar Only on Specific Pages
&lt;/h3&gt;

&lt;p&gt;Most sites don’t need heatmaps on every single page. Load Hotjar only where you actually analyze user behavior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;// In your theme's functions.php or a custom plugin
add_action('wp_head', function() {
    // Only load Hotjar on landing pages and checkout
    if (!is_page(['pricing', 'signup', 'checkout'])) {
        return;
    }
    ?&amp;gt;
    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hj&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hj&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="p"&gt;[]).&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)};&lt;/span&gt;
        &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_hjSettings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;hjid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;YOUR_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;hjsv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;head&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_hjSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hjid&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_hjSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hjsv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://static.hotjar.com/c/hotjar-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js?sv=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This alone can eliminate Hotjar’s impact on 90%+ of your page views.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Defer Loading Until After User Interaction
&lt;/h3&gt;

&lt;p&gt;Delay Hotjar until the user actually interacts with the page. This eliminates any impact on initial load metrics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadHotjar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hjLoaded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hjLoaded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hj&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hj&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="p"&gt;[]).&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)};&lt;/span&gt;
        &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_hjSettings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;hjid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;YOUR_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;hjsv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;head&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_hjSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hjid&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_hjSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hjsv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://static.hotjar.com/c/hotjar-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js?sv=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scroll&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mousemove&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;touchstart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;loadHotjar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;once&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tradeoff: you’ll miss data from users who bounce without interacting. For most analytics purposes, that’s acceptable — you’re primarily interested in engaged users anyway.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use Google Tag Manager for Conditional Loading
&lt;/h3&gt;

&lt;p&gt;If you already use GTM, fire the Hotjar tag based on conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sampling&lt;/strong&gt; — fire on a random percentage of sessions (e.g., 20%) to get representative data with 80% less overhead&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Page path rules&lt;/strong&gt; — only fire on pages you’re actively optimizing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom events&lt;/strong&gt; — fire Hotjar after specific user actions like clicking a CTA&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In GTM, create a custom trigger using a Random Number variable. If the random number is less than 20, fire the tag. Simple and effective.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Disable Session Recordings on High-Traffic Pages
&lt;/h3&gt;

&lt;p&gt;Session recordings are the heaviest Hotjar feature. They require continuous DOM observation and data streaming. In Hotjar’s dashboard, you can configure URL-based targeting to exclude high-traffic pages like your homepage or blog index from recordings while still collecting heatmap data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternatives When Performance Is the Priority
&lt;/h2&gt;

&lt;p&gt;If you need analytics but can’t afford the JavaScript overhead, consider these options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plausible Analytics&lt;/strong&gt; — &amp;lt;1KB script, no cookies, privacy-friendly. Gives you traffic analytics without behavior tracking. $9/mo hosted or self-hostable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Umami&lt;/strong&gt; — open source, self-hosted, ~2KB script. Similar to Plausible. Free if you run your own server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PostHog&lt;/strong&gt; — self-hosted option that includes session recordings, feature flags, and analytics. Heavier than Plausible but lighter than Hotjar since you control the infrastructure and can strip features you don’t need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Microsoft Clarity&lt;/strong&gt; — free Hotjar alternative from Microsoft. Similar features (heatmaps, recordings) with a lighter script footprint (~20% smaller). Still a third-party script, but worth testing if you want behavior analytics with less overhead.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are direct Hotjar replacements. Hotjar’s session recordings and heatmaps provide qualitative insights that pure analytics tools can’t match. The question is whether you need those insights on every page for every visitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hotjar is fine for most WordPress sites.&lt;/strong&gt; A 3-7 point Lighthouse drop and 50-80ms of extra TBT won’t meaningfully hurt your user experience or SEO rankings on a typical business site.&lt;/p&gt;

&lt;p&gt;But if any of these apply to you, load it selectively:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You’re optimizing for Core Web Vitals and every millisecond of TBT matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your pages already have heavy JavaScript (page builders, WooCommerce, chat widgets) and you’re stacking third-party scripts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You have high-traffic pages where the data volume from session recordings provides diminishing returns&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mobile performance is critical and your audience skews toward lower-end devices&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best approach: &lt;strong&gt;install Hotjar on the pages where you’ll actually use the data, defer it until user interaction, and disable session recordings where you don’t need them.&lt;/strong&gt; You’ll get 90% of the insights with 10% of the performance cost.&lt;/p&gt;

&lt;p&gt;Don’t blanket-load analytics scripts and forget about them. Every third-party script should earn its place on the page by providing actionable data that justifies its performance cost.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Get WordPress Performance Tips
    Join developers and agency owners who get backend optimization strategies, tool releases, and deep-dive guides.





        Join Free


    No spam. Unsubscribe anytime. We respect your privacy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>XML-RPC in WordPress: The Security and Performance Risk You Should Disable</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:12:05 +0000</pubDate>
      <link>https://dev.to/wpmultitool/xml-rpc-in-wordpress-the-security-and-performance-risk-you-should-disable-3bha</link>
      <guid>https://dev.to/wpmultitool/xml-rpc-in-wordpress-the-security-and-performance-risk-you-should-disable-3bha</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://makewpfast.com/xml-rpc-in-wordpress-the-security-and-performance-risk-you-should-disable/" rel="noopener noreferrer"&gt;https://makewpfast.com/xml-rpc-in-wordpress-the-security-and-performance-risk-you-should-disable/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;XML-RPC is a remote procedure call protocol that WordPress has supported since before the REST API existed. It allows external applications to communicate with your WordPress site — but in 2026, it is mostly a liability.&lt;/p&gt;

&lt;h2&gt;
  
  
  What XML-RPC Does
&lt;/h2&gt;

&lt;p&gt;XML-RPC (&lt;code&gt;xmlrpc.php&lt;/code&gt;) enables remote publishing, pingbacks, and trackbacks. Desktop blogging apps and some mobile apps used it to post content. The Jetpack plugin historically used it for communication with WordPress.com servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Is a Problem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Brute Force Amplification
&lt;/h3&gt;

&lt;p&gt;XML-RPC supports the &lt;code&gt;system.multicall&lt;/code&gt; method, which allows hundreds of login attempts in a single HTTP request. Rate limiting on &lt;code&gt;wp-login.php&lt;/code&gt; does not apply here. Attackers can try thousands of passwords per minute through this single endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  DDoS Vector
&lt;/h3&gt;

&lt;p&gt;The pingback feature can be abused to turn your site into a participant in DDoS attacks. Attackers send pingback requests from your server to a target, using your server as an amplifier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Drain
&lt;/h3&gt;

&lt;p&gt;Even if no one is actively exploiting it, bots constantly probe &lt;code&gt;xmlrpc.php&lt;/code&gt;. Every request triggers PHP execution, database queries for authentication, and consumes a PHP worker. On resource-limited hosting, this bot traffic can degrade performance for real visitors.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Disable XML-RPC
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: WordPress Filter
&lt;/h3&gt;

&lt;p&gt;Add to your theme’s &lt;code&gt;functions.php&lt;/code&gt; or a custom plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'xmlrpc_enabled'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'__return_false'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This disables XML-RPC at the WordPress level, but PHP still executes on each request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 2: Block at Web Server (Recommended)
&lt;/h3&gt;

&lt;p&gt;Block it before PHP even loads. For Nginx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;/xmlrpc.php&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Apache (.htaccess):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;Files&lt;/span&gt;&lt;span class="sr"&gt; xmlrpc.php&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;Require&lt;/span&gt; &lt;span class="ss"&gt;all&lt;/span&gt; denied
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Before You Disable
&lt;/h2&gt;

&lt;p&gt;Check if anything uses XML-RPC on your site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jetpack&lt;/strong&gt; — Older versions required XML-RPC. Current versions can use the REST API instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mobile apps&lt;/strong&gt; — The WordPress mobile app now uses the REST API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Remote publishing tools&lt;/strong&gt; — Some legacy tools still use XML-RPC. Switch to REST API alternatives.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most sites in 2026, nothing depends on XML-RPC anymore.&lt;/p&gt;

&lt;p&gt;If you want a quick toggle without editing server configs, &lt;a href="https://wpmultitool.com" rel="noopener noreferrer"&gt;WP Multitool’s Frontend Tweaks module&lt;/a&gt; includes XML-RPC disabling along with other security and performance toggles — one click, no code editing required.&lt;/p&gt;

&lt;p&gt;Disabling XML-RPC is one of those rare changes that improves both security and performance with zero downside for modern WordPress sites.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Get WordPress Performance Tips
    Join developers and agency owners who get backend optimization strategies, tool releases, and deep-dive guides.





        Join Free


    No spam. Unsubscribe anytime. We respect your privacy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>WordPress Database Bloat: Cleaning Revisions, Transients, and Spam</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:11:27 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wordpress-database-bloat-cleaning-revisions-transients-and-spam-246n</link>
      <guid>https://dev.to/wpmultitool/wordpress-database-bloat-cleaning-revisions-transients-and-spam-246n</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://makewpfast.com/wordpress-database-bloat-cleaning-revisions-transients-and-spam/" rel="noopener noreferrer"&gt;https://makewpfast.com/wordpress-database-bloat-cleaning-revisions-transients-and-spam/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A fresh WordPress database is a few megabytes. After a year of running, it can balloon to hundreds of megabytes — even gigabytes — of accumulated junk. Post revisions, expired transients, spam comments, and orphaned metadata silently slow down every query.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of Database Bloat
&lt;/h2&gt;

&lt;p&gt;Every database query scans through or indexes this bloated data. More rows mean slower queries, larger backups, and longer migration times. A database with 200,000 post revisions does not just waste disk space — it makes your &lt;code&gt;wp_posts&lt;/code&gt; table queries measurably slower.&lt;/p&gt;

&lt;h2&gt;
  
  
  Post Revisions
&lt;/h2&gt;

&lt;p&gt;WordPress saves a new revision every time you hit Save or Update. A post edited 50 times has 50 revisions stored as full copies in &lt;code&gt;wp_posts&lt;/code&gt;, each with its own set of meta data in &lt;code&gt;wp_postmeta&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To see how many revisions you have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_posts&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;post_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'revision'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To clean them up (keep the 3 most recent per post):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_posts&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;post_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'revision'&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_posts&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;post_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'revision'&lt;/span&gt;
        &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;post_date&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Expired Transients
&lt;/h2&gt;

&lt;p&gt;Transients are temporary cached data stored in &lt;code&gt;wp_options&lt;/code&gt;. Expired transients should be cleaned up automatically, but WordPress only deletes them when they are accessed — orphaned transients accumulate silently.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%'
AND option_value 
        Get WordPress Performance Tips
        Join developers and agency owners who get backend optimization strategies, tool releases, and deep-dive guides.





            Join Free


        No spam. Unsubscribe anytime. We respect your privacy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why WordPress Sites Crash After Updates (And How to Prevent It)</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:10:50 +0000</pubDate>
      <link>https://dev.to/wpmultitool/why-wordpress-sites-crash-after-updates-and-how-to-prevent-it-24fb</link>
      <guid>https://dev.to/wpmultitool/why-wordpress-sites-crash-after-updates-and-how-to-prevent-it-24fb</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://makewpfast.com/why-wordpress-sites-crash-after-updates-and-how-to-prevent-it/" rel="noopener noreferrer"&gt;https://makewpfast.com/why-wordpress-sites-crash-after-updates-and-how-to-prevent-it/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You click “Update” in your WordPress dashboard and hold your breath. Sometimes the update completes smoothly. Sometimes you get the white screen of death. WordPress updates — whether core, plugin, or theme — are the single most common cause of unexpected site crashes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Updates Break Things
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PHP Version Incompatibility
&lt;/h3&gt;

&lt;p&gt;A plugin updates to use PHP 8.x features, but your server runs PHP 7.4. Or the opposite — you upgrade PHP and an older plugin uses deprecated syntax. Either way: fatal error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Database Schema Changes
&lt;/h3&gt;

&lt;p&gt;Major plugin updates sometimes modify database tables. If the update fails midway or your database user lacks ALTER TABLE permissions, you end up with a half-migrated database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependency Conflicts
&lt;/h3&gt;

&lt;p&gt;Plugin A updates its bundled library to version 3.0. Plugin B still expects version 2.x of that same library. Both load, and whichever loads second crashes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interrupted Updates
&lt;/h3&gt;

&lt;p&gt;Closing the browser, a server timeout, or a hosting provider restart during an update leaves WordPress in maintenance mode with partially replaced files. This is especially dangerous during core updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pre-Update Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Back up everything&lt;/strong&gt; — Database and files. Verify the backup can be restored.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check compatibility&lt;/strong&gt; — Read the changelog. Check “Tested up to” PHP and WP versions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test on staging first&lt;/strong&gt; — Clone your site and run the update there. Most managed hosts offer one-click staging.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Update one at a time&lt;/strong&gt; — Never update core + 10 plugins simultaneously. If something breaks, you will not know which update caused it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitor after updating&lt;/strong&gt; — Check your site frontend and admin, run through key functionality, watch the error log for 24 hours.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recovering From a Failed Update
&lt;/h2&gt;

&lt;p&gt;If an update crashes your site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Remove maintenance mode:&lt;/strong&gt; Delete the &lt;code&gt;.maintenance&lt;/code&gt; file in your WordPress root&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugin crash:&lt;/strong&gt; Rename the offending plugin folder via FTP/SSH to deactivate it&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Core update failure:&lt;/strong&gt; Re-download WordPress and replace core files (keep wp-content and wp-config.php)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database migration failure:&lt;/strong&gt; Restore your database backup and try the update again&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When Recovery Gets Complicated
&lt;/h2&gt;

&lt;p&gt;Sometimes a failed update creates a cascade of issues — partial file replacements, broken database tables, corrupted options. If you are stuck in this situation, &lt;a href="https://fix-wp.com" rel="noopener noreferrer"&gt;fix-wp.com&lt;/a&gt; handles exactly these kinds of post-update crashes. The AI diagnostic identifies what went wrong in the update process and applies the targeted fix, with a full backup created before any changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automate the Safety Net
&lt;/h2&gt;

&lt;p&gt;Consider enabling automatic minor updates (they are on by default) but keeping major updates manual. Use a backup plugin that runs before every update. And always, always have a recovery plan before clicking that Update button.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Get WordPress Performance Tips
    Join developers and agency owners who get backend optimization strategies, tool releases, and deep-dive guides.





        Join Free


    No spam. Unsubscribe anytime. We respect your privacy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>wordpress</category>
      <category>performance</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Complete wp-config.php Performance Tuning Guide</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:10:12 +0000</pubDate>
      <link>https://dev.to/wpmultitool/the-complete-wp-configphp-performance-tuning-guide-nlp</link>
      <guid>https://dev.to/wpmultitool/the-complete-wp-configphp-performance-tuning-guide-nlp</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://makewpfast.com/the-complete-wp-config-php-performance-tuning-guide/" rel="noopener noreferrer"&gt;https://makewpfast.com/the-complete-wp-config-php-performance-tuning-guide/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;wp-config.php&lt;/code&gt; file is the control center of your WordPress installation. Most tutorials only cover database credentials, but this file holds the keys to significant performance improvements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory Limits
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'WP_MEMORY_LIMIT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'256M'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'WP_MAX_MEMORY_LIMIT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'512M'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;WP_MEMORY_LIMIT&lt;/code&gt; applies to frontend requests. &lt;code&gt;WP_MAX_MEMORY_LIMIT&lt;/code&gt; applies to admin tasks like updates and image processing. Set these based on your server capacity — going too high wastes memory, too low causes crashes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Post Revisions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'WP_POST_REVISIONS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, WordPress saves unlimited revisions for every post. A post edited 100 times has 100 revisions in the database. Setting this to 5 keeps the safety net while preventing database bloat. Set to &lt;code&gt;false&lt;/code&gt; to disable entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autosave Interval
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'AUTOSAVE_INTERVAL'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default is 60 seconds. On busy sites with many simultaneous editors, frequent autosaves create database pressure. Increase to 120 or 180 seconds unless you have editors who frequently lose work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trash Management
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'EMPTY_TRASH_DAYS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default is 30 days. Trashed posts still sit in the database and show up in queries. Reduce this for sites that delete content frequently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disable Cron on Page Load
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'DISABLE_WP_CRON'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WordPress runs cron tasks on page load by default. This adds latency for the unlucky visitor who triggers it. Disable this and set up a real server cron job instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;*&lt;/span&gt;/5 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://yoursite.com/wp-cron.php &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Concatenate Admin Scripts
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'CONCATENATE_SCRIPTS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This combines admin JavaScript files into fewer HTTP requests. Disable it if you experience admin JavaScript errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  File Edit Permissions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'DISALLOW_FILE_EDIT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This disables the theme and plugin editor in wp-admin. It is primarily a security measure, but it also prevents accidental edits that could crash your site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing All This Without SQL
&lt;/h2&gt;

&lt;p&gt;Editing wp-config.php manually works, but one typo can take your site down. &lt;a href="https://wpmultitool.com" rel="noopener noreferrer"&gt;WP Multitool&lt;/a&gt; provides a visual interface for managing wp-config.php performance settings, with automatic backups before each change and one-click rollback if something goes wrong.&lt;/p&gt;

&lt;p&gt;These settings are small individually, but combined they reduce database size, lower memory usage, and eliminate unnecessary processing on every request.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Get WordPress Performance Tips
    Join developers and agency owners who get backend optimization strategies, tool releases, and deep-dive guides.





        Join Free


    No spam. Unsubscribe anytime. We respect your privacy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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