The best WordPress SEO plugin for developers: hooks, APIs and footprint
For developers, Hydrogen SEO (ours) is our pick, as a judgment: it documents 50 filters and 24 actions with signatures checked against the source, backs every admin screen with a REST API, has WP-CLI commands for imports, turns off all front-end output for headless sites with one filter, and stores everything in standard options and post meta with zero custom tables. The SEO Framework is second for the opposite reason: the smallest footprint in the field, with 8 hooks registered and 0 extra queries.
The measured numbers come from our seven-plugin benchmark. We build Hydrogen SEO, and it is Beta, so its routes may still change between releases.
How we ranked them
There is no single developer metric, so this is a judgment built on two kinds of evidence:
- The footprint you inherit (measured): custom tables, autoloaded options, queries per request, and what stays after deactivation. These decide how cleanly a plugin sits in a site you deploy, back up and migrate.
- The surface you can program against (documented): filters, actions, REST routes and CLI. Our sources fully document this only for Hydrogen SEO, so for the others we rely on what we measured and keep claims general.
One caution: hooks registered (Yoast 187, The SEO Framework 8) measures how much a plugin hooks into WordPress, not how many extension points it offers you. A small number there means a small blast radius.
Hydrogen SEO
+12.9 ms front-end, +1 queries, 0 custom tables, 10 JSON-LD types
Every screen is backed by
/wp-json/hydrogen-seo/v1/, so nothing in the UI is off-limits to scripts, and external calls authenticate with application passwords. The filters reference covers titles, schema, sitemaps, robots, llms.txt and analysis; the actions reference covers lifecycle, output and events such ashydrogen_seo_sitemap_cache_cleared.wp hydrogen-seo migrate run yoast --dry-runpreviews an import. Measured: 22 hooks, 1 query, 0 tables. Beta.The SEO Framework
+8 ms front-end, +0 queries, 0 custom tables, 9 JSON-LD types
The least code in your way: 8 hooks registered, 0 extra queries, 0 tables, and the only plugin that restored autoloaded options to the exact baseline on deactivation. That means few surprises in a profiler and a clean removal. The flip side is fewer built-in features, so you may write more yourself. See Hydrogen SEO vs The SEO Framework.
Yoast SEO
+39 ms front-end, +3 queries, 6 custom tables, 12 JSON-LD types
The largest ecosystem: more than a decade of integrations, extensions and documentation, and the most developers who already know it. Its indexables tables are a deliberate design that keeps it at +3 queries and exists for large sites. You inherit six custom tables that survive deactivation, 187 registered hooks and 13.6 KB of autoloaded options.
Slim SEO
+10 ms front-end, +2 queries, 0 custom tables, 10 JSON-LD types
No tables, a 1.4 MB package, autoloaded options below baseline and a clean deactivation, with 51 hooks registered. With so few settings, most customization happens in code; check its own documentation for the hooks it offers, which our sources do not cover.
SEOPress
+24.5 ms front-end, +1 queries, 1 custom tables, 0 JSON-LD types
1 query and a light editor, but one custom table, 114 hooks, and autoloaded options that did not shrink at all on deactivation. Its sitemap index at
/sitemaps.xmlis a small gotcha for scripts that assume the usual filename.Rank Math
+36.1 ms front-end, +16 queries, 6 custom tables, 6 JSON-LD types
Feature-dense and widely used, but it adds 16 queries, six tables (four from the Action Scheduler library) and leaves 11.0 KB autoloading after deactivation. For automated provisioning, note that it prints nothing until you register or set the two options its Skip button writes; we had to do exactly that to benchmark it.
All in One SEO
+53.5 ms front-end, +22 queries, 9 custom tables, 8 JSON-LD types
The heaviest footprint to inherit: nine custom tables, +22 queries, a 24.4 MB package and no reduction in autoloaded options on deactivation. For a site you hand to non-technical owners its guided interface may be worth that; for a site you maintain in code, it is the most to carry.
What to check before you commit
Three questions separate a plugin you can build on from one you work around, whichever you pick.
Can you turn off front-end output? On a headless site the theme never renders, so tags printed into wp_head are wasted or duplicated. In Hydrogen SEO it is one line, and sitemaps, analysis and REST keep working:
add_filter( 'hydrogen_seo_enable_frontend', '__return_false' );
Your frontend then reads the resolved fields from GET /wp-json/hydrogen-seo/v1/metabox/post/{id}.
- Can you change output in code? Excluding items from the sitemap, adding a post type to schema, or rewriting a title for one template should be a filter, not a fork. Extending Hydrogen SEO has recipes for each.
- What stays in the database? Diff
SHOW TABLESand the autoloaded total before install and after deactivation, as in our benchmark method. Tables and leftover options follow you into every backup, staging copy and migration.
All seven, measured
| Measured | Hydrogen SEO 0.0.18 | The SEO Framework 5.1.4 | Yoast SEO 28.4 | Slim SEO 4.10.1 | SEOPress 10.2 | Rank Math 1.0.278 | All in One SEO 5.0.1.1 |
|---|---|---|---|---|---|---|---|
| Front-end PHP time added | +12.9 ms | +8 ms | +39 ms | +10 ms | +24.5 ms | +36.1 ms | +53.5 ms |
| Peak memory added | +4.5 MB | +2 MB | +10.5 MB | +2 MB | +6.5 MB | +8.5 MB | +14.5 MB |
| Database queries added | +1 | +0 | +3 | +2 | +1 | +16 | +22 |
| Hooks registered | +22 | +8 | +187 | +51 | +114 | +155 | +100 |
<head> bytes added | +4,259 | +3,821 | +5,656 | +1,649 | +2,380 | +4,965 | +6,668 |
| Meta description by default | Yes | Yes | No | Yes | Yes | Yes | Yes |
| JSON-LD types printed | 10 | 9 | 12 | 10 | 0 | 6 | 8 |
| Open Graph / X tags | 10 / 5 | 10 / 5 | 10 / 5 | 11 / 2 | 10 / 6 | 11 / 8 | 6 / 3 |
| Sitemap URLs listed | 72 | 51 | 75 | 73 | 58 | 59 | 73 |
| Sitemap image entries | 40 | 0 | 40 | 40 | 40 | 0 | 0 |
lastmod coverage | 72 / 72 | 51 / 51 | 74 / 75 | 50 / 73 | 50 / 58 | 59 / 59 | 73 / 73 |
| Custom database tables | 0 | 0 | 6 | 0 | 1 | 6 | 9 |
| Autoloaded options added | +0.4 KB | +4.2 KB | +13.6 KB | -0.2 KB | +3.6 KB | +11.6 KB | +14.6 KB |
| Plugin package size | 4.6 MB | 2.9 MB | 21 MB | 1.4 MB | 11.7 MB | 15.1 MB | 24.4 MB |
| Block editor assets | 2 files, 700.4 KB | 25 files, 77.6 KB | 48 files, 4,160 KB | 14 files, 187.7 KB | 17 files, 217 KB | 24 files, 1,792 KB | 130 files, 3,543 KB |
| After deactivation | +0.2 KB left autoloading | Releases everything (exact baseline) | +2.6 KB left autoloading, 6 tables remain | Releases everything | No reduction at all | +11.0 KB still autoloading | No reduction: 14.5 KB still autoloading |
Measured on one WordPress 7.1 install (PHP 8.2, MySQL 8.0, Twenty Twenty-Five, 40 posts), each plugin alone with default settings, against a no-plugin baseline. Bold marks the better number in each row. Full method: how we tested.
Common questions
Which WordPress SEO plugin is best for developers?
In our judgment, Hydrogen SEO for its documented filters, actions, REST API and zero custom tables, and The SEO Framework for the smallest footprint: 8 hooks and zero extra queries. Hydrogen SEO is Beta.
Does Hydrogen SEO work with headless WordPress?
Yes. The hydrogen_seo_enable_frontend filter turns off front-end output while sitemaps, analysis and the REST API keep working, and your frontend reads SEO fields over REST.
Which SEO plugins create custom database tables?
In our benchmark, All in One SEO created nine, Yoast and Rank Math six each, and SEOPress one. The SEO Framework, Slim SEO and Hydrogen SEO created none.
Can I import SEO data from the command line?
In Hydrogen SEO, yes: wp hydrogen-seo migrate run with a source such as yoast or rank-math, and --dry-run to preview first. Past runs are listed in history and can be rolled back.