{"id":353329,"date":"2026-08-22T13:54:49","date_gmt":"2026-08-22T13:54:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/database-health-check\/"},"modified":"2026-08-23T10:05:02","modified_gmt":"2026-08-23T10:05:02","slug":"turbopress-database-diagnostics","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/turbopress-database-diagnostics\/","author":23479084,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.4","stable_tag":"1.0.4","tested":"7.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Turbopress Database Diagnostics","header_author":"turbopress","header_description":"Shows why WordPress loads slowly: autoload size with the plugin responsible, database bloat, and the state of object cache and OPcache.","assets_banners_color":"412919","last_updated":"2026-08-23 10:05:02","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/turbopress.de\/wordpress-datenbank-aufraeumen\/","header_author_uri":"https:\/\/turbopress.de","rating":0,"author_block_rating":0,"active_installs":0,"downloads":90,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.3":{"tag":"1.0.3","author":"robbsie","date":"2026-08-22 14:13:03"},"1.0.4":{"tag":"1.0.4","author":"robbsie","date":"2026-08-23 10:05:02"}},"upgrade_notice":{"1.0.4":"<p>Corrects the description of how autoloaded options behave in memory. No change to what is measured or scored; one WP-CLI metric was renamed.<\/p>","1.0.2":"<p>The plugin was renamed to Turbopress Database Diagnostics; the WP-CLI command and the public filters changed with it.<\/p>","1.0.1":"<p>Corrects two wrong statements about transient cleanup and adds a category for transient rows an object cache has made unreachable.<\/p>","1.0.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3660666,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3660666,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3660666,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3660666,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.3","1.0.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3660666,"resolution":"1","location":"assets","locale":"","width":1280,"height":850},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3660666,"resolution":"2","location":"assets","locale":"","width":1280,"height":893},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3660666,"resolution":"3","location":"assets","locale":"","width":1280,"height":660},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3660666,"resolution":"4","location":"assets","locale":"","width":1280,"height":1045},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3660666,"resolution":"5","location":"assets","locale":"","width":1280,"height":1075}},"screenshots":{"1":"The diagnostics tab: the score, the plain sentences behind it, and every deduction listed with the finding that caused it.","2":"Autoloaded options attributed to the plugin that created them, with the unattributed remainder grouped by prefix.","3":"Autoload, object cache, OPcache and page cache side by side, each with the figures it was judged on.","4":"The table overview: sizes, free space and collation differences, with the mixes that break joins marked as critical.","5":"Cleanup after a dry run: the rows were counted, nothing was changed, and only now does the button to delete for real appear."}},"plugin_section":[262246],"plugin_tags":[1328,153,7913,47179,247],"plugin_category":[54,59],"plugin_contributors":[260860,260859],"plugin_business_model":[],"class_list":["post-353329","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-autoload","plugin_tags-database","plugin_tags-object-cache","plugin_tags-opcache","plugin_tags-performance","plugin_category-security-and-spam-protection","plugin_category-utilities-and-tools","plugin_contributors-robbsie","plugin_contributors-turbopress","plugin_committers-robbsie"],"banners":{"banner":"https:\/\/ps.w.org\/turbopress-database-diagnostics\/assets\/banner-772x250.png?rev=3660666","banner_2x":"https:\/\/ps.w.org\/turbopress-database-diagnostics\/assets\/banner-1544x500.png?rev=3660666","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/turbopress-database-diagnostics\/assets\/icon-128x128.png?rev=3660666","icon_2x":"https:\/\/ps.w.org\/turbopress-database-diagnostics\/assets\/icon-256x256.png?rev=3660666","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/turbopress-database-diagnostics\/assets\/screenshot-1.png?rev=3660666","caption":"The diagnostics tab: the score, the plain sentences behind it, and every deduction listed with the finding that caused it."},{"src":"https:\/\/ps.w.org\/turbopress-database-diagnostics\/assets\/screenshot-2.png?rev=3660666","caption":"Autoloaded options attributed to the plugin that created them, with the unattributed remainder grouped by prefix."},{"src":"https:\/\/ps.w.org\/turbopress-database-diagnostics\/assets\/screenshot-3.png?rev=3660666","caption":"Autoload, object cache, OPcache and page cache side by side, each with the figures it was judged on."},{"src":"https:\/\/ps.w.org\/turbopress-database-diagnostics\/assets\/screenshot-4.png?rev=3660666","caption":"The table overview: sizes, free space and collation differences, with the mixes that break joins marked as critical."},{"src":"https:\/\/ps.w.org\/turbopress-database-diagnostics\/assets\/screenshot-5.png?rev=3660666","caption":"Cleanup after a dry run: the rows were counted, nothing was changed, and only now does the button to delete for real appear."}],"raw_content":"<!--section=description-->\n<p>Turbopress Database Diagnostics is a diagnostic tool, not a cleaner. It answers a question the usual optimisation plugins do not: <strong>why<\/strong> is this installation slow, and <strong>which plugin<\/strong> is causing it.<\/p>\n\n<p>Most sites do not need another delete button. They need to know that 600 KB of options are read into memory on every single request, and which plugin put them there.<\/p>\n\n<h4>Autoload with the plugin responsible<\/h4>\n\n<p>Every WordPress request reads all autoloaded options before a single line of the page is rendered. This plugin measures that payload exactly, lists the 25 largest entries, and attributes each one to the plugin that created it.<\/p>\n\n<p>Attribution works by matching option name prefixes against the plugins installed on the site. It matches strictly: a prefix only counts when the option name continues with a separator, so <code>acf_field_group<\/code> is attributed to Advanced Custom Fields while <code>acfxtra_setting<\/code> is not. Anything that cannot be attributed is reported as <strong>not attributed<\/strong> rather than assigned to the nearest plausible plugin. Guessing would be worse than saying nothing.<\/p>\n\n<p>The unattributed remainder is grouped by its shared prefix, so instead of one anonymous lump you see, for example, that six options starting with <code>ionos<\/code> account for 186 KB. Grouping is not attribution and is labelled as such, but it turns a dead end into something you can search for.<\/p>\n\n<p>Options whose plugin is no longer installed are reported as their own category. So are theme modifications of themes that have been deleted. These are the leftovers no uninstall routine removed.<\/p>\n\n<h4>Object cache, OPcache and page cache in one picture<\/h4>\n\n<ul>\n<li>Detects whether a persistent object cache is active and which backend serves it: Redis, Valkey, Memcached or APCu. Where none is active, the report states what is actually known: that the PHP extension is loaded means the client side is ready, not that a cache server exists. On shared hosting the extension is usually compiled in for every account while the server runs per account, or not at all, and the plugin does not pretend to know which.<\/li>\n<li>Reads Redis and Valkey statistics through the connection the drop-in already holds. The plugin never opens its own connection and never asks for host, port or credentials. Reported are hit rate, memory use, fragmentation ratio, evicted keys and the <code>maxmemory-policy<\/code>.<\/li>\n<li>Reads the origin of the <code>object-cache.php<\/code> and <code>advanced-cache.php<\/code> drop-ins from their file header.<\/li>\n<li>Warns when two plugins are doing the same caching job. A page cache beside an object cache is the normal arrangement and is not reported as a conflict.<\/li>\n<li>Reports OPcache memory, utilisation, hit rate and wasted memory, and tells apart the states that look identical from the outside: not installed, switched off, running but with <code>opcache_get_status<\/code> in <code>disable_functions<\/code>, running but with <code>opcache.restrict_api<\/code> locking this path out, and measured from the command line where OPcache is off anyway. Only the first two are faults of the site; the rest are hosting arrangements and are left out of the score rather than counted against you. Where the counters are unreadable the plugin still asks <code>opcache_is_script_cached<\/code> whether a WordPress core file is in the cache, so it can say whether OPcache is actually working instead of guessing from a configuration flag.<\/li>\n<li>Identifies a page cache from the response headers of a loopback request to your own home URL, and tells a cache that answered from one that was merely present and did not serve. When a cache did answer, a second request with a cache busting parameter measures how long the same page takes when no cache can answer it. That turns \"your site would be slow without its page cache\" from an assertion into a number. Both requests can be switched off in the settings.<\/li>\n<\/ul>\n\n<h4>In the Site Health screen<\/h4>\n\n<p>Three findings are also placed in Tools \u2192 Site Health, where people already look: the autoload payload, what removed plugins left behind, and orphaned metadata. Only those three, and only because WordPress does not check them itself; its own object cache and cron tests are not repeated. Site Health never triggers a scan, it reads the last one.<\/p>\n\n<h4>What changed since last time<\/h4>\n\n<p>Each measurement is recorded, thirty of them, in an option that is not autoloaded. The report then says what moved: \"+180 KB since the measurement three days ago\". That answers the question a single snapshot cannot, which is <em>since when<\/em>, and knowing what you installed that week usually names the cause.<\/p>\n\n<p>It also checks whether the options table has the index on the autoload column that WordPress 6.6 introduced. An installation that grew out of an older version sometimes lacks it, and without it the first query of every request scans the whole table.<\/p>\n\n<h4>The verdict<\/h4>\n\n<p>From these measurements the plugin names the one factor that costs the most time before the first byte, in plain language and with the numbers it is based on.<\/p>\n\n<p>It also states the interaction administrators most often get wrong: a persistent object cache removes the database query for your options, but not the payload. The options still travel to PHP and still sit there as an array for the whole request, cache or no cache.<\/p>\n\n<p>The plugin measures that cost on your server rather than asserting it. Decoding is not where it sits: WordPress keeps the raw strings in that array and turns a single option back into a structure only when something reads it, so most of a large payload is never decoded at all. What every request pays is the array itself, and it costs more than the bytes suggest, because PHP adds a fixed amount per string and per entry. Measured on two installations it came to 1.09 and 1.60 times the size on disk, the higher figure on the site built from many small options. That is the number that matters on a host with a tight memory limit.<\/p>\n\n<h4>Scheduled events<\/h4>\n\n<p>WordPress has no scheduler of its own; it keeps the list of due work in a single autoloaded option and looks at it when someone visits. The plugin reads that list and reports three things that go wrong with it: an event scheduled hundreds of times over because a plugin rescheduled without unscheduling first, events overdue by days because nothing is triggering cron at all, and events belonging to plugins that are long gone. Every hook is attributed to its plugin the same way options are.<\/p>\n\n<h4>Database bloat<\/h4>\n\n<p>Orphaned post, term, comment and user meta, post revisions, expired transients, auto-drafts and trashed posts. A table overview from <code>INFORMATION_SCHEMA<\/code> with size, engine, row count, collation and free space. Tables whose prefix belongs to a plugin that is not installed.<\/p>\n\n<p>Free space is reported per engine rather than as one number, because <code>DATA_FREE<\/code> does not mean the same thing everywhere. In MyISAM it is waste that <code>OPTIMIZE TABLE<\/code> returns to the file system. In InnoDB it is space the engine reuses for new rows, so it is reported separately and never called reclaimable. And with <code>innodb_file_per_table<\/code> switched off it describes the shared tablespace, so the same figure appears on every table; there the plugin leaves it out and says why, rather than adding one number up thirty times.<\/p>\n\n<p>Collations are compared against the WordPress tables, not against the majority: on a site with many plugin tables the plugins outnumber core, and a plain majority would report WordPress itself as the anomaly. Tables still on the three byte <code>utf8<\/code> or <code>utf8mb3<\/code> are called out separately, because those cannot store emoji and make joins against <code>utf8mb4<\/code> tables fail outright.<\/p>\n\n<p>On large tables the exact count is attempted under a deadline enforced by the database server. Only when that deadline passes does the plugin fall back to a bounded sample, and the result then says so. Because orphans are created by events and therefore sit in contiguous blocks rather than spread evenly, a sample can be genuinely inconclusive; in that case the plugin reports a confirmed lower bound and states that the total could not be determined, instead of printing a number that looks measured.<\/p>\n\n<p>WooCommerce data is treated with care. Orders, their metadata and active sessions are never counted as orphaned, trashed orders are never offered for deletion, and while WooCommerce keeps its orders in its own tables (HPOS), post meta is reported but not offered for cleanup at all: whether a row still belongs to an order cannot be answered reliably then, and that is not a basis for an irreversible delete.<\/p>\n\n<h4>Cleanup<\/h4>\n\n<p>Cleanup exists, but it is a side function, not the selling point. Every category runs on its own, never all at once. Dry run is the default: you see how many rows are affected and confirm before anything is deleted. Work is batched over the REST API with a progress display. There is no cron job and no automatic cleanup.<\/p>\n\n<h4>On the command line<\/h4>\n\n<p>Everything the screen does is available through WP-CLI, because the scanners\nwere written to know nothing about the admin screen.<\/p>\n\n<pre><code>wp turbopress-diagnostics scan                    # score and the figures behind it\nwp turbopress-diagnostics scan --refresh          # measure again first\nwp turbopress-diagnostics report &gt; report.json    # the full document\nwp turbopress-diagnostics categories              # what can be cleaned, and how much\nwp turbopress-diagnostics cleanup orphan_postmeta            # simulate\nwp turbopress-diagnostics cleanup orphan_postmeta --execute  # delete, asks first\n<\/code><\/pre>\n\n<p>That turns a report across many installations into a shell loop, which is the\ndifference between a tool for one site and a tool for a hosting account.<\/p>\n\n<h4>What this plugin does not do<\/h4>\n\n<ul>\n<li>No upsell, no pro version, no locked features. What you install is the complete plugin.<\/li>\n<li>No advertising and no external links in the interface.<\/li>\n<li>No telemetry, no tracking, no phoning home.<\/li>\n<li>No external HTTP requests, with one exception: the optional loopback requests to your own home URL that detect a page cache and measure the uncached response time. They can be switched off in the settings.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/turbopress-database-diagnostics\/<\/code> or install it through Plugins \u2192 Add New.<\/li>\n<li>Activate it.<\/li>\n<li>Open Tools \u2192 Database Diagnostics.<\/li>\n<\/ol>\n\n<p>Scans never run during regular page loads. A result is kept for 12 hours and refreshed only when you press the rescan button.<\/p>\n\n<p>Version 1.0 reports on a single site. On a multisite network, activate it per site; network activation is refused with an explanation rather than producing numbers that look network wide but are not.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20it%20safe%20to%20run%20this%20on%20a%20production%20site%3F\"><h3>Is it safe to run this on a production site?<\/h3><\/dt>\n<dd><p>Reading is safe. The scan runs two queries against the options table and a handful of aggregate queries against <code>INFORMATION_SCHEMA<\/code>, all of them bounded. Nothing runs during normal page loads.<\/p>\n\n<p>Cleanup deletes rows, and deleting rows is never risk free. Every operation shows you the affected row count first and requires confirmation. Make a backup before you delete anything.<\/p><\/dd>\n<dt id=\"why%20does%20it%20say%20%22not%20attributed%22%20instead%20of%20naming%20a%20plugin%3F\"><h3>Why does it say \"not attributed\" instead of naming a plugin?<\/h3><\/dt>\n<dd><p>Because it does not know. Option names carry no author. Attribution is derived from prefixes, and when a prefix matches nothing on the installation, the honest answer is that the origin is unknown. A guess would send you looking in the wrong place.<\/p><\/dd>\n<dt id=\"a%20plugin%20of%20mine%20is%20not%20recognised.%20can%20i%20register%20its%20prefix%3F\"><h3>A plugin of mine is not recognised. Can I register its prefix?<\/h3><\/dt>\n<dd><p>Yes. The prefix table is filterable:<\/p>\n\n<pre><code>add_filter(\n    'turbopress_diagnostics_plugin_prefixes',\n    function ( $prefixes, $plugins, $themes ) {\n        $prefixes['acme'] = array(\n            'type'  =&gt; 'plugin',          \/\/ plugin, mu_plugin, theme,\n                                          \/\/ removed_plugin, removed_theme\n            'id'    =&gt; 'acme-widgets',    \/\/ directory slug\n            'label' =&gt; 'Acme Widgets',    \/\/ name shown in the report\n        );\n\n        return $prefixes;\n    },\n    10,\n    3\n);\n<\/code><\/pre>\n\n<p>The array is keyed by prefix without a trailing separator. <code>$plugins<\/code> contains the installed plugins and must-use plugins keyed by slug, <code>$themes<\/code> the installed themes keyed by stylesheet, so you can decide whether to register anything at all. Entries that do not follow this shape are discarded, because a malformed entry would produce a wrong statement about who is responsible for a payload.<\/p>\n\n<p>If you are a plugin author whose options are showing up as unattributed on other people's sites, adding this filter to your own plugin fixes it for every user at once.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20from%20wp-cli%3F\"><h3>Can I use this from WP-CLI?<\/h3><\/dt>\n<dd><p>Yes, and that is the point of it for anyone looking after more than one site. <code>wp turbopress-diagnostics scan<\/code> prints the score and the figures behind it, <code>wp turbopress-diagnostics report<\/code> the full JSON document, <code>wp turbopress-diagnostics categories<\/code> what can be cleaned up, and <code>wp turbopress-diagnostics cleanup &lt;category&gt;<\/code> runs one category. Cleanup simulates unless you add <code>--execute<\/code>, and asks for confirmation unless you add <code>--yes<\/code>.<\/p>\n\n<pre><code>wp help turbopress-diagnostics lists every subcommand and option. The commands are also shown on the plugin screen, under the settings.\n<\/code><\/pre><\/dd>\n<dt id=\"which%20other%20filters%20does%20the%20plugin%20provide%3F\"><h3>Which other filters does the plugin provide?<\/h3><\/dt>\n<dd><p>turbopress_diagnostics_loopback_sslverify decides whether the loopback request verifies the TLS certificate. Return false on a staging environment behind a self signed certificate, where the check would fail for a reason unrelated to caching.<\/p>\n\n<pre><code>turbopress_diagnostics_table_prefixes registers table name prefixes so leftover tables of a plugin that is gone are named rather than ignored, in the same way as the option prefixes above.\n\nturbopress_diagnostics_count_time_budget sets how many seconds an exact orphan count may take on a large table before it falls back to a sample. The default is 5. The deadline is enforced by the database server, so an overrunning query is stopped rather than left to consume the PHP execution time. Raise it to trade a slower scan for an exact number.\n<\/code><\/pre><\/dd>\n<dt id=\"the%20plugin%20cannot%20read%20my%20opcache%20statistics.%20is%20something%20broken%3F\"><h3>The plugin cannot read my OPcache statistics. Is something broken?<\/h3><\/dt>\n<dd><p>Probably not. Managed hosting commonly puts <code>opcache_get_status<\/code> into <code>disable_functions<\/code>, or restricts it with <code>opcache.restrict_api<\/code>. OPcache keeps working; only the counters are unreadable. The plugin tells that apart from a genuinely disabled OPcache, leaves it out of the score instead of counting it against your site, and still reports the configuration through <code>opcache_get_configuration<\/code>, which usually survives. It also asks whether a WordPress core file is currently in the cache, which answers whether OPcache is doing its job even when the numbers are hidden.<\/p><\/dd>\n<dt id=\"does%20the%20loopback%20request%20send%20data%20anywhere%3F\"><h3>Does the loopback request send data anywhere?<\/h3><\/dt>\n<dd><p>No. It is a single GET request to your own home URL, made by your own server, to look at the response headers. Nothing is sent to any third party. You can switch it off in the settings, in which case page cache detection is skipped.<\/p><\/dd>\n<dt id=\"why%20does%20it%20need%20redis%20credentials%3F\"><h3>Why does it need Redis credentials?<\/h3><\/dt>\n<dd><p>It does not. Redis and Valkey statistics are read through the connection the object cache drop-in has already established. If the drop-in does not expose its client, the plugin reports that no statistics are available rather than trying to connect on its own.<\/p><\/dd>\n<dt id=\"can%20i%20export%20the%20result%3F\"><h3>Can I export the result?<\/h3><\/dt>\n<dd><p>Yes, as JSON. This is meant for support tickets: it contains the measurements and option names, no option values.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>The description of how autoloaded options behave in memory was wrong. WordPress keeps the raw strings in the alloptions array and decodes a single option only when something reads it, without storing the result, so decoding is paid per read and most of a large payload is never decoded at all. What every request pays is the array of raw values. The figures for decoding time and decoded size are still reported, now as what they are: an upper bound, not a resident cost.<\/li>\n<li>The claim that a persistent object cache leaves the decoded options in memory is replaced by the measured one: the cache removes the database query, the payload still travels to PHP and still sits there for the whole request.<\/li>\n<li>The WP-CLI metric <code>autoload_memory<\/code> is now called <code>autoload_decoded<\/code>, because that is what it measures.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Table and column names now go through the <code>%i<\/code> placeholder of <code>$wpdb-&gt;prepare()<\/code> instead of being quoted by hand and interpolated into the query. This raises the requirement to WordPress 6.2, which is where <code>%i<\/code> arrived.<\/li>\n<li>The admin script handle, the JavaScript object it receives and the CSS classes carry the plugin prefix instead of the short <code>tpdiag<\/code>.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Renamed to Turbopress Database Diagnostics. The rename covers the text domain, the menu, the REST namespace, the WP-CLI command (now <code>wp turbopress-diagnostics<\/code>) and the four public filters, which are now <code>turbopress_diagnostics_*<\/code>.<\/li>\n<li>The compiled German catalogue is no longer bundled; translations come from translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>New: transient rows that a persistent object cache has made unreachable are reported and can be removed. While a drop-in is in charge, WordPress keeps every transient in the cache and never looks at the option table, so rows that are in it anyway are leftovers from before the cache was switched on, and the transient API can no longer remove them.<\/li>\n<li>New: orphaned timeout rows under <code>update_core<\/code>, <code>update_plugins<\/code> or <code>update_themes<\/code> are marked separately, because WordPress skips the expiry lookup for those three names and so never clears them by reading them.<\/li>\n<li>Fixed: two statements about what WordPress can clean up itself were wrong. A timeout row without a value is removed by reading the same transient again after it has expired, and the reason the delete function leaves it behind is the return value of the delete it attempts first, not a read.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Shows why WordPress loads slowly: autoload size with the plugin responsible, database bloat, and the state of object cache and OPcache.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/353329","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=353329"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/robbsie"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=353329"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=353329"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=353329"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=353329"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=353329"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=353329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}