<?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.us-east-2.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>WP Multitool 1.9.7: the underscore in wp_ is a SQL wildcard</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Tue, 15 Sep 2026 06:49:48 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wp-multitool-197-the-underscore-in-wp-is-a-sql-wildcard-3a5h</link>
      <guid>https://dev.to/wpmultitool/wp-multitool-197-the-underscore-in-wp-is-a-sql-wildcard-3a5h</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/09/15/wp-multitool-1-9-7/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/09/15/wp-multitool-1-9-7/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An underscore in a SQL &lt;code&gt;LIKE&lt;/code&gt; pattern is a wildcard. It matches exactly one character, any character. Every WordPress table prefix ends in one. So does every transient option name.&lt;/p&gt;

&lt;p&gt;I shipped two bugs on the back of that, and they went out in WP Multitool 1.9.7 as fixes. Here’s what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The query that looked fine for years
&lt;/h2&gt;

&lt;p&gt;Finding your own tables looks obvious:&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="no"&gt;SELECT&lt;/span&gt; &lt;span class="no"&gt;TABLE_NAME&lt;/span&gt; &lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="no"&gt;TABLES&lt;/span&gt;
&lt;span class="no"&gt;WHERE&lt;/span&gt; &lt;span class="no"&gt;TABLE_NAME&lt;/span&gt; &lt;span class="no"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'wp_%'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran that against a table holding four names to see what it really matches:&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="n"&gt;naive&lt;/span&gt;   &lt;span class="no"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'wp_%'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;wp_posts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wpXanything&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wp2_options&lt;/span&gt;
&lt;span class="n"&gt;esc_like&lt;/span&gt;            &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;wp_posts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The underscore matched the &lt;code&gt;X&lt;/code&gt;. It matched the &lt;code&gt;2&lt;/code&gt;. On a shared database with more than one WordPress install, or next to any table that happens to start with “wp”, that pattern reaches tables I have no business touching.&lt;/p&gt;

&lt;p&gt;In my Database Optimizer that mattered twice. Table stats listed foreign tables as if they were yours. Worse, the optimize loop ran &lt;code&gt;OPTIMIZE TABLE&lt;/code&gt; on them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same bug, one letter wide, in transients
&lt;/h2&gt;

&lt;p&gt;Transient cleanup has the same shape:&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="no"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;option_name&lt;/span&gt; &lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_options&lt;/span&gt;
&lt;span class="no"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;option_name&lt;/span&gt; &lt;span class="no"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'_transient_timeout_%'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three underscores in that prefix, three single-character wildcards. It matches &lt;code&gt;_transient_timeout_something&lt;/code&gt;, which is what you want. It also matches &lt;code&gt;xtransient_timeout_y&lt;/code&gt;, which is not a transient at all.&lt;/p&gt;

&lt;p&gt;That inflated the transient counts I was showing people. And in the cleanup path it meant backing up and deleting options that were never transients. A plugin storing a setting under an unlucky name would have lost it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix is one function
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;$wpdb-&amp;gt;esc_like()&lt;/code&gt; escapes the LIKE metacharacters and leaves everything else alone. It does not escape quotes, so it goes &lt;em&gt;inside&lt;/em&gt; &lt;code&gt;prepare()&lt;/code&gt;, not instead of it:&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="nv"&gt;$pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$wpdb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;esc_like&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$wpdb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$wpdb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get_col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$wpdb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME LIKE %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;$pattern&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 trailing &lt;code&gt;%&lt;/code&gt; is appended after the escaping, because that one is meant to be a wildcard. &lt;code&gt;esc_like( 'wp_' )&lt;/code&gt; returns &lt;code&gt;wp\_&lt;/code&gt;. That is the whole fix.&lt;/p&gt;

&lt;p&gt;If you write WordPress code, go grep your own plugins for &lt;code&gt;LIKE '&lt;/code&gt; right now. I found mine by reading a query I’d read a dozen times before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I went looking at the admin, and that went the same way
&lt;/h2&gt;

&lt;p&gt;Someone messaged me that the buttons in the plugin admin looked off. Icons sitting a few pixels below their labels. On the Dashboard Widgets screen you had to hover a row before you could see which widget it referred to.&lt;/p&gt;

&lt;p&gt;I went to fix the icons and ended up measuring all 17 admin screens instead – computed font size, contrast ratio, click target size, horizontal overflow, at five widths from 1440 down to 390.&lt;/p&gt;

&lt;p&gt;409 elements had text under 14px. The muted grey I use for secondary text everywhere came in at 3.49:1, under the &lt;a href="https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html" rel="noopener noreferrer"&gt;4.5:1 AA floor&lt;/a&gt;. One entire screen – Updates – was rendering in the default light WordPress theme because its wrapper was missing a class, so the heading sat at 1.25:1 against the background. I had been looking at that page for months.&lt;/p&gt;

&lt;p&gt;The hover bug had a cause I didn’t expect. WordPress core parks row action links off-screen at &lt;code&gt;left:-119988px&lt;/code&gt; and only brings them back on hover. That is core behaviour for list tables, and the widget hook IDs were riding along with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The audit that gave itself a pass
&lt;/h2&gt;

&lt;p&gt;This is the part I keep thinking about.&lt;/p&gt;

&lt;p&gt;After the first round of fixes, my measuring script reported nothing left to fix. That was wrong. The check was “flag anything with a font size below 14px”, which silently skips anything at exactly 0.&lt;/p&gt;

&lt;p&gt;An element at &lt;code&gt;font-size: 0&lt;/code&gt; renders invisible. Mine was scoring it as a pass. And it was the original reported bug – the widget hook IDs, still at 0px at phone width, certified clean by the thing I built to catch it.&lt;/p&gt;

&lt;p&gt;WordPress core sets &lt;code&gt;.row-actions span { font-size: 0 }&lt;/code&gt; at mobile widths. My rule set the colour and the font family on those IDs but never declared a font size, so core’s zero won uncontested. Two separate misses stacked on the same element.&lt;/p&gt;

&lt;p&gt;A test that cannot fail the way the bug actually happens will pass forever. I’d rather learn that on a font size than on a payment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else is in 1.9.7
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://wpmultitool.com/blog/wordpress-site-doctor/" rel="noopener noreferrer"&gt;Site Doctor&lt;/a&gt; stopped reporting Performance Lab’s Server-Timing drop-in as a dead object cache. Every site running &lt;a href="https://wordpress.org/plugins/performance-lab/" rel="noopener noreferrer"&gt;Performance Lab&lt;/a&gt; got a critical finding telling the owner to delete &lt;code&gt;wp-content/object-cache.php&lt;/code&gt;. That file is not an object cache, its own header says so, and deleting it only breaks Server-Timing measurement. It also gets written straight back by the plugin, so the advice now names the constant that actually settles it – &lt;code&gt;PERFLAB_DISABLE_OBJECT_CACHE_DROPIN&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Site Doctor also learned four LiteSpeed misconfigurations, read through LiteSpeed Cache’s own filter rather than raw options: the WooCommerce product update interval, Guest Mode blocked by a &lt;code&gt;.htaccess&lt;/code&gt; PHP deny-all, Serve Stale turned off, and WebP Express endpoints missing from the allow-list. Nothing is written back, the remediation is copy-paste.&lt;/p&gt;

&lt;p&gt;Frontend Optimizer can now stop the empty-cart WooCommerce session cookie for logged-out visitors. WooCommerce sets a session cookie speculatively, and a &lt;code&gt;Set-Cookie&lt;/code&gt; on an anonymous request forces a cache bypass on every hit behind a CDN or page cache. It is skipped on cart, checkout, my-account and REST, and only fires when the cart is genuinely empty and the visitor is logged out.&lt;/p&gt;

&lt;p&gt;The Action Scheduler screen updates its numbers in place after Unstick, Run Queue and Clean. It used to run the action, tell you it worked, and leave the old counts on screen with a note asking you to refresh.&lt;/p&gt;

&lt;p&gt;And the admin sweep shipped: text raised above 14px, contrast fixed, focus rings you can see when you tab, click targets at 24px or more, no sideways scrolling on a phone, and the native blue-and-white checkboxes replaced with the plugin’s own toggle. All 1505 strings are translated across six languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Updating
&lt;/h2&gt;

&lt;p&gt;If you use Database Optimizer or clean transients, take this one. The two LIKE fixes are the reason it leads the changelog.&lt;/p&gt;

&lt;p&gt;Auto-updates handle it if you have them on. Otherwise it’s in your Plugins screen, or on the &lt;a href="https://wpmultitool.com/docs/downloads-and-license/" rel="noopener noreferrer"&gt;downloads page&lt;/a&gt; with your licence key.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Is My WordPress Admin So Slow? A Diagnostic Guide</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Mon, 14 Sep 2026 08:15:18 +0000</pubDate>
      <link>https://dev.to/wpmultitool/why-is-my-wordpress-admin-so-slow-a-diagnostic-guide-5d2h</link>
      <guid>https://dev.to/wpmultitool/why-is-my-wordpress-admin-so-slow-a-diagnostic-guide-5d2h</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/09/13/why-is-my-wordpress-admin-so-slow/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/09/13/why-is-my-wordpress-admin-so-slow/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Why is my WordPress admin so slow? Most slow-admin reports land in my inbox sounding the same. One wordpress.org poster put it perfectly: pages “&lt;a href="https://wordpress.org/support/topic/wordpress-admin-panel-is-running-extremely-slow/" rel="noopener noreferrer"&gt;are taking 20-30 Seconds to load any page only in /wp-admin/&lt;/a&gt;. The frontend of site is running smoothly without any issue.”&lt;/p&gt;

&lt;p&gt;The short answer is hiding in the question. Your homepage is cached. Your dashboard never is. Page cache hands saved HTML to logged-out visitors and steps aside the moment it sees a login cookie, so every wp-admin click runs the whole stack: PHP boots, every active plugin loads its admin code, the database answers whatever that screen asks for. A slow admin is your site’s real, uncached speed, with nothing hiding it.&lt;/p&gt;

&lt;p&gt;The causes are a short list, and you can find yours in about fifteen minutes. Here’s the order I check them on client sites, cheapest test first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: Prove it’s the server, not the browser
&lt;/h2&gt;

&lt;p&gt;Before touching anything, open the slow admin page, hit F12, go to the Network tab and reload. Click the first request (the HTML document) and open its Timing panel. “Waiting for server response” is your TTFB: everything the server did before the browser received a single byte.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Admin TTFB&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Under ~600ms&lt;/td&gt;
&lt;td&gt;Normal for uncached WordPress. If the page still feels slow, your problem is JavaScript, not PHP.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600ms to 2s&lt;/td&gt;
&lt;td&gt;Backend work worth digging into. Keep reading.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over 2s&lt;/td&gt;
&lt;td&gt;Something specific is broken. Keep reading, it’s probably one loud culprit.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If TTFB is fine but the editor still lags, that’s a different problem (browser JS, metaboxes, autosave). This post is about server-side slowness.&lt;/p&gt;

&lt;p&gt;Once you’ve confirmed it’s the server, match your symptom to a starting point:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Every admin screen equally slow&lt;/td&gt;
&lt;td&gt;Autoloaded options, then object cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dashboard home is the slow one&lt;/td&gt;
&lt;td&gt;Dashboard widgets, external HTTP calls, update checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Editor lags, saving feels heavy&lt;/td&gt;
&lt;td&gt;Heartbeat, autosave, metaboxes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin list or settings screens crawl&lt;/td&gt;
&lt;td&gt;License checks and other phone-home calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow only when several people are logged in&lt;/td&gt;
&lt;td&gt;Heartbeat ticks eating PHP workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow some hours, fine others&lt;/td&gt;
&lt;td&gt;Update checks firing through a broken object-cache gate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Site Health already knows about your admin
&lt;/h2&gt;

&lt;p&gt;Go to Tools → Site Health. Two of its checks are aimed straight at this problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Autoloaded options could affect performance”&lt;/strong&gt; – since WordPress 6.6, Site Health measures the total size of your autoloaded options and flags the site once it passes 800,000 bytes. If you see this warning, that’s very likely your answer. Skip to the next section.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Page cache is detected but the server response time is still slow”&lt;/strong&gt; – people paste this exact string into Google. Two things worth knowing about it. First, the test requests your homepage three times and takes the median; under 600ms is “good” (that threshold lives in core as &lt;code&gt;site_status_good_response_time_threshold&lt;/code&gt;, filterable if you disagree with it). Second, the message means even your cached front end is slow to produce, a bigger problem than a slow admin. If Site Health is green while wp-admin drags, don’t be surprised. Site Health can only measure the public side; admin slowness is invisible to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weigh your autoloaded options
&lt;/h2&gt;

&lt;p&gt;Every row in &lt;code&gt;wp_options&lt;/code&gt; has an &lt;code&gt;autoload&lt;/code&gt; flag. Rows marked for autoload get pulled into PHP memory in a single query at the start of every request: front end, admin, admin-ajax, REST, everything. It’s a good optimization for a handful of small settings. Over years of installing and removing plugins it stops being small.&lt;/p&gt;

&lt;p&gt;Check the total (via WP-CLI, &lt;code&gt;wp db query&lt;/code&gt;, or phpMyAdmin):&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="no"&gt;SELECT&lt;/span&gt; &lt;span class="nb"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;option_value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&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;autoload_kb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="nb"&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;AS&lt;/span&gt; &lt;span class="n"&gt;rows_n&lt;/span&gt;
&lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_options&lt;/span&gt;
&lt;span class="no"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;autoload&lt;/span&gt; &lt;span class="nf"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'yes'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'on'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'auto'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'auto-on'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then see who the weight belongs to:&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="no"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;option_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;option_value&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;bytes&lt;/span&gt;
&lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_options&lt;/span&gt;
&lt;span class="no"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;autoload&lt;/span&gt; &lt;span class="nf"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'yes'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'on'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'auto'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'auto-on'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;ORDER&lt;/span&gt; &lt;span class="no"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="no"&gt;DESC&lt;/span&gt;
&lt;span class="no"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran both on a test site of mine (WP 7.1, WooCommerce, a normal plugin stack). Result: &lt;strong&gt;997KB across 355 rows&lt;/strong&gt;. The top offenders:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;option_name&lt;/th&gt;
&lt;th&gt;size&lt;/th&gt;
&lt;th&gt;belongs to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;wpseo_taxonomy_meta&lt;/td&gt;
&lt;td&gt;293KB&lt;/td&gt;
&lt;td&gt;Yoast SEO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wpseo_titles&lt;/td&gt;
&lt;td&gt;152KB&lt;/td&gt;
&lt;td&gt;Yoast SEO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;woocommerce_marketplace_suggestions&lt;/td&gt;
&lt;td&gt;140KB&lt;/td&gt;
&lt;td&gt;WooCommerce&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;elementor_remote_info_library&lt;/td&gt;
&lt;td&gt;86KB&lt;/td&gt;
&lt;td&gt;Elementor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wc_stripe_cached_payment_methods&lt;/td&gt;
&lt;td&gt;84KB&lt;/td&gt;
&lt;td&gt;Stripe gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Yoast isn’t even installed on that site anymore. It left about 445KB of autoloaded settings behind, and WordPress happily loads them on every request. The WooCommerce and Stripe entries are cached data that never needed autoload in the first place.&lt;/p&gt;

&lt;p&gt;You’d think WordPress 6.6 fixed this. Partly. Since 6.6, an option saved without an explicit autoload flag gets stored as &lt;code&gt;auto-off&lt;/code&gt; once it exceeds 150KB, and Site Health reports the total. But nothing is cleaned retroactively, and plugins that explicitly ask for autoload keep it, which is why my 293KB &lt;code&gt;wpseo_taxonomy_meta&lt;/code&gt; still says &lt;code&gt;on&lt;/code&gt;. The details are in the &lt;a href="https://make.wordpress.org/core/2024/06/18/options-api-disabling-autoload-for-large-options/" rel="noopener noreferrer"&gt;6.6 dev note&lt;/a&gt; if you want the mechanics.&lt;/p&gt;

&lt;p&gt;The fix: delete options left by plugins you removed, and flip &lt;code&gt;autoload&lt;/code&gt; off for big options the site still needs but not on every request. I wrote the full procedure, including how to tell a leftover from a live option, in &lt;a href="https://wpmultitool.com/autoload-bloat/" rel="noopener noreferrer"&gt;the autoload bloat guide&lt;/a&gt;. If you’d rather not run SQL by hand, the Autoloader Optimizer module in WP Multitool does this analysis and the cleanup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make sure your object cache is actually caching
&lt;/h2&gt;

&lt;p&gt;A persistent object cache (Redis or Memcached) is the biggest admin speedup available on a query-bound site, because wp-admin runs everything uncached and every repeated lookup hits MySQL without one. If your host offers Redis, use it. One caveat worth knowing: it won’t rescue a bloated autoload set. The &lt;code&gt;alloptions&lt;/code&gt; blob still lands in PHP memory on every request, it just arrives from Redis instead of MySQL.&lt;/p&gt;

&lt;p&gt;The catch: “Redis: Connected” in a plugin’s settings page proves the socket opened. It says nothing about whether your data is being cached. I’ve seen Redis connected with &lt;code&gt;maxmemory-policy&lt;/code&gt; set to &lt;code&gt;noeviction&lt;/code&gt;: once memory fills, every write fails silently and you’re paying the Redis latency for zero benefit. Or the &lt;code&gt;options&lt;/code&gt; group sitting on the ignore list, so the one table that matters most bypasses the cache on every request.&lt;/p&gt;

&lt;p&gt;Checks that matter: the &lt;code&gt;object-cache.php&lt;/code&gt; drop-in actually exists in wp-content, the hit rate is healthy, there’s headroom under &lt;code&gt;maxmemory&lt;/code&gt;, and the eviction policy isn’t &lt;code&gt;noeviction&lt;/code&gt;. I wrote a whole post on this failure mode: &lt;a href="https://wpmultitool.com/blog/redis-connected-is-not-working/" rel="noopener noreferrer"&gt;Redis: Connected Is Not Working&lt;/a&gt;. WP Multitool’s Site Doctor runs these checks against the live server, and it’s in the Lite edition ($9 one-time), no Pro license needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch admin-ajax.php while you’re doing nothing
&lt;/h2&gt;

&lt;p&gt;Open wp-admin, filter the Network tab to &lt;code&gt;admin-ajax&lt;/code&gt;, and just sit there. You’ll likely see requests firing on a timer while you touch nothing.&lt;/p&gt;

&lt;p&gt;That’s the &lt;a href="https://developer.wordpress.org/plugins/javascript/heartbeat-api/" rel="noopener noreferrer"&gt;Heartbeat API&lt;/a&gt;. It ticks somewhere between every 15 and 120 seconds per open admin screen, depending on the screen, powering autosave, post locks and session warnings. Every tick is a POST to &lt;code&gt;admin-ajax.php&lt;/code&gt;, and every one boots the entire WordPress stack. The &lt;a href="https://developer.wordpress.org/plugins/javascript/ajax/" rel="noopener noreferrer"&gt;official AJAX docs&lt;/a&gt; put it plainly: all WordPress AJAX requests must be sent to &lt;code&gt;admin-ajax.php&lt;/code&gt;. So every AJAX call goes through one file, with a full bootstrap and no page cache.&lt;/p&gt;

&lt;p&gt;On a solo admin session it’s minor. With three editors holding post edit screens open, you get a steady stream of uncached full-boot requests competing for PHP workers with your real clicks. Throttle it to 60 seconds (Heartbeat Control is free), but keep it enabled in the editor, because that’s what autosave and post locking run on.&lt;/p&gt;

&lt;p&gt;If you see admin-ajax requests that aren’t the heartbeat, repeating every few seconds with plugin-specific action names, some plugin is polling your server while you work. Worth finding out which.&lt;/p&gt;

&lt;h2&gt;
  
  
  Catch the plugin doing the damage
&lt;/h2&gt;

&lt;p&gt;When the checks above come back clean and admin is still slow, it’s usually one plugin loading something heavy on every admin screen. The tool is Query Monitor (free, by John Blackbourn). Install it, open the slow screen, and read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Queries by component&lt;/strong&gt; – which plugin owns the query time. A plugin running 200 queries on a dashboard it has no business touching shows up immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP API calls&lt;/strong&gt; – external requests blocking the page render. One wordpress.org thread I keep coming back to had a 13-second wp-admin caused entirely by outbound HTTP calls: update checks, license pings, notification feeds, each taking 0.3 to 0.8s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scripts and styles enqueued&lt;/strong&gt; – plugins that load their entire UI on every admin page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The toggle test works too (deactivate half, test, bisect), but do it on staging. I covered the full isolation method in &lt;a href="https://wpmultitool.com/blog/how-to-find-which-plugin-is-slowing-wordpress/" rel="noopener noreferrer"&gt;how to find which plugin is slowing WordPress&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The api.wordpress.org tax, briefly
&lt;/h2&gt;

&lt;p&gt;WordPress checks api.wordpress.org for core, plugin and theme updates roughly twice a day, gated by a &lt;code&gt;last_checked&lt;/code&gt; timestamp inside the update transients. If your object cache drops those transients (dead Redis, aggressive flushing, an orphaned drop-in), the gate falls through and WordPress fires a blocking update check on admin page loads. I measured this and wrote it up separately: &lt;a href="https://wpmultitool.com/blog/wordpress-update-checks-every-page-load/" rel="noopener noreferrer"&gt;why WordPress hammers api.wordpress.org on every admin page load&lt;/a&gt;. If your admin is &lt;em&gt;intermittently&lt;/em&gt; slow, fine for hours then suddenly 10 seconds, this is the first thing to suspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  WooCommerce adds its own layer
&lt;/h2&gt;

&lt;p&gt;Everything above applies double to WooCommerce admin. On top of it, WooCommerce queues background work through Action Scheduler, and the &lt;code&gt;wp_actionscheduler_actions&lt;/code&gt; table quietly accumulates completed and failed rows. On a busy store that table can grow to hundreds of thousands of rows, and admin screens that scan the queue get slower with it. Worth a look if the Orders and Products screens are your slow ones specifically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The order I actually run this in
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;TTFB in the Network tab&lt;/strong&gt; – is it the server at all?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site Health&lt;/strong&gt; – autoload warning? Page-cache-but-slow warning?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autoload size SQL&lt;/strong&gt; – over ~800KB, trim it before anything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object cache verified working&lt;/strong&gt; – connected and actually caching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;admin-ajax in the Network tab&lt;/strong&gt; – heartbeat flood or a polling plugin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query Monitor on the slowest screen&lt;/strong&gt; – queries by component, HTTP calls.&lt;/li&gt;
&lt;li&gt;Fix the thing you measured. Retest. Stop when it’s fast.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every slow admin I’ve fixed had one dominant cause, and it was almost never the one the site owner suspected going in. That’s the argument for measuring first.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why is my WordPress admin slow but the website is fast?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because the public site is served from page cache and wp-admin never is. Every admin click runs the full PHP/database/plugin stack, so the dashboard exposes your site’s real backend speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a good wp-admin load time?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Core’s Site Health uses 600ms median server response as its “good” threshold. For wp-admin, under a second TTFB feels normal, 1 to 3 seconds means something wants attention, and over 3 seconds means something is broken.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Redis object cache speed up wp-admin?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usually, yes. wp-admin is query-heavy and uncached, so serving repeated lookups from memory helps more there than on the cached front end. Verify it’s actually caching, not just connected: hit rate, memory headroom, and a sane eviction policy all matter.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>WordPress MCP: The Three Kinds of AI Plugins</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Mon, 07 Sep 2026 08:15:16 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wordpress-mcp-the-three-kinds-of-ai-plugins-2f9g</link>
      <guid>https://dev.to/wpmultitool/wordpress-mcp-the-three-kinds-of-ai-plugins-2f9g</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/09/07/wordpress-mcp-three-kinds-of-ai/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/09/07/wordpress-mcp-three-kinds-of-ai/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;“AI plugin” means three different things in WordPress now, and most roundups I read mix them into one list. A plugin that writes your product descriptions and a plugin that lets Claude run PHP on your server share a category in every “best AI plugins” article I’ve read. They shouldn’t. What follows is a map of WordPress MCP and AI-agent plugins, built from a survey of the field on 2026-09-02 and hands-on tests I ran on live local sites.&lt;/p&gt;

&lt;p&gt;I don’t rank by WordPress.org active-install counts. That number is trivially spoofable, and ranking by it rewards a plugin for being popular rather than for being good. Everything here is ranked on what the agent is allowed to do, what is on by default, where credentials and site data end up, and whether actions are reversible.&lt;/p&gt;

&lt;p&gt;If you want the deep test of what an MCP client actually receives from the two hosts below, that is &lt;a href="https://dev.to/blog/ai-agent-connects-wordpress-mcp/"&gt;the companion piece: what an AI agent sees when it connects to WordPress&lt;/a&gt;. Short version: both Albert and Novamira expose exactly the same three gateway tools. The differences sit behind that door.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three kinds
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Agent touches your site?&lt;/th&gt;
&lt;th&gt;Examples from this survey&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Text generators&lt;/td&gt;
&lt;td&gt;Write copy, images, SEO meta&lt;/td&gt;
&lt;td&gt;No – output goes to you, not to your database&lt;/td&gt;
&lt;td&gt;Yoast/Rank Math AI, GetGenie, Divi AI, CodeWP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP content-admin servers&lt;/td&gt;
&lt;td&gt;Let an external AI client (Claude, ChatGPT) read and edit content over MCP&lt;/td&gt;
&lt;td&gt;Yes – curated, typed actions on posts, pages, users, media&lt;/td&gt;
&lt;td&gt;Albert, Agent Abilities for MCP, Royal MCP, Easy MCP AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP-execution hosts&lt;/td&gt;
&lt;td&gt;Let the agent run code, shell commands, and file operations inside WordPress&lt;/td&gt;
&lt;td&gt;Yes – effectively unrestricted admin-level code&lt;/td&gt;
&lt;td&gt;Novamira, Cowboy MCP Power Mode, Angie Super Admin, AI Engine YOLO&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The border between the second and third kind is the whole security conversation. Both connect through the same door, and on both of the hosts I tested, that door is the official WordPress MCP Adapter exposing three meta-tools: discover abilities, get ability info, execute ability.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Abilities API actually is
&lt;/h2&gt;

&lt;p&gt;WordPress 6.9 shipped the Abilities API: a standard way for a plugin to register a typed, permission-checked action, &lt;code&gt;wp_register_ability&lt;/code&gt;. The &lt;a href="https://github.com/WordPress/mcp-adapter" rel="noopener noreferrer"&gt;official MCP Adapter&lt;/a&gt; turns registered abilities into an MCP server, so an external client like Claude Desktop can discover and execute them over OAuth. The &lt;a href="https://developer.wordpress.org/news/2026/02/from-abilities-to-ai-agents-introducing-the-wordpress-mcp-adapter/" rel="noopener noreferrer"&gt;introduction post&lt;/a&gt; on the developer blog is the canonical description.&lt;/p&gt;

&lt;p&gt;The consequence for buyers: a host that speaks the Abilities API can surface abilities from any plugin that registers them, without integration work on either side. The consequence for plugin authors: register once, work everywhere.&lt;/p&gt;

&lt;p&gt;On 2026-09-02 the WordPress.org plugin directory returned 384 plugins matching “mcp” and 1,513 matching “AI assistant”. Many of those are noise for this map: SEO plugins that mention MCP in their copy, chat widgets, wrappers. The buckets below are the ones that actually operate a site or speak the standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The category map (2026-09-02)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Official building blocks
&lt;/h3&gt;

&lt;p&gt;The canonical AI plugin (1.3.0) ships an Abilities Explorer and lists an MCP server as coming. The MCP Adapter itself is at 0.6.1. Automattic’s earlier wordpress-mcp plugin was archived in January 2026 in its favor. WordPress.com runs a hosted MCP with write abilities on paid plans. If you are picking a self-hosted route today, the adapter plus a host plugin is the pattern both products I tested build on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Curated MCP servers
&lt;/h3&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;The bet&lt;/th&gt;
&lt;th&gt;What I verified or read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Albert&lt;/td&gt;
&lt;td&gt;Curated CRUD, production-shaped defaults&lt;/td&gt;
&lt;td&gt;Tested hands-on: writes off by default in code, privacy layer, per-block editing, no code execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent Abilities for MCP&lt;/td&gt;
&lt;td&gt;Governance first&lt;/td&gt;
&lt;td&gt;153 abilities, off by default, official adapter, audit log, least-privilege user. The governance benchmark in this category&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Royal MCP&lt;/td&gt;
&lt;td&gt;Undo as a feature&lt;/td&gt;
&lt;td&gt;200+ tools, OAuth, 72-hour undo window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Easy MCP AI&lt;/td&gt;
&lt;td&gt;Scale&lt;/td&gt;
&lt;td&gt;243 tools, acquired by Themeisle, auto-discovers abilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;miniOrange Secure MCP&lt;/td&gt;
&lt;td&gt;Enterprise posture&lt;/td&gt;
&lt;td&gt;OAuth 2.1, human-in-the-loop, DLP; optional vendor gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WPVibe&lt;/td&gt;
&lt;td&gt;Convenience over custody&lt;/td&gt;
&lt;td&gt;Relays through wpvibe.ai and stores application passwords, encrypted, off-site. The trust-model outlier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable Abilities for MCP&lt;/td&gt;
&lt;td&gt;Adapter-native&lt;/td&gt;
&lt;td&gt;Capable, but abilities default ON. Wrong default for this class&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  PHP-execution hosts
&lt;/h3&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;The bet&lt;/th&gt;
&lt;th&gt;What I verified or read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Novamira&lt;/td&gt;
&lt;td&gt;The agent as site operator&lt;/td&gt;
&lt;td&gt;Tested hands-on: 41 own abilities including PHP, filesystem, WP-CLI; all MCP-public behind the gateway with Hub toggles as the gate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cowboy MCP&lt;/td&gt;
&lt;td&gt;Typed tools plus safety nets on live sites&lt;/td&gt;
&lt;td&gt;Undo and DB checkpoints, Power Mode for WP-CLI/files. Publishes its own comparison page against Novamira&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angie Super Admin Mode&lt;/td&gt;
&lt;td&gt;Opt-in power inside a chat product&lt;/td&gt;
&lt;td&gt;Filesystem/DB/PHP behind a toggle; MCP added in 1.1.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Engine YOLO&lt;/td&gt;
&lt;td&gt;The escape hatch, honestly labeled&lt;/td&gt;
&lt;td&gt;GitHub-only companion to AI Engine, explicitly not for production&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;AI Engine deserves its own line here: the official plugin ships an MCP server and a workspace with approval steps, and explicitly refuses to include PHP execution. The YOLO companion exists for people who want that. That is the cleanest default posture I found in the chat products.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chat agents and the rest
&lt;/h3&gt;

&lt;p&gt;In-admin chat agents (AI Engine, Angie, Uncanny Automator, Hostinger, SiteGround) put the model inside wp-admin instead of connecting an external client. SiteGround’s is the cautionary tale in this bucket: a 1.6-star rating with 81 one-star reviews at survey time, mostly about being auto-installed without consent. Auto-installing a plugin without consent is worse than anything on its feature list. Text generators (CodeWP, GetGenie, the SEO suites’ AI) are a different category entirely and I left them out of the comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  The head-to-head that matters: behind the same three tools
&lt;/h2&gt;

&lt;p&gt;I tested Albert 1.3.1 and Novamira Free 1.12.2 on live local sites, connected an MCP client to both, and captured everything. The tool lists are identical: three adapter meta-tools each, no per-ability tools, no pagination. So comparing them on “MCP support” is comparing identical things. The differences:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catalog.&lt;/strong&gt; Novamira registers 41 of its own abilities, including three code-execution abilities, eight filesystem abilities, a WP-CLI ability, and an admin-access ability. All of them were MCP-public on my test site, with the Hub’s toggles as the gate. Albert ships 35 abilities of pure CRUD. No PHP, no filesystem, no WP-CLI anywhere in the plugin.&lt;/p&gt;

&lt;p&gt;&lt;a href="/wp-content/uploads/2026/09/novamira-tools-tab-3-meta-tools.webp" class="article-body-image-wrapper"&gt;&lt;img src="/wp-content/uploads/2026/09/novamira-tools-tab-3-meta-tools.webp" alt="The complete MCP tool list on Novamira: three adapter meta-tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The consent screen.&lt;/strong&gt; Novamira’s OAuth consent lists the grant in plain words: execute PHP and WP-CLI, read/write/delete server files, create temporary administrator access. Albert’s consent names the app and the code destination but doesn’t enumerate the grant. Novamira’s screen is the more honest of the two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The domain lock.&lt;/strong&gt; When I cloned the site to a new hostname, Novamira disabled its entire MCP surface until an admin re-enabled it. A stolen copy of the site won’t serve MCP on the attacker’s host. I found no equivalent in Albert and didn’t test a configured Albert install on a moved hostname.&lt;/p&gt;

&lt;p&gt;Albert shipped 1.4.0 the evening I finished testing, and it changes none of the above: a new Context screen that tells assistants what your site is, file sending from assistants, an admin redesign, WordPress 7.1 support. On a fresh 1.4.0 install the Abilities screen shows 46 rows with one contributing plugin, against 44 on the 1.3.1 I tested.&lt;/p&gt;

&lt;p&gt;For a second opinion on the PHP-host model, &lt;a href="https://wordpress.org/plugins/cowboy-mcp/" rel="noopener noreferrer"&gt;Cowboy MCP&lt;/a&gt; publishes its own comparison page against Novamira, linked from its WordPress.org page. My survey read it as the typed-tools-with-undo-on-live-sites bet, positioned against Novamira’s PHP-on-staging-with-backups model. A competitor publishing a comparison against the category leader is worth your reading time, whatever you end up choosing, and it is why I cite it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one documentation failure I found
&lt;/h2&gt;

&lt;p&gt;On 2026-09-02, Albert’s own pages stated its ability count as 15, 35+, and 100+ in three different places, and none matched the 44 rows its admin screen showed on a fresh install. That was the only claim of Albert’s that failed in my ten-claim test. Everything else I attacked, from write-defaults to privacy masking to the no-phone-home claim, held. Albert shipped 1.4.0 the evening I tested: the fresh-install screen now shows 46 rows, the wp.org page’s 35+ claim is gone, and the homepage still says 15 and 100+. Checkable numbers, checked and dated.&lt;/p&gt;

&lt;p&gt;&lt;a href="/wp-content/uploads/2026/09/albert-abilities-46-rows.webp" class="article-body-image-wrapper"&gt;&lt;img src="/wp-content/uploads/2026/09/albert-abilities-46-rows.webp" alt="Albert"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s the standard every table on this page should meet, including mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would choose
&lt;/h2&gt;

&lt;p&gt;The survey behind this post ended with a recommendation I still stand behind after the hands-on tests: staging plus Novamira or Cowboy for agency work where the agent builds and fixes things; Albert or Enable Abilities for content CRUD only; and never PHP execution on production. The tests moved one word for me: Albert’s write defaults and privacy layer held up under attack, so “Albert for content CRUD” is a stronger recommendation now than it was on paper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a diagnostics plugin sits
&lt;/h2&gt;

&lt;p&gt;I make WP Multitool. It registers six read-only abilities: a whole-site quickstart scan, a health snapshot, an autoload report, slow-query stats, Redis diagnostics, and a Site Doctor scan. The opt-in is off by default. The abilities are annotated read-only, which is what keeps them available under Albert’s default policy of disabling everything non-read-only.&lt;/p&gt;

&lt;p&gt;On Albert, all six appeared in its admin UI and in the agent’s discovery list. On Novamira, all six appeared in the Hub and in the live registry, and the quickstart scan executed end-to-end through its gateway. Zero host-specific code on my side, either way. Hosts will come and go – the registration surface is the part that should outlast them, and it’s the bet I’ve made with six read-only abilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="/wp-content/uploads/2026/09/novamira-hub-41-plus-6.webp" class="article-body-image-wrapper"&gt;&lt;img src="/wp-content/uploads/2026/09/novamira-hub-41-plus-6.webp" alt="Novamira"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run agents against WordPress sites, the practical writeup for pointing them at the CLI side is &lt;a href="https://dev.to/blog/how-to-make-your-ai-agent-use-wp-multitool/"&gt;how to make your AI agent use WP Multitool&lt;/a&gt;, and the Novamira-specific pairing, including the skill file I ship inside the plugin, is in &lt;a href="https://dev.to/blog/wp-multitool-x-novamira-powerful-combo/"&gt;the combo post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did not verify
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Search volume numbers. I found competing guides already ranking for “wordpress MCP” (smartwp.com, June 2026; nexterwp.com, July 2026), which is demand evidence, but I loaded no keyword tool.&lt;/li&gt;
&lt;li&gt;The current release state of every plugin in the map. The survey is dated 2026-09-02. Six of the listed plugins shipped a release in the week before it. Re-check versions before you buy anything off this table; I will re-check before this publishes.&lt;/li&gt;
&lt;li&gt;Product pages I could not load: CodeWP pricing, WPTurbo, AutoWP, AI Mojo, WPBot, Divi AI. They stay out of the comparison tables.&lt;/li&gt;
&lt;li&gt;Whether Albert and Novamira coexist on one site.&lt;/li&gt;
&lt;li&gt;Novamira’s own data handling and its Chat feature. I tested Albert’s privacy layer; Novamira’s stayed out of scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;I make WP Multitool, a paid diagnostics plugin. As of 1.9.6 it can register six read-only Abilities and it ships a Novamira skill file. I’m not affiliated with Dynamic.ooo, with Albert, Cowboy, or with any other plugin here. I tested Albert and Novamira on local copies. WP Multitool is a data provider to these agents, not a competitor. I benefit if more sites adopt the Abilities API, whichever host they pick.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Category survey dated 2026-09-02; hands-on tests run 2026-09-03 against Albert 1.3.1 and Novamira Free 1.12.2. Install counts deliberately absent from every table. The companion post with the full test capture is &lt;a href="https://dev.to/blog/ai-agent-connects-wordpress-mcp/"&gt;what an AI agent sees when it connects to WordPress&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>WordPress MCP: What an AI Agent Actually Sees</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Fri, 04 Sep 2026 10:26:26 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wordpress-mcp-what-an-ai-agent-actually-sees-4ddm</link>
      <guid>https://dev.to/wpmultitool/wordpress-mcp-what-an-ai-agent-actually-sees-4ddm</guid>
      <description>&lt;p&gt;Two WordPress plugins promise to let an AI agent run your site over MCP: Albert, the AI Butler, and Novamira. I write a plugin that feeds data to agents like these, so I wanted to know what my plugin looks like from the agent's side of the connection. I set up two throwaway sites: a fresh one running Albert 1.3.1 from the plugin directory, and a clone of my own dev site running Novamira Free, updated to 1.12.2 from the GitHub release so it carried realistic data. Then I connected a real MCP client to each and counted the tools the agent gets.&lt;/p&gt;

&lt;p&gt;Three tools. On both.&lt;/p&gt;

&lt;p&gt;If you're evaluating WordPress MCP hosts, that number is the start of every comparison that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I tested
&lt;/h2&gt;

&lt;p&gt;Albert ran on a fresh local install. Novamira ran on the clone, which is worth being precise about: the clone carried Novamira 1.11.6 from my dev site, and I updated it to 1.12.2 before testing, so what you read below went through the real version-change upgrade path. Albert came from &lt;a href="https://wordpress.org/plugins/albert-ai-butler/" rel="noopener noreferrer"&gt;the WordPress.org plugin directory&lt;/a&gt;; Novamira is distributed from &lt;a href="https://novamira.ai/" rel="noopener noreferrer"&gt;its own site&lt;/a&gt; as a direct download. The client was the official MCP Inspector, connected over Streamable HTTP with OAuth 2.0 and PKCE. The category survey behind this post ran on 2026-09-02; every test below ran on 2026-09-03, against the versions current at that time.&lt;/p&gt;

&lt;p&gt;I didn't use production sites. Nothing here touched a live store.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same three tools, twice
&lt;/h2&gt;

&lt;p&gt;Here is the complete tool list an authenticated MCP client receives from Novamira (names only; the raw capture carries title, description, and schemas):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-adapter-discover-abilities"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-adapter-get-ability-info"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-adapter-execute-ability"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Albert returns the same three names. I checked both responses for a pagination cursor, because a truncated list would fake this result. Neither response has one. Three tools is the complete list on both hosts.&lt;/p&gt;

&lt;p&gt;That surprises people who have seen either product's admin screen. Albert's Abilities page listed 44 rows on my fresh install, and six of those were my own plugin's. Without a contributing plugin it's 38. Novamira's Hub lists 41 of its own abilities plus everything other plugins register. Neither set becomes MCP tools. Both hosts bundle the official &lt;a href="https://github.com/WordPress/mcp-adapter" rel="noopener noreferrer"&gt;WordPress MCP Adapter&lt;/a&gt;, and both pass it only the adapter's three built-in meta-tools: discover abilities, get ability info, execute ability. An agent works by listing abilities, then executing one by ID through the gateway tool.&lt;/p&gt;

&lt;p&gt;I verified this in Novamira's source as well, because a three-tool list is a big claim. &lt;code&gt;DefaultServerFactory::create()&lt;/code&gt; hardwires the three adapter abilities as tools and auto-discovers only resources and prompts. The adapter does contain a mechanism for turning abilities into tools, and Novamira flags its abilities as MCP-public. Nothing surfaces as a fourth tool. The three routes Novamira serves, including the OAuth one, are mirrors of the same server.&lt;/p&gt;

&lt;p&gt;So the tool surface, the part the agent sees first, is identical. What separates these products is everything behind the door.&lt;/p&gt;

&lt;h2&gt;
  
  
  How both hosts gate what the agent can do
&lt;/h2&gt;

&lt;p&gt;Both hosts strip disabled abilities from the registry, so a disabled ability is invisible to discovery and to execution. Albert does this in code: on a fresh install it stores zero plugin options and disables every ability that is not marked read-only. I asked the gateway to run a disabled write ability, &lt;code&gt;albert/create-post&lt;/code&gt;, and got back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ability 'albert/create-post' not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gateway does not say permission denied. From the agent's perspective the ability does not exist. After I toggled &lt;code&gt;albert/edit-page-block&lt;/code&gt; on in Albert's admin, the same execution path ran it.&lt;/p&gt;

&lt;p&gt;Novamira's Hub states the same model in its own words: "Disabled abilities are removed from registry discovery and MCP execution while AI Abilities are enabled on the Configuration page." Its dangerous abilities are off by default and need a confirmation dialog to enable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different catalogs behind the same door
&lt;/h2&gt;

&lt;p&gt;Novamira ships 41 of its own abilities. The Hub's category rows include code execution (3 abilities), filesystem (8), Gutenberg (13), and admin access (1), plus a WP-CLI ability. On my clone, after enabling the surface, all 41 were registered and flagged MCP-public, with the Hub toggles as the gate. This matches what Novamira advertises itself as: the plugin whose product is running arbitrary PHP inside your WordPress, with a 30-second limit, through a sandbox at &lt;code&gt;wp-content/novamira-sandbox/&lt;/code&gt; that the vendor's own docs describe as not a security boundary.&lt;/p&gt;

&lt;p&gt;Albert ships 35 built-in abilities. All of them are CRUD on content, users, and media. There's no PHP execution, no filesystem access, and no WP-CLI anywhere in the plugin. Writes and deletes are off by default through the code blocklist described above.&lt;/p&gt;

&lt;h2&gt;
  
  
  The consent screens, quoted
&lt;/h2&gt;

&lt;p&gt;Both hosts use OAuth 2.0 with PKCE, and both walked my client through a consent screen before issuing tokens. The screens say different things.&lt;/p&gt;

&lt;p&gt;Novamira's consent, verbatim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MCP Inspector is requesting full access to your WordPress site.&lt;br&gt;
[...]&lt;br&gt;
This grant can:&lt;br&gt;
Execute PHP and WP-CLI.&lt;br&gt;
Read, write, and delete server files.&lt;br&gt;
Change WordPress content and settings.&lt;br&gt;
Create temporary administrator access.&lt;br&gt;
Execute REST-visible abilities registered by compatible plugins.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I appreciate this screen. A non-technical site owner approving a connection sees, in plain words, that the application can run code and mint a temporary administrator. That is honest framing of a dangerous grant.&lt;/p&gt;

&lt;p&gt;Albert's consent names the application, shows where the access code will be sent, warns when a client registered itself a minute ago, and shows which WordPress user is authorizing. It doesn't enumerate what the connection can do. Since Albert's catalog contains no code execution, the grant is smaller, but the screen does not say so. You have to know the product to know what you approved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/03-oauth-consent-full-access.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/03-oauth-consent-full-access.png" alt="Novamira's OAuth consent screen enumerating the full grant, including PHP execution and temporary admin access" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/06-C2-oauth-consent-screen.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/06-C2-oauth-consent-screen.png" alt="Albert's OAuth consent screen showing the application, the code destination, and the logged-in user" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The security detail worth more attention: the domain lock
&lt;/h2&gt;

&lt;p&gt;While setting up the Novamira test I cloned my dev site to a new hostname. Novamira noticed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Novamira AI Abilities were disabled because the site domain changed (enabled on wpmultitool.loc). Re-enable them from the Configuration page if this is intentional.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The entire MCP surface, disabled, because the site moved. The lock lives in one option, &lt;code&gt;novamira_ai_abilities_domain&lt;/code&gt;, and is enforced in code against the current hostname.&lt;/p&gt;

&lt;p&gt;I checked the source before praising this, and it holds up. A stolen copy of a WordPress site, database and files and all, will not serve MCP on the attacker's hostname until an admin re-enables it. That is a real anti-exfiltration property. Novamira documents the lock in its own documentation, and in my read of both products it deserves far more prominence than Novamira gives it.&lt;/p&gt;

&lt;p&gt;Albert has no equivalent state on a fresh install, and I didn't test a configured Albert install on a moved hostname. If someone wants to know, that's a separate test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/01-domain-mismatch-notice.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/01-domain-mismatch-notice.png" alt="Novamira's domain lock notice after the site was cloned to a new hostname" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Small differences worth knowing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Endpoints split by auth mode.&lt;/strong&gt; Novamira serves OAuth clients and application-password clients on different routes. &lt;code&gt;/wp-json/mcp/novamira-oauth&lt;/code&gt; answers OAuth clients with a proper 401 challenge pointing at the OAuth metadata. &lt;code&gt;/wp-json/mcp/novamira&lt;/code&gt; serves application-password clients with a bare REST 401. The server's own greeting states the split. Albert serves one route, &lt;code&gt;/wp-json/albert/v1/mcp&lt;/code&gt;, with both discovery endpoints answering 200.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills surface as prompts.&lt;/strong&gt; Novamira's four built-in skills appear in the MCP prompts list, and its discover-ability output carries an extra &lt;code&gt;novamira_instructions&lt;/code&gt; field with agent guidance. The gateway itself instructs the agent. Albert's meta-tools are stock adapter tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Albert keeps an audit log.&lt;/strong&gt; Every ability execution lands in a dedicated table with the ability name, user, status, and timestamp. Input, output, and client columns are empty in the free version, which matches the "full activity history" upsell on its dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Albert's privacy layer works.&lt;/strong&gt; I tested it with a realistic user record. The default mode anonymizes. Strict mode masked the record even for my admin session: the email came back as &lt;code&gt;p***@e***.com&lt;/code&gt; and the name as "Customer #2". Revealing real data requires an explicit per-call argument plus the gating capability. One nuance from my adversarial review pass: a bare top-level &lt;code&gt;name&lt;/code&gt; field is only masked inside customer context, unless the ability opts in to name masking. The person-record abilities opt in. Email masking is unconditional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Albert's per-block editing is surgical.&lt;/strong&gt; I built a 42-block page, enabled exactly one write ability, and asked the gateway to replace the block at position 5, a single heading. One heading changed. The other nine headings, every paragraph, and the closing block stayed byte-identical, and the page grew by 60 bytes. The June support thread about truncated page output was a client-side limit, and the per-block design sidesteps it: an edit never round-trips the whole page. The input schema even accepts an &lt;code&gt;expect&lt;/code&gt; argument so the edit refuses to apply if the target block changed underneath you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison in one table
&lt;/h2&gt;

&lt;p&gt;Every row restates something tested or quoted above.&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;Albert 1.3.1&lt;/th&gt;
&lt;th&gt;Novamira Free 1.12.2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP tools exposed&lt;/td&gt;
&lt;td&gt;3, the adapter's meta-tools&lt;/td&gt;
&lt;td&gt;3, the same names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adapter&lt;/td&gt;
&lt;td&gt;official WordPress MCP Adapter&lt;/td&gt;
&lt;td&gt;official WordPress MCP Adapter, one server mirrored across three routes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Own abilities&lt;/td&gt;
&lt;td&gt;35, all CRUD on content, users, and media&lt;/td&gt;
&lt;td&gt;41, including code execution, filesystem, Gutenberg, admin access, WP-CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writes by default&lt;/td&gt;
&lt;td&gt;off; only abilities marked read-only start on&lt;/td&gt;
&lt;td&gt;dangerous abilities off, confirmation dialog to enable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP execution&lt;/td&gt;
&lt;td&gt;none anywhere in the plugin&lt;/td&gt;
&lt;td&gt;yes, 30-second limit, through a sandbox the vendor's docs describe as not a security boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth consent screen&lt;/td&gt;
&lt;td&gt;names the app, shows the code destination, warns on fresh clients, shows the authorizing user; does not enumerate capabilities&lt;/td&gt;
&lt;td&gt;enumerates the full grant in plain words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain lock&lt;/td&gt;
&lt;td&gt;none on a fresh install; not tested on a moved site&lt;/td&gt;
&lt;td&gt;yes; a hostname change disables the surface until an admin re-enables it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP route&lt;/td&gt;
&lt;td&gt;one: &lt;code&gt;/wp-json/albert/v1/mcp&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;two, split by auth mode: &lt;code&gt;/wp-json/mcp/novamira-oauth&lt;/code&gt; and &lt;code&gt;/wp-json/mcp/novamira&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What this means for plugin developers
&lt;/h2&gt;

&lt;p&gt;I write a plugin that feeds data to agents like these. This section is what my plugin looks like from the agent's side.&lt;/p&gt;

&lt;p&gt;My plugin, WP Multitool, registers six read-only abilities: a whole-site quickstart scan, a health snapshot, an autoload report, slow-query stats, Redis diagnostics, and a Site Doctor scan. They sit behind an opt-in that is off by default. For these tests I turned it on. There's nothing in my code that knows about Albert or Novamira.&lt;/p&gt;

&lt;p&gt;On Albert, all six appeared in its Abilities admin screen, grouped under a third-party supplier filter, and in the agent's discover-ability list. On Novamira, all six appeared in its Hub under "Registered by other plugins". Then I executed the quickstart ability through both gateways. Same request shape on both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ability_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wp-multitool/quickstart"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the Novamira clone it returned seven findings, including the ones that matter on a real site: 974 KB of autoloaded options, 319,475 stored revisions, captured slow queries, and the Site Doctor checks. On the fresh Albert site it returned the Site Doctor findings for that install.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/03-C6-albert-abilities-wp-multitool-six-rows.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/03-C6-albert-abilities-wp-multitool-six-rows.png" alt="Albert's Abilities screen filtered to the six wp-multitool abilities" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/06-execute-quickstart-via-gateway-result.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/06-execute-quickstart-via-gateway-result.png" alt="The quickstart ability executing through Novamira's gateway, returning seven real findings" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One detail mattered more than I expected. Albert disables every ability that is not annotated read-only. My abilities carry &lt;code&gt;readonly: true&lt;/code&gt; in their registration, so they survive that policy and stay available. A plugin registering write abilities without annotations would arrive switched off.&lt;/p&gt;

&lt;p&gt;That is the actual story of the Abilities API, and the &lt;a href="https://developer.wordpress.org/news/2026/02/from-abilities-to-ai-agents-introducing-the-wordpress-mcp-adapter/" rel="noopener noreferrer"&gt;official introduction&lt;/a&gt; from the WordPress team states it in its own words: "Once registered, that ability is discoverable and executable from PHP, JavaScript, and the REST API," and the adapter "lets AI tools (like Claude Desktop, Claude Code, Cursor, and VS Code) discover and call WordPress Abilities directly." My test is the smallest possible proof, and it ran on both hosts I could test hands-on.&lt;/p&gt;

&lt;p&gt;If you want the reverse direction, pointing an agent at a WordPress site's CLI instead of its API, I wrote that up earlier: &lt;a href="https://wpmultitool.com/blog/how-to-make-your-ai-agent-use-wp-multitool/" rel="noopener noreferrer"&gt;how to make your AI agent use WP Multitool&lt;/a&gt;. The Novamira-specific pairing, including the skill file I ship, is in &lt;a href="https://wpmultitool.com/blog/wp-multitool-x-novamira-powerful-combo/" rel="noopener noreferrer"&gt;the combo post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did not check
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Data privacy on Novamira. I tested Albert's privacy layer. I didn't run anything similar on the Novamira side.&lt;/li&gt;
&lt;li&gt;Novamira Chat, the in-dashboard agent. It exists as a separate feature and stayed out of scope.&lt;/li&gt;
&lt;li&gt;Albert on a moved or cloned site, for the domain-lock comparison.&lt;/li&gt;
&lt;li&gt;A second OAuth session as a non-admin user. Albert's permission pipeline is verified in source. Novamira's docs say every ability requires &lt;code&gt;manage_options&lt;/code&gt;, and I didn't verify that in code. Both live connections ran as admin.&lt;/li&gt;
&lt;li&gt;Whether Albert and Novamira coexist on one site. The research I did beforehand marked that unverified and I didn't verify it here.&lt;/li&gt;
&lt;li&gt;ChatGPT as the client. It connects from OpenAI's servers, so it cannot reach a local test site. The equivalent real-client test would be connecting Claude to WordPress with Claude Desktop or Claude Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;I make WP Multitool, a paid diagnostics plugin. As of 1.9.6 it can register six read-only Abilities and it ships a Novamira skill file. I'm not affiliated with Dynamic.ooo, with Albert, or with any other host here. I tested both on local copies: Albert on a fresh site, Novamira on a clone of my own dev site. WP Multitool is a data provider to these agents, not a competitor. I benefit if more sites adopt the Abilities API, whichever host they pick.&lt;/p&gt;

&lt;p&gt;Both hosts earned their facts here. In my read, Novamira's consent screen and domain lock are better than its marketing gives them credit for. Albert's defaults and privacy layer are better than its ability-count copy, which is the one thing its documentation gets wrong: the admin screen shows 44 abilities on a fresh install with one contributing plugin, while three of its own pages say 15, 35+, and 100+. I counted. So can you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Survey 2026-09-02; tests 2026-09-03, against Albert 1.3.1 and Novamira Free 1.12.2. Raw tool lists and execution responses are archived; screenshots above are from the test sessions.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://wpmultitool.com/blog/ai-agent-connects-wordpress-mcp" rel="noopener noreferrer"&gt;WP Multitool&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>ai</category>
      <category>webdev</category>
      <category>mcp</category>
    </item>
    <item>
      <title>WP Multitool x Novamira – powerful combo</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Sat, 29 Aug 2026 08:15:17 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wp-multitool-x-novamira-powerful-combo-3bjh</link>
      <guid>https://dev.to/wpmultitool/wp-multitool-x-novamira-powerful-combo-3bjh</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/08/28/wp-multitool-x-novamira-powerful-combo/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/08/28/wp-multitool-x-novamira-powerful-combo/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Novamira gives an AI agent PHP, WP-CLI and the database on a WordPress site. That is a lot of rope. I wanted it to diagnose a slow site without inventing SQL and without running cleanup on a guess.&lt;/p&gt;

&lt;p&gt;Sorry, your browser cannot play this Short. &lt;a href="https://wpmultitool.com/wp-content/uploads/2026/08/wp-multitool-x-novamira.mp4" rel="noopener noreferrer"&gt;Download the 29-second video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Get WP Multitool. Let your agent use it with Novamira.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;WP Multitool 1.9.6 ships six read-only &lt;a href="https://developer.wordpress.org/news/2026/02/from-abilities-to-ai-agents-introducing-the-wordpress-mcp-adapter/" rel="noopener noreferrer"&gt;WordPress Abilities&lt;/a&gt; for that job. They sit behind the Site Doctor Agent access toggle. Default is off. They report findings. They change nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Abilities, not another MCP server
&lt;/h2&gt;

&lt;p&gt;Novamira is an MCP server. I am not going to ship a second one. WordPress 6.9 already has an Abilities API. I marked these public the way the official Adapter docs ask. I installed Novamira Free 1.11.6 on a local copy of this site. Abilities Hub listed all six under a WP Multitool group, status Enabled, MCP type tool. I have not installed Novamira on production.&lt;/p&gt;

&lt;p&gt;The CLI I already had for this: &lt;code&gt;wp multitool quickstart&lt;/code&gt;, &lt;code&gt;health&lt;/code&gt;, &lt;code&gt;autoload&lt;/code&gt;, &lt;code&gt;slow-queries&lt;/code&gt;, &lt;code&gt;redis&lt;/code&gt;. The abilities wrap those reads. They are the same family of JSON, not byte-identical: I dropped CLI extras that carry host names, and &lt;code&gt;slow-queries&lt;/code&gt; is stats, not the query list. They do not wrap &lt;code&gt;clean&lt;/code&gt;, autoload optimize, or frontend enable-all. An application password or OAuth token with &lt;code&gt;manage_options&lt;/code&gt; is already an administrator. A typed tool that deletes revisions is an accident.&lt;/p&gt;

&lt;p&gt;If you want the CLI playbook instead, I wrote that earlier: &lt;a href="https://wpmultitool.com/blog/how-to-make-your-ai-agent-use-wp-multitool/" rel="noopener noreferrer"&gt;How to make your AI agent use WP Multitool&lt;/a&gt;. This post is the Novamira path.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 1.9.6 actually ships
&lt;/h2&gt;

&lt;p&gt;One toggle: WP Admin → WP Multitool → Site Doctor (or Tools → Site Doctor if you moved the menu). Agent access is a checkbox on that page. Off until you turn it on. WordPress 6.9 or newer. Below 6.9 the checkbox is not shown. I did not bump the plugin’s WordPress minimum. It stays 5.0. The scan ability already existed in 1.9.x. 1.9.6 is the public flag plus five more reads behind that same toggle.&lt;/p&gt;

&lt;p&gt;Six names:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ability&lt;/th&gt;
&lt;th&gt;What it returns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;wp-multitool/quickstart&lt;/td&gt;
&lt;td&gt;Worst-first findings across config, autoload, database bloat and captured slow queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wp-multitool/site-rescue-scan&lt;/td&gt;
&lt;td&gt;Cache, OPcache, stacked optimizers, WooCommerce gateway checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wp-multitool/health&lt;/td&gt;
&lt;td&gt;PHP, memory, object cache, autoload size, revisions, transients&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wp-multitool/autoload&lt;/td&gt;
&lt;td&gt;Oversized option names and sizes. Not values.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wp-multitool/slow-queries&lt;/td&gt;
&lt;td&gt;Log totals only: how many, how many unfixed, worst milliseconds. Not the SQL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wp-multitool/redis&lt;/td&gt;
&lt;td&gt;Whether Redis is actually in play, and the 21-check probe I described in Redis “connected” is not the same as working&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Start with &lt;code&gt;quickstart&lt;/code&gt;. Drill with the others. A source marked unavailable was skipped – treat that as “not checked”, not as “healthy”.&lt;/p&gt;

&lt;p&gt;The JSON is the same family as the CLI. &lt;code&gt;quickstart&lt;/code&gt; returns &lt;code&gt;findings&lt;/code&gt; (each with severity, source, title, why), a per-severity &lt;code&gt;summary&lt;/code&gt;, and a &lt;code&gt;sources&lt;/code&gt; map. I dropped the CLI extras that carry host names. &lt;code&gt;slow-queries&lt;/code&gt; is stats, not the query list, because I do not want SQL on a public MCP tool. &lt;code&gt;autoload&lt;/code&gt; lists option names and kilobytes, never the option value.&lt;/p&gt;

&lt;p&gt;Same termination condition as the CLI loop: read &lt;code&gt;summary&lt;/code&gt;, stop when critical and warn are zero. Scan, tell the human, scan again after they act. The agent does not get to declare victory on its own write.&lt;/p&gt;

&lt;p&gt;Permission is &lt;code&gt;manage_options&lt;/code&gt;. Treat the payload as for that conversation. Never print &lt;code&gt;DB_PASSWORD&lt;/code&gt;, auth keys or salts.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to turn it on
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://wpmultitool.com/" rel="noopener noreferrer"&gt;WP Multitool&lt;/a&gt; 1.9.6 or newer. The changelog is &lt;a href="https://wpmultitool.com/changelog/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;WordPress 6.9 or newer.&lt;/li&gt;
&lt;li&gt;Enable the Site Doctor module if it is off.&lt;/li&gt;
&lt;li&gt;Open the Site Doctor page. Turn &lt;strong&gt;Agent access&lt;/strong&gt; on. Save.&lt;/li&gt;
&lt;li&gt;Connect your AI client through Novamira the way their docs say (OAuth or an application password).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the tools are missing after that, check the toggle, the plugin version, and WordPress 6.9. On Novamira 1.11.6 they showed up in Hub once Agent access was on. A different Novamira build might differ. Do not fall back to &lt;code&gt;wp eval&lt;/code&gt; or a handmade SELECT. That is the whole point of this surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Novamira skill
&lt;/h2&gt;

&lt;p&gt;Novamira skills are one Markdown file. YAML frontmatter, then instructions. Their docs say the agent skims &lt;code&gt;description&lt;/code&gt; and loads the body when it matches. I have not uploaded this file to a live Novamira Skills screen. I flattened the ClawHub skill into that shape: under 800 words, abilities instead of raw SQL, no write commands.&lt;/p&gt;

&lt;p&gt;It is not in the plugin zip. &lt;code&gt;docs/&lt;/code&gt; is stripped from the release. It is not on ClawHub either – that package is the WP-CLI skill, and mixing the two would teach the agent both playbooks at once.&lt;/p&gt;

&lt;p&gt;v1 is: save the file below as &lt;code&gt;wp-multitool.md&lt;/code&gt; and upload it under &lt;strong&gt;Novamira → Skills&lt;/strong&gt;.&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="o"&gt;---&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multitool&lt;/span&gt;
&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Diagnose&lt;/span&gt; &lt;span class="nc"&gt;WordPress&lt;/span&gt; &lt;span class="n"&gt;performance&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;health&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="no"&gt;WP&lt;/span&gt; &lt;span class="nc"&gt;Multitool&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="nf"&gt;abilities&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multitool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;quickstart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multitool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;health&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multitool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;autoload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multitool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;slow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;queries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multitool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multitool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rescue&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kn"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;slow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autoload&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;heavy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;looks&lt;/span&gt; &lt;span class="n"&gt;wrong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;asks&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;health&lt;/span&gt; &lt;span class="n"&gt;audit&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;enable_prompt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;enable_agentic&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="o"&gt;---&lt;/span&gt;

&lt;span class="c1"&gt;# WP Multitool (read-only)&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;WP&lt;/span&gt; &lt;span class="nc"&gt;Multitool&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;wpmultitool&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;paid&lt;/span&gt; &lt;span class="nc"&gt;WordPress&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;This&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;diagnostics&lt;/span&gt; &lt;span class="n"&gt;through&lt;/span&gt; &lt;span class="nc"&gt;WordPress&lt;/span&gt; &lt;span class="nc"&gt;Abilities&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Call&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;named&lt;/span&gt; &lt;span class="n"&gt;abilities&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="k"&gt;Do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt; &lt;span class="no"&gt;WP&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;CLI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt; &lt;span class="no"&gt;PHP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="n"&gt;yourself&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## Before you start&lt;/span&gt;

&lt;span class="nc"&gt;Abilities&lt;/span&gt; &lt;span class="n"&gt;exist&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="no"&gt;WP&lt;/span&gt; &lt;span class="nc"&gt;Multitool&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;installed&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;WordPress&lt;/span&gt; &lt;span class="mf"&gt;6.9&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;newer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;below&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;they&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;silent&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;An&lt;/span&gt; &lt;span class="n"&gt;administrator&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;turned&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nc"&gt;Site&lt;/span&gt; &lt;span class="nc"&gt;Doctor&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt; &lt;span class="nf"&gt;access&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;If&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stop&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;tell&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="k"&gt;Do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;invent&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;fallback&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;

&lt;span class="nc"&gt;Permission&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="sb"&gt;`manage_options`&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Treat&lt;/span&gt; &lt;span class="n"&gt;returned&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Never&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="sb"&gt;`DB_PASSWORD`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`AUTH_KEY`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`SECURE_AUTH_KEY`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Never&lt;/span&gt; &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="sb"&gt;`wp eval`&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## Start here&lt;/span&gt;

&lt;span class="nc"&gt;Call&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="sb"&gt;`wp-multitool/quickstart`&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="s2"&gt;"why is this site slow?"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;It&lt;/span&gt; &lt;span class="n"&gt;returns&lt;/span&gt; &lt;span class="n"&gt;ranked&lt;/span&gt; &lt;span class="sb"&gt;`findings`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="sb"&gt;`severity`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`source`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`title`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`why`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`data`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;per&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="sb"&gt;`summary`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="sb"&gt;`sources`&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="n"&gt;marked&lt;/span&gt; &lt;span class="sb"&gt;`unavailable`&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;skipped&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;treat&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="s2"&gt;"not checked"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="s2"&gt;"healthy"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;

&lt;span class="nc"&gt;Optional&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sb"&gt;`{ "force": true }`&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;bypass&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## Then drill&lt;/span&gt;

&lt;span class="kn"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="n"&gt;ability&lt;/span&gt; &lt;span class="n"&gt;per&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="k"&gt;Do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;skip&lt;/span&gt; &lt;span class="n"&gt;quickstart&lt;/span&gt; &lt;span class="n"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;named&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Ability&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;When&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Returns&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|---------|------|---------|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`wp-multitool/site-rescue-scan`&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;OPcache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;LiteSpeed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stacked&lt;/span&gt; &lt;span class="n"&gt;optimizers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;WooCommerce&lt;/span&gt; &lt;span class="n"&gt;gateways&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Per&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;why&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt; &lt;span class="n"&gt;hint&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Overall&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="sb"&gt;`{ "force": true }`&lt;/span&gt; &lt;span class="n"&gt;optional&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`wp-multitool/health`&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="no"&gt;PHP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;WordPress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autoload&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;revisions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Flat&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;No&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`wp-multitool/autoload`&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Autoload&lt;/span&gt; &lt;span class="n"&gt;burden&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;oversized&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`{ summary, threshold, oversized }`&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt; &lt;span class="sb"&gt;`{ "limit": 20 }`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;–&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Names&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;sizes&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;never&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`wp-multitool/slow-queries`&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Captured&lt;/span&gt; &lt;span class="n"&gt;slow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Totals&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sb"&gt;`total_logged`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`unfixed`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`worst_ms`&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="no"&gt;SQL&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;No&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`wp-multitool/redis`&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="s2"&gt;"connected"&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;maybe&lt;/span&gt; &lt;span class="n"&gt;worse&lt;/span&gt; &lt;span class="n"&gt;than&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`{ in_play, server, findings }`&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="sb"&gt;`{ "force": true }`&lt;/span&gt; &lt;span class="n"&gt;optional&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Hosts&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="sb"&gt;`CONFIG GET`&lt;/span&gt; &lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="s2"&gt;"cannot verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;

&lt;span class="sb"&gt;`wp-multitool/slow-queries`&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;dump&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="sb"&gt;`wp-multitool/autoload`&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;kilobytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## How to report&lt;/span&gt;

&lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="nc"&gt;Lead&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;worst&lt;/span&gt; &lt;span class="n"&gt;finding&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;quickstart&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;
&lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="nc"&gt;Quote&lt;/span&gt; &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;why&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;
&lt;span class="mf"&gt;3.&lt;/span&gt; &lt;span class="k"&gt;If&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;unavailable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;say&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;checked&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;
&lt;span class="mf"&gt;4.&lt;/span&gt; &lt;span class="nc"&gt;Recommend&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="n"&gt;human&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;This&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="n"&gt;them&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="k"&gt;Do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;toggle&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;rewrite&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="n"&gt;repairs&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## What this is not&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;license&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt; &lt;span class="no"&gt;PHP&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="no"&gt;WP&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;CLI&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt; &lt;span class="n"&gt;surface&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Writes&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;substitute&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;Without&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;abilities&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;

&lt;span class="nc"&gt;Website&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;wpmultitool&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Novamira is
&lt;/h2&gt;

&lt;p&gt;Novamira is a WordPress plugin from Dynamic.ooo. It lets an AI agent work on a site the way you would: files, PHP, the database, through MCP, with no proxy in the middle. Free already does that. What it does not have is a performance and health source, so the agent still guesses why admin is slow. WP Multitool fills that slot with six read-only abilities Hub picks up as tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop I want the agent to run
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Call &lt;code&gt;wp-multitool/quickstart&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Read &lt;code&gt;summary&lt;/code&gt;. If everything is ok, stop.&lt;/li&gt;
&lt;li&gt;Drill the hot source with the matching ability.&lt;/li&gt;
&lt;li&gt;Tell the human what is wrong and what to do. Do not delete rows. Do not rewrite wp-config. Do not enable frontend tricks from this skill.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last line is the one people skip. The CLI still has cleanup, with confirmation and a backup. The Abilities surface does not. I want the agent to be loud about a 2 MB autoload and quiet about “I already optimized it”.&lt;/p&gt;

&lt;p&gt;Site Doctor itself still has the human scan: &lt;a href="https://wpmultitool.com/blog/wordpress-site-doctor/" rel="noopener noreferrer"&gt;WordPress Site Doctor&lt;/a&gt;. Use that when you are the one looking. Use the abilities when the agent is.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>WP Multitool vs Easy Optimizer: different tools, and you probably want both</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Thu, 23 Jul 2026 08:15:15 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wp-multitool-vs-easy-optimizer-different-tools-and-you-probably-want-both-30nf</link>
      <guid>https://dev.to/wpmultitool/wp-multitool-vs-easy-optimizer-different-tools-and-you-probably-want-both-30nf</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/07/22/wp-multitool-vs-easy-optimizer/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/07/22/wp-multitool-vs-easy-optimizer/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;p&gt;Easy Optimizer makes pages arrive faster. WP Multitool tells you why the server was slow to send them. They collide on about a dozen small front-end toggles, and they overlap on database cleanup, autoload and profiling – differently in each case. Running both is normal. Just don’t let both do the same job. I build WP Multitool, so read this knowing that. I’ll still tell you plainly where Easy Optimizer is better.&lt;/p&gt;

&lt;p&gt;If you’re picking one and the problem is “my site feels slow to visitors”, start with Easy Optimizer. It’s free and it does the whole front end. If the problem is “my admin takes four seconds, my host emails me about CPU, and I don’t know which plugin is doing it”, &lt;a href="https://dev.to/blog/why-caching-plugins-dont-fix-slow-wordpress/"&gt;no cache is going to fix that&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for an Easy Optimizer alternative?
&lt;/h2&gt;

&lt;p&gt;Then this is the wrong page. I’d rather say so than sell you something. Easy Optimizer does page caching, unused CSS removal, delayed and deferred JavaScript, lazy loading, LCP preloading, font swapping and an image CDN. WP Multitool does none of that and isn’t going to. There’s no page cache in it. If you want those things and you want them free, install Easy Optimizer.&lt;/p&gt;

&lt;p&gt;The rest of this is about where the two actually touch, and what each one tells you that the other can’t.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Easy Optimizer does
&lt;/h2&gt;

&lt;p&gt;It’s a genuine all-in-one front-end performance plugin, and a good one. Most of it is page delivery: a full page cache with its own drop-in, sitemap-driven preloading, unused-CSS extraction, minification, delay and defer for JavaScript, lazy loading for images and iframes, LCP preloading driven by a real browser beacon, Cloudflare and managed-host cache purging.&lt;/p&gt;

&lt;p&gt;It grew a backend side recently: a callback profiler, a query log, an autoload viewer, database cleanup and heartbeat control. That’s where it meets WP Multitool, and it’s worth being precise about what it does there. The marketing on both sides blurs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What WP Multitool does
&lt;/h2&gt;

&lt;p&gt;It’s a diagnostic toolkit for the part of WordPress performance that happens before a byte reaches the browser. Slow queries, autoload bloat, plugin callbacks eating the request, an object cache that reports healthy while doing nothing useful, a debug log quietly filling the disk.&lt;/p&gt;

&lt;p&gt;The part with no real equivalent is the query work. It captures slow queries from real traffic, runs &lt;a href="https://dev.to/blog/how-to-read-mysql-explain-wordpress/"&gt;MySQL &lt;code&gt;EXPLAIN&lt;/code&gt;&lt;/a&gt; on them locally, and writes you the actual index:&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="no"&gt;CREATE&lt;/span&gt; &lt;span class="no"&gt;INDEX&lt;/span&gt; &lt;span class="sb"&gt;`idx_meta_key_post_id`&lt;/span&gt; &lt;span class="no"&gt;ON&lt;/span&gt; &lt;span class="sb"&gt;`wp_postmeta`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`meta_key`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`post_id`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s the whole statement, table aliases resolved back to real names, with a button to apply it and another to undo it. When no index can help – an &lt;code&gt;ORDER BY&lt;/code&gt; on an aggregate, say – it says so instead of inventing one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Head-to-head
&lt;/h2&gt;

&lt;p&gt;Every row below was checked against Easy Optimizer 2.5.4’s source, not its feature list. It’s a free download, so you can check it yourself.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Easy Optimizer&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;Page cache&lt;/td&gt;
&lt;td&gt;Yes, full&lt;/td&gt;
&lt;td&gt;None, by design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS / JS / image optimization&lt;/td&gt;
&lt;td&gt;Yes, all of it&lt;/td&gt;
&lt;td&gt;Defer and head cleanup only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow query analysis&lt;/td&gt;
&lt;td&gt;Yes, no EXPLAIN&lt;/td&gt;
&lt;td&gt;Yes, local EXPLAIN + index DDL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When queries are captured&lt;/td&gt;
&lt;td&gt;Only during a profile run you trigger&lt;/td&gt;
&lt;td&gt;Real traffic, as it happens – admin requests by default, front end optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Callback profiling&lt;/td&gt;
&lt;td&gt;Yes, on a triggered run&lt;/td&gt;
&lt;td&gt;Yes, on a triggered run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autoload analysis&lt;/td&gt;
&lt;td&gt;Largest 20 options&lt;/td&gt;
&lt;td&gt;Every option, classified by owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database cleanup&lt;/td&gt;
&lt;td&gt;Yes, with restore in the dashboard&lt;/td&gt;
&lt;td&gt;Yes, backup written before every delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis diagnosis&lt;/td&gt;
&lt;td&gt;Sets it up&lt;/td&gt;
&lt;td&gt;21 checks on whether it is working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WP-CLI&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, the diagnostics run over SSH&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;Lite $9; the query, autoload and callback tools compared here are Pro, from $79/yr&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where Easy Optimizer wins
&lt;/h2&gt;

&lt;p&gt;Everything above the database. Bad LCP, render-blocking CSS, full-size PNGs, third-party scripts blocking interaction – Easy Optimizer fixes all of that and WP Multitool fixes none of it.&lt;/p&gt;

&lt;p&gt;It beats WP Multitool on three things I’d rather admit than have you find out on your own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Undoing a database cleanup.&lt;/strong&gt; Both plugins back up before deleting. Theirs restores from the dashboard in a couple of clicks. WP Multitool writes a &lt;code&gt;.sql&lt;/code&gt; file you import yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heartbeat control.&lt;/strong&gt; Four modes and an interval, no &lt;code&gt;wp-config.php&lt;/code&gt; edit. WP Multitool has nothing equivalent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloat removal breadth.&lt;/strong&gt; RSS feeds, self-pingbacks, WooCommerce cart fragments, application passwords, block library CSS, and REST access for logged-out visitors – with a sensible allowlist so contact forms and the WooCommerce Store API keep working.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where WP Multitool wins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It runs &lt;code&gt;EXPLAIN&lt;/code&gt;.&lt;/strong&gt; Easy Optimizer’s query analyzer records slow queries and flags known anti-patterns, and its own source says plainly that it doesn’t run &lt;code&gt;EXPLAIN&lt;/code&gt;. That’s the difference between “this query took 900ms” and “this query is scanning 400,000 rows because there’s no index on &lt;code&gt;meta_key&lt;/code&gt;, here is the one to add”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It logs slow queries from traffic you didn’t trigger.&lt;/strong&gt; Their query log arms only for a request you fire by hand, carrying a token. That’s a genuinely careful design, nothing runs for your visitors, but it means the query that’s slow at 3am under real load isn’t the query being measured. WP Multitool’s slow query log runs at shutdown of the request that actually happened. Two honest caveats: the module is off until you enable it, and out of the box it watches admin requests only until you turn off “admin only”. The callback profiler works exactly like theirs, one request and one token, so on that one there’s nothing to choose between them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It works over SSH.&lt;/strong&gt; Fifteen WP-CLI subcommands, so a whole site gets diagnosed without opening a browser. With forty client sites you write a loop and go do something else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It knows when another plugin is doing the same job.&lt;/strong&gt; That’s the part that actually matters if you run both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which should you use?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pages feel slow to visitors, backend is fine&lt;/strong&gt; – Easy Optimizer. Free, and it does the whole front end. Done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow admin, slow logged-in pages, high uncached response time, a host emailing you about CPU&lt;/strong&gt; – WP Multitool. No cache reaches any of those.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A site you’re responsible for, especially WooCommerce&lt;/strong&gt; – both. Easy Optimizer owns delivery. WP Multitool tells you what the cache is hiding, so the cause gets fixed instead of covered until the day the cache misses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Probably both, then, with one rule: never let two plugins do the same optimization.&lt;/p&gt;

&lt;p&gt;Easy Optimizer’s own documentation repeats this several times, and it’s right. Two plugins rewriting the same `` tag, or two sets of security headers on one response, is how you get a bug nobody can reproduce.&lt;/p&gt;

&lt;p&gt;Easy Optimizer does warn you, to its credit. It ships a conflict detector that raises a notice when one of fifteen known page-cache plugins is active while its own cache is on, and a softer one when one of eight named plugins duplicates a feature you switched on. It goes on whether that plugin is &lt;em&gt;active&lt;/em&gt;, from a hardcoded list. WP Multitool isn’t on it.&lt;/p&gt;

&lt;p&gt;WP Multitool goes a step further. It reads the other plugin’s own saved settings, not just whether it’s installed, and tells you when a switch is on in both places. Easy Optimizer’s setting keys were read from its 2.5.4 source, so the answer is its real configuration and not a guess. Eleven of the Frontend Optimizer toggles overlap with Easy Optimizer: deferred JavaScript, emoji scripts, embeds, jQuery Migrate, Dashicons, shortlinks, RSD and WLW, XML-RPC, the generator tag and &lt;code&gt;?ver=&lt;/code&gt; stripping. Turn them off on one side and the two sit together fine.&lt;/p&gt;

&lt;p&gt;Three things don’t overlap at all, because Easy Optimizer doesn’t do them: removing the REST API link, security headers, and limiting login attempts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Easy Optimizer is a free &lt;a href="https://dev.to/compare/wp-multitool-vs-wp-rocket/"&gt;WP Rocket&lt;/a&gt; competitor and a credible one. WP Multitool isn’t competing with it, because there’s no page cache in it and there never will be.&lt;/p&gt;

&lt;p&gt;Slow to render is their department. Slow to respond is mine, and a cache can’t help you there, it can only hide it from some visitors some of the time.&lt;/p&gt;

&lt;p&gt;So: install Easy Optimizer for the front end, it costs you nothing. Then, if the backend is still slow, put &lt;a href="https://dev.to/pricing/"&gt;WP Multitool&lt;/a&gt; underneath it – $9 Lite, $79/yr Pro for one site, $199/yr, or $499 lifetime. The &lt;code&gt;EXPLAIN&lt;/code&gt;, autoload and callback tools this page compares are in Pro, not in Lite. Every other tool I get compared against is mapped in &lt;a href="https://dev.to/compare/"&gt;WP Multitool vs the alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I run both at once?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, and many people should. Turn off whichever overlapping toggles you don’t want duplicated. WP Multitool will show you which ones those are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Easy Optimizer really free?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. The Image CDN needs a paid licence, its docs say so, but everything else – caching, unused CSS, delay JS, lazy load, the backend analyzer – is free with no upsell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does WP Multitool have a page cache?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, and it’s not on the roadmap. Use theirs, or &lt;a href="https://dev.to/compare/wp-multitool-vs-litespeed-cache/"&gt;LiteSpeed Cache&lt;/a&gt;, or nginx FastCGI. WP Multitool will detect that you have one and stop telling you to install one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Their analyzer found nothing. Is my site fine?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Maybe, or maybe the slow request wasn’t the one you profiled. Their analyzer measures a request you fire by hand. If a query is only slow under real load, a manual run may never see it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which is better for a WooCommerce store?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both, for different reasons. Their caching is WooCommerce-aware and excludes cart, checkout and account pages. WP Multitool is the one that tells you why &lt;code&gt;wp_options&lt;/code&gt; is 40MB and which Action Scheduler table is eating your admin.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Redis: Connected Is Not Working</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Tue, 21 Jul 2026 11:11:50 +0000</pubDate>
      <link>https://dev.to/wpmultitool/redis-connected-is-not-working-4en1</link>
      <guid>https://dev.to/wpmultitool/redis-connected-is-not-working-4en1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short version:&lt;/strong&gt; If your WordPress site runs Redis and the status screen says Connected, you know one thing - a socket opened. That test cannot fail in most of the ways an object cache actually fails in production. I deliberately misconfigured a cache on a test site and filled it, and the site started serving HTTP 500 to every visitor while WordPress carried on reporting that an external object cache was active. Installing Redis is where the work starts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F03ws2a4dij8k9au70wet.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F03ws2a4dij8k9au70wet.webp" alt="Side by side: an object cache status screen reporting Connected, Valid, Ping 1, Errors none, next to the same site returning a WordPress error page reading Error establishing a Redis connection." width="799" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Same server, same configuration, minutes apart. On the left, every check reports the cache healthy while it is already refusing every write. On the right, the same site once WordPress needed to store something.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What your health check actually asks
&lt;/h2&gt;

&lt;p&gt;Go and look at whatever tells you Redis is fine on your site. WordPress Site Health. Your host's dashboard. The status screen inside your object cache plugin. Read the wording carefully.&lt;/p&gt;

&lt;p&gt;Nearly all of them answer the same single question: did the connection succeed? Something reached the cache server and got a reply. Green tick, move on.&lt;/p&gt;

&lt;p&gt;That's a useful thing to know. It's also close to the least interesting thing you could know about a cache. A cache server can be reachable, responsive, and completely useless to your site, and every one of those checks will still go green. Reachable and useful are separate properties, and only one of them is being measured.&lt;/p&gt;

&lt;p&gt;I don't think this is anyone being lazy. Connection tests are cheap, they're safe on shared hosting, and they catch the one failure everybody imagines - the server being down. The trouble is that the server being down is the rarest way Redis lets you down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test that changed how I think about this
&lt;/h2&gt;

&lt;p&gt;I set up a test site with a deliberately bad cache configuration - the kind you get by accepting defaults and never revisiting them - and I filled the cache up.&lt;/p&gt;

&lt;p&gt;Redis did what it was told to do and started refusing writes. Reasonable behaviour from Redis. The problem was everything above it.&lt;/p&gt;

&lt;p&gt;The object cache layer did not degrade. It didn't fall back to the database, it didn't log a warning and carry on. It threw, during WordPress bootstrap, before anything had a chance to catch it. The site returned HTTP 500 to every visitor. A hard white screen, front end and admin, for everybody.&lt;/p&gt;

&lt;p&gt;Here's the part I keep coming back to. Throughout all of it, WordPress's own check for whether an external object cache was active kept answering yes. A connection check would have looked at that site and called it healthy while it was completely down.&lt;/p&gt;

&lt;p&gt;So the monitoring you have would not have told you. It would have told you the opposite.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result I did not expect
&lt;/h2&gt;

&lt;p&gt;While I had the test rig up I ran a comparison I assumed would be boring. Same page, same site, three configurations: a healthy cache, a subtly misconfigured one, and no object cache at all.&lt;/p&gt;

&lt;p&gt;I expected a clean ranking. Healthy fastest, broken slowest, no cache somewhere in the middle.&lt;/p&gt;

&lt;p&gt;That is not what came back. The misconfigured cache wasn't reliably the slowest one. And under some perfectly ordinary conditions - nothing exotic, nothing I had to engineer - the correctly configured, healthy cache came back nearly four times slower than running no object cache at all. 174 milliseconds against 45, at nothing more dramatic than an ordinary half-millisecond hop across the network to the cache and back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm08vlvc3injue2gdrwn4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm08vlvc3injue2gdrwn4.webp" alt="Bar chart of time to first byte for the same page in three configurations: no object cache 45ms, misconfigured cache 109ms, healthy cache 174ms." width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The same page, measured three ways. The correctly configured cache was the slowest of the three, and breaking it on purpose made the page faster. All three configurations report themselves as healthy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm going to leave the mechanism out of this post, deliberately. What matters for you as a site owner is the shape of the finding: a cache you installed to make the site faster can be making it slower, it can be doing that while perfectly healthy by every measure you have access to, and nothing anywhere will mention it. Whether it lands on your side of that line depends on your site and your hosting, which is exactly the point - it's a thing you have to measure, not assume. You'd have to go looking, and you'd have to know what you were looking for.&lt;/p&gt;

&lt;p&gt;That result is why I stopped treating "Redis is installed" as a box that gets ticked once.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failures that never announce themselves
&lt;/h2&gt;

&lt;p&gt;Once you stop trusting the green tick, a whole category of problems opens up. These are things I've seen on real sites, and none of them raise an alarm anywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cache that is full and refusing every write, while every dashboard reports Connected.&lt;/li&gt;
&lt;li&gt;A cache quietly handing one website's data to a different website, because two sites are sharing a space they were never meant to share.&lt;/li&gt;
&lt;li&gt;A site that survived a server failover months ago and has been writing into something that silently discards the writes ever since. Nothing broke. Nothing got faster either.&lt;/li&gt;
&lt;li&gt;A cache that is switched on, paid for on every single page load, and excluded from caching the exact thing that would have repaid the cost.&lt;/li&gt;
&lt;li&gt;Something in your plugin stack emptying the entire cache over and over, so it never lives long enough to help anyone.&lt;/li&gt;
&lt;li&gt;A cache where the network round trip costs more than the work it saves, so the whole arrangement is a net loss on every request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common thread is that all of these look identical from the outside. The site works. It's just slower than it should be, or leaking things it shouldn't, and the tooling says everything is fine.&lt;/p&gt;

&lt;p&gt;If you want a concrete example of that playing out, I've already written up one of them in full. A cache that drops what it's told to hold makes WordPress lose track of when it last checked for updates - so instead of checking twice a day, it checks again on every single admin page load, and every one of those checks holds the page open while it waits on an outside server. That's &lt;a href="https://wpmultitool.com/blog/wordpress-update-checks-every-page-load/" rel="noopener noreferrer"&gt;a multi-second delay on every screen in wp-admin&lt;/a&gt;, caused entirely by a cache that reports itself as connected and healthy. Nobody looking at that site would suspect the cache.&lt;/p&gt;

&lt;p&gt;It's also why a slow admin area so often survives every fix you throw at it. If you've been chasing that particular problem, I wrote about &lt;a href="https://wpmultitool.com/slow-admin/" rel="noopener noreferrer"&gt;what's usually going on behind a slow WordPress dashboard&lt;/a&gt; - the object cache is involved more often than people expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you check any of this yourself?
&lt;/h2&gt;

&lt;p&gt;Up to a point, yes - and it's worth seeing what that actually looks like, because it's the clearest way to understand why "Redis is installed" was never the finish line.&lt;/p&gt;

&lt;p&gt;Take the simplest one. You can ask the cache how much of what it's asked for it's actually able to serve back. That sounds like the whole game, and then the number arrives - say it's 84% - and means nothing on its own. Is 84% good? It depends on what's being thrown out to make room, how your traffic behaves, and whether those hits are saving real database work or just adding a network hop in front of a query that was already cheap. Getting the number is one line. Reading it correctly is the job.&lt;/p&gt;

&lt;p&gt;Or memory pressure. You can look at whether the cache is quietly throwing away this second what it stored last second - full, churning, evicting under load. A cache in exactly that state still reports Connected, cheerfully. Whether what you're looking at is fine or a slow-motion outage waiting for a busy afternoon comes down to how it's been told to behave when it fills up, which is precisely the setting nobody has revisited since the day it was switched on.&lt;/p&gt;

&lt;p&gt;Or isolation. On a shared box or a multisite install you can check whether this site's cache is actually walled off from every other site around it. Frequently it isn't. Nothing warns you - one site just starts occasionally serving another's data, and you find out from a confused customer rather than a dashboard.&lt;/p&gt;

&lt;p&gt;Notice the pattern. Every one of those is a single question. Every one takes real familiarity with Redis to answer rather than merely read. And every answer is true only until the next plugin update, traffic spike or host migration quietly changes it underneath you. That's three of them. There are around twenty.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built instead
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://wpmultitool.com/site-doctor/" rel="noopener noreferrer"&gt;Site Doctor&lt;/a&gt; in WP Multitool now runs 21 distinct Redis checks. Each one has its own severity, and each one comes with the specific remedy for that specific finding, not general advice about Redis.&lt;/p&gt;

&lt;p&gt;Broadly they span connection and authentication, the memory ceiling and how the server behaves when it hits it, eviction pressure under load, key isolation between sites, persistence side effects, serialization, what's being excluded from caching, repeated cache-wide flushing, multisite key prefixing, and what the round trip is costing you on every single request. Twenty-one in total, each scored on its own - because any single green light, Connected included, is not a diagnosis. Several of them are checks that would have caught the HTTP 500 scenario above long before it took a site down.&lt;/p&gt;

&lt;p&gt;One thing I want to be honest about, because it affects what you get. Some hosts block the diagnostic commands entirely. Where that happens, Site Doctor tells you it cannot verify that check on this server, and it says so plainly instead of showing a green tick.&lt;/p&gt;

&lt;p&gt;That was a deliberate decision and it cost me some very tidy-looking screenshots. A check that passes because it wasn't allowed to look is worse than having no check at all - it's the exact failure this whole post is about, just wearing my branding instead of somebody else's. If I can't see it, I'll say I can't see it.&lt;/p&gt;

&lt;p&gt;The product page is &lt;a href="https://wpmultitool.com/site-doctor/" rel="noopener noreferrer"&gt;Site Doctor&lt;/a&gt;. The longer operator write-up is &lt;a href="https://wpmultitool.com/blog/wordpress-site-doctor/" rel="noopener noreferrer"&gt;the Site Doctor overview&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bit worth remembering
&lt;/h2&gt;

&lt;p&gt;Installing Redis is a decision you made once, probably a while ago, on the assumption that it would keep being true. Plugins changed since then. Traffic changed. Your host may have moved you. The cache configuration didn't change with any of it, and nothing has been checking.&lt;/p&gt;

&lt;p&gt;And if you haven't put Redis in yet and you're weighing it up - you probably should. Done well, an object cache is one of the best speed upgrades a busy WordPress site can get, and none of this is an argument against it. Just go in with your eyes open: it's something you keep an eye on, not a switch you flip once and forget. Be careful with it and it'll pay you back.&lt;/p&gt;

&lt;p&gt;Connected tells you a socket opened. Working is a much harder question, and it's the one that decides whether the thing is earning its keep or quietly costing you.&lt;/p&gt;

&lt;p&gt;You can run two or three of these checks by hand, as above, and you'll learn something. But it's twenty-odd questions, each needing an expert eye and each one going stale the moment you look away - which is a side project, not an afternoon. If you'd rather know than assume, &lt;a href="https://wpmultitool.com/site-doctor/" rel="noopener noreferrer"&gt;Site Doctor&lt;/a&gt; runs all 21 Redis checks along with the rest of its scan, and tells you exactly what to do about anything it finds.&lt;/p&gt;

&lt;p&gt;Lite is $9 and includes Site Doctor with those Redis checks. Pro starts at $79/year and adds autoload + captured slow-query sources on top. Redis diagnostics are in Lite; they are not a Pro-only feature.&lt;/p&gt;

&lt;p&gt;If you want something free and external first, &lt;a href="https://wpmultitool.com/scan/" rel="noopener noreferrer"&gt;the free scan&lt;/a&gt; measures TTFB, compression, page size, and whether the site is WordPress - from the outside. It does not run Site Doctor or these Redis checks. Nothing outside your server can see that.&lt;/p&gt;

&lt;p&gt;Money-back on live pricing: 30 days on most cards, 14 days on the $79 Pro single-site plan. Run it once and you'll at least know which of the two situations you're in.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>redis</category>
      <category>performance</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to make your AI agent use WP Multitool</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Fri, 17 Jul 2026 08:15:12 +0000</pubDate>
      <link>https://dev.to/wpmultitool/how-to-make-your-ai-agent-use-wp-multitool-12hb</link>
      <guid>https://dev.to/wpmultitool/how-to-make-your-ai-agent-use-wp-multitool-12hb</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/07/16/how-to-make-your-ai-agent-use-wp-multitool/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/07/16/how-to-make-your-ai-agent-use-wp-multitool/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you want your AI agent to work on a WordPress site with WP Multitool, there are two things to point it at: the WP-CLI command, and the skill file. Both already exist. Here’s how to wire them up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CLI is the interface
&lt;/h2&gt;

&lt;p&gt;WP Multitool registers one WP-CLI command with 14 subcommands. If your agent has shell access and WP-CLI, it can already drive all of it:&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="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;quickstart&lt;/span&gt;    &lt;span class="c1"&gt;# scan everything, ranked worst-first&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;autoload&lt;/span&gt;      &lt;span class="c1"&gt;# what's bloating your autoloaded options&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;         &lt;span class="c1"&gt;# revisions, transients, orphaned meta&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;health&lt;/span&gt;     &lt;span class="c1"&gt;# table sizes, overhead, engine checks&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;     &lt;span class="c1"&gt;# size, growth, top offenders&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;doctor&lt;/span&gt;        &lt;span class="c1"&gt;# host/config misconfiguration checks&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;frontend&lt;/span&gt;      &lt;span class="c1"&gt;# emoji scripts, embeds, jQuery migrate&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;health&lt;/span&gt;        &lt;span class="c1"&gt;# environment snapshot: PHP, memory, opcache, db size&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;healthcheck&lt;/span&gt;   &lt;span class="c1"&gt;# pass/fail on autoload size + object cache&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;         &lt;span class="c1"&gt;# image sizes and regeneration&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;license&lt;/span&gt;       &lt;span class="c1"&gt;# license status&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;       &lt;span class="c1"&gt;# list/enable/disable modules&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;slow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;queries&lt;/span&gt;  &lt;span class="c1"&gt;# captured slow queries + EXPLAIN&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;        &lt;span class="c1"&gt;# every module, on or off&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;12 of the 14 take &lt;code&gt;--format=json&lt;/code&gt;. The two that don’t, &lt;code&gt;clean&lt;/code&gt; and &lt;code&gt;image&lt;/code&gt;, are actions rather than reports.&lt;/p&gt;

&lt;p&gt;That flag is the thing that makes this work for an agent. Every finding comes back with a &lt;code&gt;severity&lt;/code&gt;, a &lt;code&gt;why&lt;/code&gt; in plain English, a &lt;code&gt;data&lt;/code&gt; block with the raw values, and a &lt;code&gt;fix&lt;/code&gt;. The agent reads &lt;code&gt;severity&lt;/code&gt; and decides. It doesn’t have to parse a table or interpret “OPcache: warning”.&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="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;doctor&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;jq&lt;/span&gt; &lt;span class="s1"&gt;'.checks.object_cache'&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"severity"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"info"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"why"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"No persistent object cache drop-in (using DB-backed cache only)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"recommended"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"plugin"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Redis Object Cache"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="s2"&gt;"fix"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"guided"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"detail"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"..."&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 output is compact, so pipe it through &lt;code&gt;jq&lt;/code&gt; when you want to read it yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give it a loop that terminates
&lt;/h2&gt;

&lt;p&gt;Every scan returns a &lt;code&gt;summary&lt;/code&gt; block: &lt;code&gt;{"ok": 2, "info": 3, "warn": 0, "critical": 0}&lt;/code&gt;. That’s your termination condition. Scan, fix the criticals, scan again, stop when the count hits zero.&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;# 1. scan everything&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;quickstart&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="c1"&gt;# 2. drill into whatever came back hot&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;autoload&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;slow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;queries&lt;/span&gt; &lt;span class="k"&gt;list&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="c1"&gt;# 3. fix the specific thing, with a guard&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="n"&gt;export&lt;/span&gt; &lt;span class="n"&gt;backup&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="n"&gt;revisions&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;# 4. scan again, confirm the count moved&lt;/span&gt;
&lt;span class="n"&gt;wp&lt;/span&gt; &lt;span class="n"&gt;multitool&lt;/span&gt; &lt;span class="n"&gt;quickstart&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4 is the one people skip. The agent checks its own work against the same instrument it started with, so “did that help?” has an answer instead of a guess.&lt;/p&gt;

&lt;p&gt;One thing worth knowing: doctor downgrades severities when it detects a non-production host, and tells you so with &lt;code&gt;"is_nonprod": true&lt;/code&gt;. A staging site shouting CRITICAL about a missing page cache is noise, and an agent acting on that noise wastes your time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ClawHub skill
&lt;/h2&gt;

&lt;p&gt;If your agent runs on OpenClaw or ClawHub, there’s a skill file that hands it all of the above, plus the part it can’t infer: which commands are safe.&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="n"&gt;openclaw&lt;/span&gt; &lt;span class="n"&gt;skills&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;marcindudekdev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It ships with the plugin too, at &lt;code&gt;docs/wp-multitool-skill/SKILL.md&lt;/code&gt;, so you can read it before you install anything.&lt;/p&gt;

&lt;p&gt;The useful part is the autonomy split. The read commands – &lt;code&gt;quickstart&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;health&lt;/code&gt;, &lt;code&gt;db-health&lt;/code&gt;, &lt;code&gt;autoload&lt;/code&gt;, &lt;code&gt;slow-queries&lt;/code&gt;, &lt;code&gt;frontend&lt;/code&gt; – are marked safe to run without asking. Six things are marked always-confirm: &lt;code&gt;wp multitool clean&lt;/code&gt;, &lt;code&gt;wp multitool frontend enable-all&lt;/code&gt;, and the core WP-CLI commands the skill pairs them with (&lt;code&gt;wp transient delete&lt;/code&gt;, &lt;code&gt;wp post delete --force&lt;/code&gt;, &lt;code&gt;wp db optimize&lt;/code&gt;, &lt;code&gt;wp config set&lt;/code&gt;). For any of them it tells the agent to recommend &lt;code&gt;wp db export&lt;/code&gt; first. The skill’s metadata declares the same thing machine-readably, so a host that reads permissions gets it without parsing prose.&lt;/p&gt;

&lt;p&gt;I wrote that down because an agent shouldn’t have to infer from a command name whether something is destructive. &lt;code&gt;clean&lt;/code&gt; sounds harmless. It permanently deletes post revisions.&lt;/p&gt;

&lt;p&gt;The read-only diagnostics in that skill are plain WP-CLI and SQL, so they work on any WordPress 5.8+ site, with or without the plugin. The &lt;code&gt;wp multitool&lt;/code&gt; subcommands need it installed.&lt;/p&gt;

&lt;p&gt;If you wire an agent up this way and it breaks somewhere, I’d like to hear where.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>WP Multitool vs Advanced Database Cleaner: the deepest cleaner vs the diagnostic all-rounder</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Wed, 15 Jul 2026 08:15:12 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wp-multitool-vs-advanced-database-cleaner-the-deepest-cleaner-vs-the-diagnostic-all-rounder-54od</link>
      <guid>https://dev.to/wpmultitool/wp-multitool-vs-advanced-database-cleaner-the-deepest-cleaner-vs-the-diagnostic-all-rounder-54od</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/07/07/wp-multitool-vs-advanced-database-cleaner/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/07/07/wp-multitool-vs-advanced-database-cleaner/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;p&gt;Advanced Database Cleaner is the deepest pure database cleaner I found in the WordPress ecosystem, and if all you want is cleanup, its Pro version out-cleans WP Multitool. But cleaning is where ADC ends and where WP Multitool starts. WPMT covers the common cleanup jobs and then adds the whole diagnostic layer: slow-query EXPLAIN, plugin scoring, callback profiling, autoload optimization. Whether WP Multitool works as an Advanced Database Cleaner alternative depends on which of those two problems you actually have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for an Advanced Database Cleaner alternative?
&lt;/h2&gt;

&lt;p&gt;It depends on which half of ADC you want replaced. For everyday cleanup, WP Multitool’s Database Optimizer covers the routine jobs, and so do &lt;a href="https://dev.to/compare/wp-multitool-vs-wp-optimize/"&gt;WP-Optimize&lt;/a&gt; and the free &lt;a href="https://dev.to/compare/wp-multitool-vs-wp-sweep/"&gt;WP-Sweep&lt;/a&gt;. For ADC Pro’s deep specialties, orphaned-table detection with ownership attribution and cron-job cleanup, there is no real replacement; that is its moat. What none of the cleaners offer is diagnosis: EXPLAIN on your slow queries, autoload analysis, per-plugin scoring. I mapped the full landscape in &lt;a href="https://dev.to/compare/"&gt;WP Multitool vs the alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Advanced Database Cleaner does
&lt;/h2&gt;

&lt;p&gt;ADC, from Sigma Plugin, is cleanup plus attribution. The free version handles the usual junk: revisions, drafts, trash, spam, expired transients, orphaned and duplicated metadata across posts, comments, users and terms, plus table optimize and repair, with preview-before-delete and “keep last X days” retention rules. Up to five scheduled tasks and multisite support, free.&lt;/p&gt;

&lt;p&gt;The Pro version is where it gets genuinely impressive. It detects orphaned tables and orphaned options left behind by uninstalled plugins and validates ownership against a curated remote database (they call it SmartScan, credit-limited per day). It cleans cron jobs and Action Scheduler rows, shows a per-plugin activity timeline, and charts database growth trends. Pricing is friendly too: annual tiers at $39, $59 and $119 per year, or lifetime licenses from $79 for one site up to $249 for unlimited sites.&lt;/p&gt;

&lt;p&gt;If your problem is “this site is eight years old and forty uninstalled plugins left debris everywhere”, ADC Pro is the best dedicated tool for that job. I will not pretend otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What WP Multitool does
&lt;/h2&gt;

&lt;p&gt;WP Multitool’s Database Optimizer module covers the common cleanup jobs: revisions, auto-drafts, trash, expired transients, orphaned meta, spam comments, OPTIMIZE TABLE, scheduled cleanups, and a preview of reclaimable space before anything gets deleted. A separate Action Scheduler Optimizer purges completed and failed rows, which matters a lot on WooCommerce sites.&lt;/p&gt;

&lt;p&gt;But the reason WPMT exists is the layer ADC does not have: finding out why the database is slow. The Slow Query Analyzer logs slow queries and runs MySQL EXPLAIN on them locally, rule-based, then suggests a ready-to-run index. The Autoloader Optimizer classifies every autoloaded option (safe, inactive-plugin, oversized, bloat, unrecognized) and optimizes with backup and restore, which overlaps with ADC’s orphaned-options detection but targets the specific set of options that load on every request. Add the &lt;a href="https://dev.to/blog/how-to-find-which-plugin-is-slowing-wordpress/"&gt;per-plugin performance score&lt;/a&gt;, the callback profiler, Site Doctor, Debug Log Guard and the rest of the 18 modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Head-to-head
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Advanced DB Cleaner&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;Core cleanup (revisions, transients, spam, orphaned meta)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retention rules (“keep last X”)&lt;/td&gt;
&lt;td&gt;✓ (fine-grained)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orphaned tables detection + ownership attribution&lt;/td&gt;
&lt;td&gt;✓ (Pro, SmartScan)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cron-job cleanup&lt;/td&gt;
&lt;td&gt;✓ (Pro)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action Scheduler cleanup&lt;/td&gt;
&lt;td&gt;✓ (Pro)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB growth analytics&lt;/td&gt;
&lt;td&gt;✓ (Pro)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow query logging + EXPLAIN + index suggestions&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autoload classification + one-click optimization&lt;/td&gt;
&lt;td&gt;partial (orphaned options)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-plugin performance score&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓ (static dataset)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hook/callback profiling&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where Advanced Database Cleaner wins
&lt;/h2&gt;

&lt;p&gt;On pure cleanup depth, ADC wins and it is not close. Orphaned table detection with remote ownership validation is something WPMT simply does not do. Its retention rules are finer, it cleans cron jobs, it has multisite support, and it charts how your database grows over time. It is also cheaper if cleanup is all you need: $39 a year or $79 lifetime for one site. For a maintenance contract where the deliverable is “remove years of accumulated debris safely”, ADC Pro is arguably the best money you can spend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where WP Multitool wins
&lt;/h2&gt;

&lt;p&gt;ADC never measures performance. It removes data; it does not diagnose slowness. It cannot tell you that one query is doing a full table scan on wp_postmeta, that a specific plugin is responsible for half your query load, or that your autoload is 4 MB and which options to fix. A database can be perfectly clean and still slow, because bloat is only one of several root causes. WPMT runs &lt;a href="https://dev.to/blog/how-to-read-mysql-explain-wordpress/"&gt;EXPLAIN on your actual slow queries&lt;/a&gt; and hands you the index, profiles callbacks, scores plugins, and fixes autoload with a backup. And its own cleanup module handles the everyday jobs, so for most sites you do not need a second cleaner alongside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which should you use?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Old site, lots of uninstalled-plugin debris, cleanup is the whole job: ADC Pro. Best-in-class for that.&lt;/li&gt;
&lt;li&gt;Site is slow and cleanup did not fix it: WP Multitool. You need diagnosis, not a deeper broom.&lt;/li&gt;
&lt;li&gt;Agency doing rescue work: honestly, both together is a strong combo. WPMT finds the cause and handles routine hygiene; ADC does the deep archaeological dig on orphaned tables. They do not conflict.&lt;/li&gt;
&lt;li&gt;If you only buy one and your problem is performance rather than clutter, buy the one that diagnoses.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;ADC is the better cleaner. WP Multitool is the better answer to “why is this database slow”, and it cleans well enough that most sites will not miss a dedicated cleaner. If diagnosis is what you are missing: $9 Lite (one-time, unlimited sites, 11 modules) → $79/yr Pro (1 site) or $199/yr (unlimited sites) with all 18 modules → $499 lifetime (unlimited sites). Details on &lt;a href="https://dev.to/pricing/"&gt;pricing&lt;/a&gt;, and the full landscape is in &lt;a href="https://dev.to/compare/"&gt;WP Multitool vs the alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is WP Multitool an Advanced Database Cleaner alternative?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For everyday cleanup, yes: WP Multitool’s Database Optimizer handles revisions, transients, orphaned meta, spam, OPTIMIZE and scheduled cleanups, with a reclaimable-space preview, and a separate module purges Action Scheduler rows. For ADC Pro’s deep specialties it is not: orphaned-table detection with ownership attribution, cron-job cleanup and fine-grained retention rules have no WP Multitool equivalent. What WP Multitool adds instead is diagnostics: slow-query EXPLAIN with index suggestions, autoload analysis, plugin scoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Advanced Database Cleaner diagnose slow queries?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Advanced Database Cleaner cleans and attributes leftover data, but it has no slow-query logging, no EXPLAIN, no per-plugin profiling and no autoload analysis. A database can be perfectly clean and still slow, because bloat is only one of several root causes. That diagnostic layer is what WP Multitool adds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Advanced Database Cleaner and WP Multitool run together?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, they coexist fine. A sensible split is ADC for the deep archaeological cleanup (orphaned tables, cron jobs) and WP Multitool for diagnostics and routine hygiene. Just let one tool own the scheduled cleanups so they do not double-run. WP Multitool Lite is $9 one-time for unlimited sites.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>WP Multitool vs the alternatives: an honest map of the “optimization plugin” mess</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Tue, 14 Jul 2026 08:15:11 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wp-multitool-vs-the-alternatives-an-honest-map-of-the-optimization-plugin-mess-5cmh</link>
      <guid>https://dev.to/wpmultitool/wp-multitool-vs-the-alternatives-an-honest-map-of-the-optimization-plugin-mess-5cmh</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/07/07/wp-multitool-vs-alternatives/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/07/07/wp-multitool-vs-alternatives/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Four different jobs wearing one word
&lt;/h2&gt;

&lt;p&gt;“WordPress optimization plugin” is close to meaningless. The phrase covers four jobs that share a marketing word but do unrelated work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Caching&lt;/strong&gt; stores rendered HTML or query results so the server does less work per hit. WP Rocket, LiteSpeed Cache, Hummingbird.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asset optimization&lt;/strong&gt; minifies, defers and lazyloads so the browser renders faster. Perfmatters, NitroPack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DB cleanup&lt;/strong&gt; deletes revisions, transients and orphans. WP-Optimize, Advanced Database Cleaner, WP-Sweep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnostics&lt;/strong&gt; finds out WHY the site is slow: queries, plugins, hooks, config. Query Monitor, New Relic, Code Profiler.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first two act on symptoms. They make delivery faster without ever asking why the server was slow. The third removes one specific root cause. Only the fourth diagnoses. WP Multitool lives in the fourth box and also carries the remediation of the third: it runs MySQL EXPLAIN on your slow queries and hands you index fixes, scores every plugin, classifies your autoload, then fixes what it finds. That combination is why it keeps getting compared against tools doing a completely different job, and why this page exists.&lt;/p&gt;

&lt;p&gt;Here’s the whole landscape on two axes: does the tool &lt;strong&gt;measure the cause&lt;/strong&gt;, and does it &lt;strong&gt;act on it&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo10h4pt0ekbn4uumu84b.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo10h4pt0ekbn4uumu84b.webp" alt="Map of WordPress optimization tools on measure-the-cause versus act-on-it axes; WP Multitool sits alone in the measure-and-fix quadrant." width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The landscape on two axes: does the tool measure the cause, and does it act on it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The rule of thumb that resolves 90% of the confusion: if a plugin’s job is to make pages load faster, it’s a cache or an asset optimizer, a different tool. WP Multitool’s job is to tell you why the backend is slow and fix the cause. You run both.&lt;/p&gt;

&lt;p&gt;Below, every comparison I’ve written, grouped by what the tool actually does. Each link goes to a full honest head-to-head, including where the other tool wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Group 1: Diagnostics and profiling (same job, different depths)
&lt;/h2&gt;

&lt;p&gt;These are the true competitors. They diagnose the backend, which is WP Multitool’s home turf. The differences are in what they measure, how accurately, and whether they fix anything afterwards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-query-monitor/"&gt;Query Monitor&lt;/a&gt;&lt;/strong&gt; is the free, canonical dev-time diagnostic. Request-scoped, informs only, and every WordPress developer should have it. WP Multitool adds persistent monitoring, EXPLAIN index advice and one-click fixes on top.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-code-profiler/"&gt;Code Profiler&lt;/a&gt;&lt;/strong&gt; measures real per-plugin and per-function execution time on your actual site, which is more accurate than WP Multitool’s static &lt;a href="https://dev.to/blog/plugin-performance-score/"&gt;plugin score dataset&lt;/a&gt;. I concede that plainly. It stops at measurement though: no EXPLAIN, no autoload, no remediation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-new-relic/"&gt;New Relic&lt;/a&gt;&lt;/strong&gt; is production-grade continuous APM, the most accurate profiling in this list, priced and shaped for enterprises rather than agency site fleets. It shows you the slow query and the stack trace; it never advises the index.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-wp-debug-toolkit/"&gt;WP Debug Toolkit&lt;/a&gt;&lt;/strong&gt; is the most direct commercial “toolkit” competitor by framing, with three tools (error log viewer, query viewer, site monitor) and a $199 lifetime price (as of July 2026) that undercuts ours. Its remediation is crash recovery (regain access after a fatal); it is thinner on query analysis and autoload and does not fix those root causes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Group 2: Database cleanup (overlap on one module)
&lt;/h2&gt;

&lt;p&gt;These overlap with exactly one of WP Multitool’s 18 modules, the Database Optimizer. They clean bloat; they don’t profile, EXPLAIN or diagnose. And credit where due: the dedicated cleaners often go deeper on pure cleanup than we do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-wp-optimize/"&gt;WP-Optimize&lt;/a&gt;&lt;/strong&gt; bundles cleanup with caching and image compression, a genuine all-in-one on the delivery side. &lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-advanced-database-cleaner/"&gt;Advanced Database Cleaner&lt;/a&gt;&lt;/strong&gt; is the deepest pure cleaner I looked at, with orphaned-table detection and ownership attribution WP Multitool doesn’t match. &lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-wp-sweep/"&gt;WP-Sweep&lt;/a&gt;&lt;/strong&gt; is the simple free option using proper WordPress delete functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-index-wp-mysql-for-speed/"&gt;Index WP MySQL For Speed&lt;/a&gt;&lt;/strong&gt; deserves its own line: it’s the closest tool to us I found on the query axis specifically. It measures your real queries, then applies predefined better indexes to core tables. It has no EXPLAIN plans (per-query timing stats only), and nothing outside the query layer, but it measures real workloads and I respect the approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Group 3: Caching and asset suites (different job entirely)
&lt;/h2&gt;

&lt;p&gt;The tools people most often compare us to, and the comparison is a category error. They speed up delivery. They cannot tell you which query or plugin makes your TTFB slow, and &lt;a href="https://dev.to/blog/why-caching-plugins-dont-fix-slow-wordpress/"&gt;caching over a backend problem doesn’t fix it&lt;/a&gt;. The honest verdict in every one of these posts is the same: run both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-wp-rocket/"&gt;WP Rocket&lt;/a&gt;&lt;/strong&gt; is the premium caching standard, and WP Multitool is not an alternative to it. &lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-litespeed-cache/"&gt;LiteSpeed Cache&lt;/a&gt;&lt;/strong&gt; is the free powerhouse if your server runs LiteSpeed, and the only caching plugin I found that even displays autoload data (read-only, top 20, no fix). &lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-perfmatters/"&gt;Perfmatters&lt;/a&gt;&lt;/strong&gt; is the asset-optimization scalpel whose script manager partly mirrors our light Frontend Optimizer. &lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-nitropack/"&gt;NitroPack&lt;/a&gt;&lt;/strong&gt; is the automated delivery SaaS. &lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-hummingbird/"&gt;Hummingbird&lt;/a&gt;&lt;/strong&gt; is WPMU DEV’s polished freemium suite with a Lighthouse-style score audit, the closest of this cohort to a diagnostics story, though its diagnostics stop at the page level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Group 4: Object-cache backends (complementary, full stop)
&lt;/h2&gt;

&lt;p&gt;These provide an object-cache backend. WP Multitool provides none; it monitors object-cache health (Site Doctor flags a dead drop-in, System Info shows Redis status). Not competitors in any sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-redis-object-cache/"&gt;Redis Object Cache&lt;/a&gt;&lt;/strong&gt; is the free ecosystem default; if your host has Redis, install it today. &lt;strong&gt;&lt;a href="https://dev.to/compare/wp-multitool-vs-object-cache-pro/"&gt;Object Cache Pro&lt;/a&gt;&lt;/strong&gt; is the same vendor’s business-class version at $95/month (as of July 2026), with the strongest cache observability I’ve seen in this space, priced for hosts and high-traffic sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  The master table
&lt;/h2&gt;

&lt;p&gt;Compact version of the full capability grid. ✓ full, ◐ partial, ✗ none. All prices are as of July 2026.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Per-plugin profile&lt;/th&gt;
&lt;th&gt;Query EXPLAIN + index advice&lt;/th&gt;
&lt;th&gt;Hook profiling&lt;/th&gt;
&lt;th&gt;Autoload analysis&lt;/th&gt;
&lt;th&gt;DB cleanup&lt;/th&gt;
&lt;th&gt;Page cache / assets&lt;/th&gt;
&lt;th&gt;Fixes what it finds&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WP Multitool&lt;/td&gt;
&lt;td&gt;diagnostics + backend fix&lt;/td&gt;
&lt;td&gt;◐ (static dataset)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;◐ (light script cleanup)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗ (Lite $9 one-time)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query Monitor&lt;/td&gt;
&lt;td&gt;diagnostics&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;◐ (raw EXPLAIN, no index advice)&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code Profiler&lt;/td&gt;
&lt;td&gt;diagnostics&lt;/td&gt;
&lt;td&gt;✓ (measured)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Relic&lt;/td&gt;
&lt;td&gt;APM&lt;/td&gt;
&lt;td&gt;✓ (measured)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WP Debug Toolkit&lt;/td&gt;
&lt;td&gt;diagnostics&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WP-Optimize&lt;/td&gt;
&lt;td&gt;DB + delivery&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced DB Cleaner&lt;/td&gt;
&lt;td&gt;DB cleanup&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;✓ (deepest)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WP-Sweep&lt;/td&gt;
&lt;td&gt;DB cleanup&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Index WP MySQL For Speed&lt;/td&gt;
&lt;td&gt;index optimization&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;◐ (timings, no EXPLAIN)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓ (adds keys)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WP Rocket&lt;/td&gt;
&lt;td&gt;caching&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiteSpeed Cache&lt;/td&gt;
&lt;td&gt;caching + assets&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;◐ (read-only)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perfmatters&lt;/td&gt;
&lt;td&gt;asset optimization&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;✓ (assets only)&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NitroPack&lt;/td&gt;
&lt;td&gt;delivery SaaS&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;◐ (auto-applies)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hummingbird&lt;/td&gt;
&lt;td&gt;delivery suite&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis Object Cache&lt;/td&gt;
&lt;td&gt;object cache&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (object layer)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object Cache Pro&lt;/td&gt;
&lt;td&gt;object cache + observability&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (object layer)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ ($95/mo)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Reading down the index-advice, hook-profiling and autoload columns tells the story: WP Multitool is the only tool in this table with all three, and the only one I found that pairs backend diagnosis with one-click fixes across queries, autoload, database, debug.log and config. It is not #1 in any single column. The APMs and Code Profiler beat it on profiling accuracy, the caching suites own delivery entirely, and the dedicated cleaners go deeper on cleanup. The claim is breadth of diagnose-and-fix in one dashboard, and that claim holds.&lt;/p&gt;

&lt;h2&gt;
  
  
  So which should you actually use?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your pages render slowly and you haven’t set up caching?&lt;/strong&gt; Start with a caching or asset plugin (WP Rocket, LiteSpeed, Hummingbird, Perfmatters). That’s not us, and I won’t pretend otherwise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your TTFB is slow, or the cache helped less than expected?&lt;/strong&gt; That’s a backend cause: a query, &lt;a href="https://dev.to/blog/how-to-find-which-plugin-is-slowing-wordpress/"&gt;a plugin&lt;/a&gt;, an autoload blob, a misconfig. That’s WP Multitool’s job, and no caching plugin does it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You’re a developer debugging one request right now?&lt;/strong&gt; Query Monitor, free, no contest. Add WP Multitool when you need persistence, &lt;a href="https://dev.to/blog/how-to-read-mysql-explain-wordpress/"&gt;EXPLAIN advice&lt;/a&gt; and fixes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need continuous production monitoring with budget to match?&lt;/strong&gt; An APM. WP Multitool complements it with index advice and remediation the APM won’t give you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You just want the database cleaned?&lt;/strong&gt; A free dedicated cleaner is fine. WP Multitool makes sense when you want cleanup plus the diagnostic layer around it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You have Redis available?&lt;/strong&gt; Install Redis Object Cache regardless of anything else on this page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most real setups end up with a cache, an object cache, and a diagnostics layer. WP Multitool is the third one, and the only spot on this map I found where measuring the cause and fixing it live in the same tool.&lt;/p&gt;

&lt;p&gt;If that’s the gap in your stack: $9 Lite (one-time, unlimited sites, 11 modules) → $79/yr Pro (1 site) or $199/yr (unlimited sites) with all 18 modules → $499 lifetime (unlimited sites). Compare tiers on &lt;a href="https://dev.to/pricing/"&gt;/pricing/&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>WP Multitool vs Code Profiler: measured profiling accuracy vs breadth plus fixes</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Mon, 13 Jul 2026 08:15:13 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wp-multitool-vs-code-profiler-measured-profiling-accuracy-vs-breadth-plus-fixes-54bc</link>
      <guid>https://dev.to/wpmultitool/wp-multitool-vs-code-profiler-measured-profiling-accuracy-vs-breadth-plus-fixes-54bc</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/07/07/wp-multitool-vs-code-profiler/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/07/07/wp-multitool-vs-code-profiler/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;p&gt;Code Profiler (by NinTechNet, the NinjaFirewall people) and WP Multitool are both backend diagnostics tools, so this is a same-job comparison. Code Profiler is the more accurate raw profiler: it measures real per-plugin and per-function execution time on your actual site, on demand. WP Multitool covers the profiling question differently and then goes much wider – persistent slow-query logging with MySQL EXPLAIN index advice, autoload optimization, DB cleanup, config fixes. Measure precisely with Code Profiler; diagnose broadly and fix with WP Multitool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for a Code Profiler alternative?
&lt;/h2&gt;

&lt;p&gt;Most people searching for a Code Profiler alternative aren’t questioning its accuracy. They’ve run a profile, got the report, and realized the tool’s job ends there: it measures on demand and never watches production or fixes anything. If that’s the gap you’ve hit, WP Multitool covers exactly that side, and this post walks through where each tool honestly wins. For the wider landscape, I mapped all 15 tools in &lt;a href="https://dev.to/compare/"&gt;WP Multitool vs the alternatives&lt;/a&gt;. Two close neighbours: &lt;a href="https://dev.to/compare/wp-multitool-vs-query-monitor/"&gt;Query Monitor&lt;/a&gt;, the free per-request reference, and &lt;a href="https://dev.to/compare/wp-multitool-vs-new-relic/"&gt;New Relic&lt;/a&gt;, the continuous production APM.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Code Profiler does
&lt;/h2&gt;

&lt;p&gt;Code Profiler is an on-demand PHP-level profiler that runs inside wp-admin. You point it at a URL – frontend, admin, POST with custom cookies, cron event, AJAX action – it runs the request under instrumentation and produces a report ranking plugins and themes by actual execution time, with charts. The closest thing to running a profiler like Blackfire without leaving WordPress, and without server access or an APM subscription.&lt;/p&gt;

&lt;p&gt;The free version on WordPress.org (8,000+ installs, 4.3/5, actively maintained) does per-plugin and per-theme timing plus file I/O stats. Pro adds per-script, per-function, and per-method profiling, database query analysis, remote-connection monitoring, and CSV export. Pro pricing as of July 2026: $89/yr for 10 sites, or $399 lifetime for 500 sites.&lt;/p&gt;

&lt;p&gt;The design is one-shot: you profile a request when you choose to. It measures, reports, and stops there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What WP Multitool does
&lt;/h2&gt;

&lt;p&gt;WP Multitool answers the same “what’s eating the page load” question with three modules, then adds a repair layer. The &lt;a href="https://dev.to/blog/plugin-performance-score/"&gt;Plugin Performance Score&lt;/a&gt; puts a 0-100 benchmark next to every plugin on the Plugins page, based on a bundled dataset of ~5,000 measured plugins. Find Slow Callbacks runs timing sessions on action and filter callbacks via an MU-plugin. The Slow Query Analyzer logs slow queries continuously on production and runs MySQL EXPLAIN on each one locally (rule-based, no API, no AI), producing ready-to-run index suggestions.&lt;/p&gt;

&lt;p&gt;Then the fixing part: Autoloader Optimizer, Database Optimizer, Action Scheduler purge, Site Doctor one-click config fixes, Debug Log Guard, wp-config editor, crash recovery. 18 modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Head-to-head
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Code Profiler&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;Per-plugin execution time, measured live on your site&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗ (static benchmark score)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Function/method-level profiling&lt;/td&gt;
&lt;td&gt;✓ (Pro)&lt;/td&gt;
&lt;td&gt;partial (per-hook callbacks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profile arbitrary POST/cron/AJAX requests on demand&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continuous slow-query logging on production&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL EXPLAIN + index suggestions&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autoload analysis + optimization&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database cleanup / Action Scheduler purge&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config scanning + one-click fixes&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File/disk I/O stats&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Free / Pro $89/yr (10 sites)&lt;/td&gt;
&lt;td&gt;Lite $9 one-time (unlimited sites) / Pro from $79/yr / $499 lifetime&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where Code Profiler wins
&lt;/h2&gt;

&lt;p&gt;Raw profiling accuracy. This one is clear-cut and I’ll say it plainly: Code Profiler measures what your plugins actually cost on your actual site, request by request. WP Multitool’s per-plugin score comes from a static bundled dataset of benchmark measurements – useful as a fast screen across everything installed, but a benchmark of the plugin in general, and less accurate for your specific site than a live measured profile. For “exactly how many milliseconds does plugin X add to this checkout request”, Code Profiler gives the better answer.&lt;/p&gt;

&lt;p&gt;Pro’s function-level depth also goes past what Find Slow Callbacks shows, the ability to profile arbitrary POST, cron, and AJAX requests on demand is genuinely useful for rescue work, and the free tier already covers per-plugin timing. Solid tool, fair pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where WP Multitool wins
&lt;/h2&gt;

&lt;p&gt;Everything around the profile, and everything after it. Code Profiler runs when you run it. WP Multitool watches production continuously, so the slow query that only appears under real traffic gets logged with EXPLAIN output and an index suggestion attached. That query-level advice exists in neither Code Profiler nor anything else I found while &lt;a href="https://dev.to/blog/how-to-find-which-plugin-is-slowing-wordpress/"&gt;researching how to find what’s slowing WordPress&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And Code Profiler never fixes anything – that’s simply outside its scope. WP Multitool trims autoload with backup, cleans the DB, fixes config problems, manages debug.log, recovers from fatals. One profiling report usually produces a to-do list; WP Multitool is built to also work through that list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which should you use?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You need to know exactly which plugin costs what, right now, measured&lt;/strong&gt; – Code Profiler. It’s the better pure profiler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You maintain sites over time and want diagnosis plus repair in one dashboard&lt;/strong&gt; – WP Multitool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep rescue job on a badly slow site&lt;/strong&gt; – honestly, both: profile with Code Profiler to nail the heavyweight plugin, use WP Multitool for the query/index/autoload/DB layer and the fixes. They overlap less than the category suggests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The close
&lt;/h2&gt;

&lt;p&gt;Code Profiler is the more accurate profiler and I won’t pretend a static score beats a live measurement. WP Multitool covers the rest of the diagnostic surface and then does the repairs. Pricing: $9 Lite (one-time, unlimited sites, 11 modules) → $79/yr Pro (1 site) or $199/yr (unlimited sites) with all 18 modules → $499 lifetime (unlimited sites). Details on &lt;a href="https://dev.to/pricing/"&gt;pricing&lt;/a&gt;, and the full landscape is in &lt;a href="https://dev.to/compare/"&gt;WP Multitool vs the alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is WP Multitool a Code Profiler alternative?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For raw profiling accuracy, no. Code Profiler measures real per-plugin and per-function execution time on your actual site, which is more accurate than WP Multitool’s static benchmark score. WP Multitool is the alternative when you want what a one-shot profiler leaves out: continuous slow-query logging on production, MySQL EXPLAIN with index suggestions, and fixes for autoload, database bloat and config problems. Many people run both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Code Profiler free?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is a free version on WordPress.org that covers per-plugin and per-theme timing plus file I/O stats. Pro adds per-script, per-function and per-method profiling, database query analysis and CSV export, at $89/yr for 10 sites or $399 lifetime for 500 sites as of July 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I run Code Profiler and WP Multitool together?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, and for a deep rescue job on a slow site that is the setup I would use. Profile on demand with Code Profiler to nail the heavyweight plugin, and let WP Multitool watch production over time, run EXPLAIN on the slow queries, and handle the autoload, database and config fixes. WP Multitool Lite is $9 one-time for unlimited sites.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>WP Multitool vs Hummingbird: score audits vs cause diagnosis, and you can run both</title>
      <dc:creator>WP Multitool</dc:creator>
      <pubDate>Mon, 13 Jul 2026 08:15:12 +0000</pubDate>
      <link>https://dev.to/wpmultitool/wp-multitool-vs-hummingbird-score-audits-vs-cause-diagnosis-and-you-can-run-both-2jc6</link>
      <guid>https://dev.to/wpmultitool/wp-multitool-vs-hummingbird-score-audits-vs-cause-diagnosis-and-you-can-run-both-2jc6</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wpmultitool.com/2026/07/07/wp-multitool-vs-hummingbird/" rel="noopener noreferrer"&gt;https://wpmultitool.com/2026/07/07/wp-multitool-vs-hummingbird/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;p&gt;Hummingbird is a delivery suite: caching, minification, a Lighthouse-style score audit, light database cleanup and uptime monitoring. WP Multitool is backend diagnostics: it finds the query, plugin or autoload blob that makes your TTFB slow, then fixes it. They overlap on database cleanup and not much else. Most sites can run both without conflict.&lt;/p&gt;

&lt;p&gt;I build WP Multitool, so read this knowing that. I will still give Hummingbird full credit where it earns it, starting with its free tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for a Hummingbird alternative?
&lt;/h2&gt;

&lt;p&gt;If you searched for a Hummingbird alternative and landed here, WP Multitool is not one: it has no page cache, no minification pipeline, no uptime monitoring. If you want a different tool for the delivery job, the honest candidate is &lt;a href="https://dev.to/compare/wp-multitool-vs-wp-rocket/"&gt;WP Rocket&lt;/a&gt;; if the part of Hummingbird you actually used was the database cleanup, &lt;a href="https://dev.to/compare/wp-multitool-vs-wp-optimize/"&gt;WP-Optimize&lt;/a&gt; is the closer comparison. What WP Multitool covers is the layer none of them touch: diagnosing the backend cause and fixing it. I mapped the whole landscape in &lt;a href="https://dev.to/compare/"&gt;WP Multitool vs the alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hummingbird does
&lt;/h2&gt;

&lt;p&gt;Hummingbird is WPMU DEV’s performance suite, and it covers a lot of delivery ground: full-page, browser and Gravatar caching, GZIP, CSS/JS minify and combine, defer for non-critical assets, font optimization and Cloudflare integration. Its Performance Test runs a Lighthouse-style scan and gives you per-metric scores (LCP, TBT, CLS) with recommendations. Pro adds delay-JS, automatic Critical CSS and a CDN.&lt;/p&gt;

&lt;p&gt;Two things worth crediting that people often assume are paid: scheduled database cleanup and uptime monitoring are both in the free wordpress.org version. The catch is that each is gated behind connecting your site to a free WPMU DEV account. Not Pro-only, but not fully standalone either.&lt;/p&gt;

&lt;h2&gt;
  
  
  What WP Multitool does
&lt;/h2&gt;

&lt;p&gt;WP Multitool works on the other side of the request. Its Slow Query Analyzer captures slow database queries and runs MySQL EXPLAIN on them locally, rule-based, then suggests ready-to-run index fixes. The Plugin Performance Score puts a 0-100 benchmark next to every plugin on your Plugins page. Autoloader Optimizer classifies every autoloaded option and cleans up with backup. Site Doctor scans for server misconfigurations (dead object cache, broken OPcache, page cache that fails loopback) with one-click fixes. Plus a Database Optimizer, callback profiler, debug.log guard and a set of admin utilities. 18 modules total.&lt;/p&gt;

&lt;p&gt;Nothing in that list makes your pages render faster on their own. That is Hummingbird’s job. WP Multitool’s job is telling you why the server took 3 seconds before Hummingbird’s cache had anything to serve. More on that split in &lt;a href="https://dev.to/blog/why-caching-plugins-dont-fix-slow-wordpress/"&gt;why caching plugins don’t fix slow WordPress&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Head-to-head
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Hummingbird&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;Page caching&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asset optimization (minify, defer, Critical CSS)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;partial (light script cleanup only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page-level score audit (Lighthouse-style)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow-query capture + EXPLAIN with index advice&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-plugin performance scoring&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hook/callback profiling&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autoload analysis + cleanup&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database cleanup&lt;/td&gt;
&lt;td&gt;✓ (scheduling needs free WPMU DEV account)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server/config misconfiguration scan + fixes&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uptime monitoring&lt;/td&gt;
&lt;td&gt;✓ (needs free WPMU DEV account)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where Hummingbird wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Delivery optimization.&lt;/strong&gt; Page cache, minification, Critical CSS, CDN. WP Multitool deliberately does none of this, so if you need faster page loads today, Hummingbird acts on that directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The freemium package is genuinely generous.&lt;/strong&gt; Caching, asset optimization, scheduled DB cleanup and uptime monitoring at $0 is a strong deal, even with the account-connection requirement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polish and ecosystem.&lt;/strong&gt; The UI is one of the friendliest in the category, and agencies already inside WPMU DEV get Hub management, white-label and multi-site oversight that a standalone plugin can’t match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uptime monitoring.&lt;/strong&gt; WP Multitool has nothing comparable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where WP Multitool wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It diagnoses the cause, not the symptom.&lt;/strong&gt; Hummingbird’s Performance Test tells you your LCP is bad. It cannot tell you which query or which plugin caused a slow TTFB. WP Multitool’s EXPLAIN engine, &lt;a href="https://dev.to/blog/how-to-find-which-plugin-is-slowing-wordpress/"&gt;per-plugin scores&lt;/a&gt; and callback profiler answer exactly that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autoload forensics.&lt;/strong&gt; Classifying and cleaning autoloaded options is a genuine blind spot for the entire caching cohort, Hummingbird included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend config scanning.&lt;/strong&gt; Site Doctor checks OPcache health, dead object-cache drop-ins and sandbox payment gateways with one-click fixes. Hummingbird’s recommendations stay at the page level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deeper database cleanup.&lt;/strong&gt; Both clean the database, but WP Multitool adds reclaimable-space preview, orphaned meta detail and Action Scheduler purging, with scheduling in every edition and no account connection required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which should you use?
&lt;/h2&gt;

&lt;p&gt;If your pages render slowly and you want caching, minification and a score to chase, use Hummingbird. If your backend is slow and you want to know why (which query, which plugin, which autoload blob) and fix it, use WP Multitool. If you’re serious about performance, run both: Hummingbird for delivery, WP Multitool for diagnosis. They don’t step on each other, because they work on different layers of the same request.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest close
&lt;/h2&gt;

&lt;p&gt;Hummingbird is one of the better freemium delivery suites, and I won’t pretend WP Multitool replaces its cache or its CDN. It replaces the guessing that happens before you configure them. &lt;a href="https://dev.to/pricing/"&gt;WP Multitool&lt;/a&gt; is $9 Lite (one-time, unlimited sites, 11 modules) → $79/yr Pro (1 site) or $199/yr (unlimited sites) with all 18 modules → $499 lifetime (unlimited sites). The full tool landscape is mapped in &lt;a href="https://dev.to/compare/"&gt;WP Multitool vs the alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is WP Multitool a Hummingbird alternative?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, and I build WP Multitool. Hummingbird is a delivery suite: page caching, minification, a Lighthouse-style score audit, plus uptime monitoring. WP Multitool is a backend diagnostics and repair plugin with no page cache. If you want a different delivery suite, look at WP Rocket; if you mainly used Hummingbird for database cleanup, WP-Optimize is the closer comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are Hummingbird’s scheduled database cleanup and uptime monitoring free?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, both are in the free wordpress.org version, not Pro-only. The catch is that each requires connecting your site to a free WPMU DEV account before it activates. WP Multitool’s database cleanup scheduling works in every edition with no account connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I run Hummingbird and WP Multitool at the same time?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Hummingbird owns the delivery layer (caching, minification, Critical CSS) and WP Multitool works underneath it on the backend (slow queries, autoload bloat, plugin overhead, misconfigurations). The one overlap is database cleanup: pick one plugin to own the cleanup schedule so they do not double-run.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
