What it does
SEO Health scores a site; SEO management lets you change it from the same tab. It is available on Studio and above (the Agency trial includes it) and needs WPClientHub One 2.0 or newer on the site. The SEO tab gains four sections next to Health:
- Pages — every published page, post and custom post type with its title and meta description as the page actually gets them, length meters, noindex/nofollow, canonical and social-sharing fields. Edit one page inline, change many at once, or let Draft with AI write a title and description from the page’s own text (one AI credit; never saved by itself).
- Redirects & 404s — 301/302/307/308/410 redirects with hit counts, CSV import and export, and the site’s 404 log with a one-click redirect for every missing address.
- Sitemap & robots — who provides the XML sitemap and what is in it, a robots.txt editor that refuses to block the whole site by accident, the 404-log switch, and the list of pages hidden from search.
- Schema — basic JSON-LD structured data (the website, the organization or local business behind it, Article and breadcrumbs), printed only where nothing else prints one.
Every page edit keeps the values it replaced, so it can be undone. Nothing is auto-generated or auto-saved: what you see in the editor is exactly what the page gets once you press Save to site.
One source of truth: next to Yoast, Rank Math, AIOSEO and SEOPress
Most client sites already run an SEO plugin, and its fields are where the site’s titles live. WPClientHub never adds a second set. When Yoast SEO, Rank Math, All in One SEO or SEOPress is active, a page’s fields are read from and written into that plugin’s own storage — its editor in wp-admin shows the new values, its templates and output stay in charge, and its sitemap and schema keep working. The WPClientHub One plugin prints nothing of its own on such a site, so a tag is never printed twice.
Only on a site with none of them does the WPClientHub One plugin keep the fields itself (in its own post meta) and print the tags: the title, the meta description, robots through WordPress’s own robots tag, the canonical link through WordPress’s own canonical filter, and Open Graph and Twitter cards (Jetpack’s Open Graph tags are switched off so nothing is doubled).
The exact storage each plugin uses, checked against the plugin’s current source on wordpress.org (Yoast SEO 28.6, Rank Math 1.0.280, All in One SEO 5.0.2, SEOPress 10.3):
| Plugin | Where a page’s fields live | Not stored per page |
|---|---|---|
| Yoast SEO | Post meta _yoast_wpseo_title, _yoast_wpseo_metadesc, _yoast_wpseo_canonical, _yoast_wpseo_meta-robots-noindex (1 = noindex, 2 = index, 0 = the post type’s default), _yoast_wpseo_meta-robots-nofollow, _yoast_wpseo_opengraph-title, …-description, …-image and …-image-id. Yoast rebuilds its indexable for the page right after a write. | Twitter card type (site-wide in Yoast) |
| Rank Math | Post meta rank_math_title, rank_math_description, rank_math_canonical_url, rank_math_robots (a list: index/noindex, nofollow), rank_math_facebook_title, …_description, …_image and …_image_id, rank_math_twitter_card_type. | — |
| All in One SEO | A row per post in the aioseo_posts table (title, description, canonical_url, robots_default/noindex/nofollow, og_title, og_description, og_image_type + og_image_custom_url, twitter_card), written through AIOSEO’s own model so its mirrors (_aioseo_title, _aioseo_description…) stay in step. | — |
| SEOPress | Post meta _seopress_titles_title, _seopress_titles_desc, _seopress_robots_canonical, _seopress_robots_index and _seopress_robots_follow (“yes” = noindex / nofollow), _seopress_social_fb_title, …_desc, …_img (+ its attachment id and size). | Twitter card size (site-wide in SEOPress) |
| None of them | The WPClientHub One plugin’s own post meta (_wpch_seo_title, _wpch_seo_description, _wpch_seo_canonical, _wpch_seo_noindex, _wpch_seo_nofollow, _wpch_seo_og_*, _wpch_seo_twitter_card), and the plugin prints the tags. | — |
With The SEO Framework, Slim SEO, SmartCrawl or Squirrly SEO active, page fields are shown read-only and not edited — their storage is not something we write to. Redirects, the 404 log, robots.txt and the sitemap view still work. When two of the four editable plugins are active at once (it happens), the first of Yoast → Rank Math → AIOSEO → SEOPress wins and the tab says so.
Pages
The Pages section reads every published page from the site (200 at a time, in the background) and keeps the list; Read pages again refreshes it. For each page you see the title and description as the page gets them — with the plugin’s template applied, so a page without a title of its own shows what the template produces — plus a length meter under each: green inside the range search results show in full (30–60 characters for a title, 70–155 for a description), amber when short or long, red when it will be cut off. Key pages (the home page, the blog page, the shop page and every page in an assigned menu) are marked and listed first.
Filters: Key pages, No own title, No own description, noindex, a search box and a post-type picker.
Edit opens the page’s fields: title, meta description, hide from search (noindex), don’t follow links (nofollow), canonical URL, and the social-sharing fields (Open Graph title, description and image, and the Twitter card type where the plugin stores it per page). A key page set to noindex gets a warning. Save to site writes the changed fields at once; the site answers with the values it now holds, and the list updates.
Changed in WordPress since you opened it? Every save carries the values the editor saw. If someone changed the page in wp-admin in between, the save is refused as a conflict, the current values are shown, and you decide — save again, or keep theirs. Nothing is overwritten blindly.
Edit N selected applies the same change to many pages: the noindex and nofollow switches, the Twitter card type, or clearing the canonical. Text fields are per page on purpose.
Draft with AI
In the editor, Draft with AI reads the page’s own text from the site (its title, the first part of its content, the site name and tagline, and the focus keyword if the SEO plugin has one) and writes a title of at most 60 characters and a description of at most 155 — from that text and nothing else, in the page’s language. It costs one AI credit, the same credit every model-backed action uses; the balance is shown next to the button and the credit is refunded if the site or the model fails to answer.
The draft only fills the two inputs. Read it, change what you like, and press Save — or Cancel, and nothing happened. A draft is never written to the site on its own.
Redirects
Add a redirect from a path on the site (/old-page; a trailing slash and letter case don’t matter, and a query string in the source matches only that query) to a path or a full URL, as 301 permanent, 302 or 307 temporary, 308 permanent keeping the method, or 410 gone (no target: the page is gone for good). Regular-expression sources (^/blog/(\d+)/(.*)$ → /news/$2) are opt-in per redirect and capped at 200 per site; plain redirects at 10,000.
The whole set is sent to the site as one signed instruction every time it changes — the Redirects card says Applied once the site confirms — and the site looks requests up with one indexed query (and none at all while a site has no redirects). It counts how often each redirect is followed and reports the counts back on every sync.
Loops are refused before anything is sent: a redirect to itself, a source that already has a redirect (the same address once normalised), and chains that come back to where they started (A → B → A, in any order). Changing a redirect into a loop is refused the same way.
Import CSV takes one redirect a line — source,target,code,match, code 301 unless given, match regex for a pattern, a header row allowed — adds the good rows in one go and lists the skipped ones by line with the reason. Export writes the same format.
404 log
With SEO management on and the 404 log switched on (it is by default), the site keeps its 500 most recent missing addresses, grouped by path with a hit count, when each was first and last seen, and the last referring page. No IP addresses or browser details are stored. Fetch log reads it into the hub; Redirect on a row opens the redirect form with the path filled in and removes the entry once the redirect is saved; Forget drops a row; Clear log empties it on the site.
Sitemap
The Sitemap card says who provides the site’s XML sitemap. When Yoast SEO, Rank Math, All in One SEO or SEOPress has its sitemap switched on, that sitemap is linked and left alone — its settings live in the plugin. Otherwise WordPress’s own sitemap (/wp-sitemap.xml) is used and tuned rather than replaced: pick which post types and taxonomies are in it, whether author archives are, and the plugin leaves out pages set to noindex and adds last-modified dates. A site set to discourage search engines (Settings → Reading) has no sitemap and every page carries noindex until that box is unticked; the tab says so in red.
robots.txt
The card shows what the site serves today — WordPress’s own virtual robots.txt, or the custom text once the editor is on. A real robots.txt file on the server always wins, so the editor is off while one exists. As you type, the text is read the way a crawler reads it: unreadable lines, unknown directives, rules before any User-agent, a missing Sitemap: line and a Disallow: /wp-content/ (which stops Google rendering pages) are pointed out.
The never-block-the-site safety. A text that tells every search engine (or Googlebot or Bingbot) not to crawl any page — Disallow: / without an Allow: / undoing it — is flagged in red, and Review and apply shows a line-by-line diff of today’s file against the new one, asks once, and then asks a second time, explicitly, before applying it. The site itself refuses such a text unless that confirmation came with it. Switching the editor off puts WordPress’s own robots.txt back.
Schema
When no SEO plugin or structured-data plugin prints schema on the site, the WPClientHub One plugin can print one JSON-LD graph on every page: the WebSite, the entity behind it (an Organization, a LocalBusiness subtype — plumber, dentist, restaurant and forty others — with its address, telephone and price range, or a Person) with the social profiles from the site-wide defaults as sameAs, and on posts and pages the WebPage, an Article (headline, dates, author, featured image) and BreadcrumbList from the page tree and categories. When Yoast SEO, Rank Math, All in One SEO, SEOPress or a dedicated schema plugin (Schema & Structured Data for WP, Schema Pro and others) already prints one, the card says who does and WPClientHub prints none — two graphs confuse Google. The values are kept for when that changes.
Site-wide defaults
Above the Pages table: the title template and separator every page uses unless it has a title of its own (%title% %sep% %sitename% by default; %tagline%, %page%, %term% and %year% are the other variables), the home page’s title and description, whether Open Graph tags are printed, the default social image, the Twitter handle and the social profiles. On a site run by one of the four SEO plugins the titles and tags are that plugin’s — the defaults then feed the schema and the profiles only, and the card says so.
Undo
Every applied page change is kept as a revision — which fields, the values they replaced, the values written, who, when — on the hub and on the site (the last ten per page). The editor lists them with Undo, which sends the previous values back. An undo is refused when the page changed again since, exactly like a save would be.
Activity Log, reports and the API
- Activity Log (category Content):
seo.page_updatedandseo.page_undonename the page and the fields that changed, never the values;seo.settings_changednames the sections;seo.robots_changed;seo.redirect_added,seo.redirect_changed,seo.redirect_removed,seo.redirects_imported;seo.404s_cleared. - Client reports add one line to the SEO section when something was changed in the period: “SEO changes this period: 4 pages had their titles or descriptions updated and 2 redirects were added.” — next to the SEO Health score the report already shows.
- Public API (Scale, see Public API & webhooks):
GET /api/v1/sites/{site}/seo/pagesandGET …/seo/redirectsunder theseo:readscope;PATCH …/seo/pages/{post_id}andPOST …/seo/redirectsunderseo:write, with the same conflict, loop and duplicate rules as the app.
Plans, the plugin version and downgrades
Studio and above, the Agency trial included. On Free the SEO tab keeps SEO Health exactly as it was and shows what SEO management adds, with the Studio badge; every write is refused. Sites need WPClientHub One 2.0 or newer — an older site shows “Plugin update needed” with a link to the fleet update. Leaving Studio deletes nothing: the site keeps serving the titles, redirects, robots.txt and schema it has, the hub keeps your settings and redirects, and simply stops accepting changes until the plan comes back — then the settings and the redirect set are re-sent and confirmed on the next sync.
Limits and honest notes
- Pages are read from the site into the hub; the list is as fresh as the last read (shown under the heading). An edit always goes to the site live, carrying what you saw.
- Only published pages, posts and public custom post types are listed — drafts, attachments and archives are not. Term (category/tag) SEO fields are not edited.
- The effective title and description come from the plugin where it can tell us (Yoast, All in One SEO, Rank Math’s variables, our own renderer); for SEOPress the stored text is shown with its variables replaced as far as we can.
- Redirects run inside WordPress (at
template_redirect), so a request a cache or the web server answers before WordPress never reaches them — purge the page cache after adding one for a cached address. - The 404 log holds the newest 500 paths; the Twitter card type is site-wide in Yoast SEO and SEOPress; AI drafts need credits (20 a month on Free, more on paid plans, top-ups any time).