A practical Yoast and Rank Math workflow: audit first, write from the page, check what the site actually serves, and keep a way back.
Many WordPress sites share the same quiet SEO gap. The homepage and the handful of pages someone cared about at launch have hand-written meta descriptions. Most posts published after that have an empty description field, so the SEO plugin falls back to a template and Google picks its own snippet.
People ask about this all the time. A recent r/Wordpress thread asked how to bulk edit Yoast meta descriptions for post categories, because Yoast's bulk editor didn't show them. Whole plugins exist just to find posts with no description and fill them. Meow Apps even lists it as a typical weekly request to an AI agent: "List every post without a meta description, write one for each in my tone, and show me before saving."
The writing part is easy now. Claude or ChatGPT can write a decent 150 character summary in seconds. The hard parts are the boring ones:
- Knowing which posts are actually missing a description.
- Making sure the AI writes from what the page says, not from a keyword and its imagination.
- Saving into the right field of the SEO plugin you run, and nothing else.
- Being able to undo it when a description turns out wrong.
This tutorial walks through that loop with an AI client connected to WordPress over MCP through WPPilot. I'll be clear about what the free plugin does, where Pro starts, and where you still need a human.
A reality check on meta descriptions
Google's documentation says snippets are "primarily created from the page content itself", and that Google "sometimes uses the meta description HTML element if it might give users a more accurate description of the page than content taken directly from the page." So a description is a strong suggestion, not a guarantee.
The same page gives three rules that matter once AI writes the copy:
- Unique per page. "Identical or similar descriptions on every page of a site aren't helpful."
- Prioritise. If you can't do every page, "at the very least, create a description for the critical URLs like your home page and popular pages."
- Generated is fine if it's good. Programmatic descriptions "can be appropriate and are encouraged. Good descriptions are human-readable and diverse." Strings of keywords "are less likely to be displayed as a snippet."
That's the green light for AI, if every description is readable, specific and different.
And a saved description is not a ranking result. WPPilot's SEO page says a successful write "proves the operation returned successfully". Measure clicks in Search Console a few weeks later.
What you need
- WordPress 6.9 or newer and PHP 8.0+.
- One supported SEO plugin active. WPPilot Free reads and sets one post's SEO title, meta description and robots in seven: Yoast SEO, Rank Math, AIOSEO, SEOPress, The SEO Framework, Slim SEO and SmartCrawl. The reference pages list minimum versions, for example Yoast SEO 21.0+ and Rank Math 1.0.200+.
- An MCP client. I'll use Claude and ChatGPT as examples.
- WPPilot Free. Pro is optional; I'll point out exactly where it helps.
If you have two SEO plugins active (common mid-migration), the plugin-neutral SEO calls refuse to guess. They return wppilot_seo_provider_ambiguous and ask you to name the one the front end actually uses. Decide which plugin is live before writing anything.
Step 1: Connect with a dedicated user, in Read Only
Create a separate WordPress user for the AI. WPPilot's SEO use case recommends this "so the ledger names it rather than your administrator account." Free's per-post SEO calls check edit_posts plus the right to edit that post, according to the Yoast and Rank Math references. Pro's full modules check manage_options, so Pro work needs an administrator-level user.
Then set the WPPilot safety profile to Read Only for the first session. The docs call Read Only "the correct starting point for audits, discovery, reporting, and connection tests," and it hides writes rather than just refusing them: "An ability the active profile does not allow is withheld from discovery." During the audit, the write tools simply aren't there.
Connecting:
- Claude (web): Customize, then Connectors, then Add custom connector. Paste the MCP URL from WPPilot's Connect screen and approve through OAuth as the dedicated user. claude.ai connects from Anthropic's side, so the site needs public HTTPS. For a local or staging site, Claude Desktop can reach it instead.
- ChatGPT: on ChatGPT web, open Settings, then Security and login, and turn on Developer mode (WPPilot's guide notes OpenAI documents it for Plus, Pro, Business, Enterprise and Education accounts). Create the app from ChatGPT Plugins with the OAuth URL your Connect screen generates. Apps are enabled per conversation from the plus menu, which explains most "it's connected but ChatGPT ignores it" reports.
Test with a harmless question: which SEO plugin is active?
Step 2: Find the posts that are actually missing descriptions
You need the list first.
WPPilot Free includes audit-content, a content audit that changes nothing. Its seo_meta check reports a missing meta description or SEO title, read through the active SEO plugin, and "the source used is reported." By default it runs as a background job over published posts and pages and returns a job_id; audit-content-status pages through the findings worst first. Findings are kept for seven days after the job ends.
Run a content audit with only the seo_meta check, as a background job.
When it finishes, give me a table: post ID, title, URL, post type, and
whether the title, the description, or both are missing. Tell me which
SEO plugin the audit read from. Change nothing.
"Missing" means no override was set. The Free Yoast reference says an empty description "means Yoast uses the post type template," and Rank Math works the same way. A post on the list may still output a template-built description. That's usually what you want to replace, but the page isn't blank in search.
The audit sees stored content. The platform reference warns that stored-content audits "can omit runtime templates, dynamic output and external content." If your theme prints its own meta tags, the audit won't see them. Step 5 covers that.
On Pro, seo-bulk-get-meta reads SEO title, description, canonical, robots and Open Graph fields for many posts in one shape across all supported plugins, with filters for missing_description, missing_title and duplicate_titles. A filtered read inspects at most 1,000 posts and reports truncated=true when there were more, so page by post type on big sites. Use the duplicate filter too; WPPilot's own rules say "fix duplicates before rewriting unique ones."
Step 3: Pick the order, don't do everything
WPPilot's SEO page is blunt: "Bulk-rewriting every title on a site is the least useful thing WordPress AI SEO automation can do." Google says to prioritise critical and popular URLs. A sensible order:
- Pages that make money: services, key category pages, booking or contact.
- Posts that already get impressions in Search Console.
- Evergreen guides you still link to.
- Everything else, later, in batches. Some old posts need a merge or a noindex more than a description, and that's a separate decision.
Give the AI your Search Console data instead of letting it guess. On Pro with Site Kit by Google connected, site-kit-search-pages lists pages with many impressions but a click-through rate under half the site average. Every Site Kit ability only reads.
Step 4: Write from the page, one post at a time (Free)
Switch the profile from Read Only to Production Safe for writing, then start a fresh client session so the AI picks up the new tool list.
On Free the loop is one post at a time. That's fine for the first 20 or 30 important pages and keeps every change easy to review. For Yoast the calls are yoast-get-post-seo and yoast-edit-post-seo; for Rank Math, rank-math-get-post-seo and rank-math-edit-post-seo. The other five plugins have equivalents.
For post 318:
1. Read its current SEO title, description and robots. Show them to me.
2. Read the post content and summarise in two lines what the page offers,
using the service, product and place names the page itself uses.
3. Propose one meta description of about 140-155 characters:
- describe only what is on the page
- no prices, guarantees, awards or response times unless the page states them
- no keyword lists, no "Welcome to"
- different wording from every description you wrote earlier in this chat
4. Wait for my approval. Then write ONLY meta_description. Do not touch
the SEO title, canonical or robots.
Why this is safe rather than lucky:
It's a partial merge. The edit call changes only the fields you send. The Yoast reference says "send only the fields to change," and "everything is validated before anything is written." Send only meta_description and the title, canonical and robots stay as they were.
Plugin variables still work. Yoast variables such as %%title%%, %%sep%% and %%sitename%% work, and Rank Math keeps variables such as %title% and %sep%. An empty string clears the override so the post type template applies again.
No invented facts. This is the rule not to relax. WPPilot's guidance: "prices, guarantees, awards and response times come from the page or the owner, never from the model." Language models like adding "fast", "affordable" or "trusted". Read every draft against the page before you approve it.
Here's the target shape, from WPPilot's documented Yoast example (placeholder business, real field names):
{
"post_id": 123,
"meta_description": "Book a boiler service in Leeds. See what the service includes, the areas covered and how to request an appointment."
}
Every write is recorded. Free's Yoast and Rank Math edits go into the change log with a before-image of just the SEO keys they wrote, and wppilot/rollback-change restores them. AIOSEO is the special case: Free's per-post AIOSEO edit keeps its own before-image and can be undone, but Pro's AIOSEO writes are marked irreversible, so read the old values first on AIOSEO sites.
Step 5: Check what the site actually serves
A saved field isn't a served tag. Page caches hold old HTML, themes override things, and a forgotten second SEO plugin can print its own tags.
WPPilot Free's verify-rendered-page "fetches the page as a visitor gets it and reports what was served." After each write:
Re-read post 318's SEO fields, then run verify-rendered-page on it.
Confirm the served meta description matches what we saved. If not,
tell me what was served instead.
If the saved value is right and the served one isn't, purge the page cache first. WPPilot's use case notes "a cached page can keep serving the old title until the page cache is purged." Still wrong? Check the theme header or a leftover SEO plugin before blaming the AI. A WordPress.org Rank Math support thread about missing descriptions ended the same way: clear the cache and check the page source.
Step 6: Scale up carefully (Pro)
One at a time gets slow on a site with hundreds of posts. This is where Pro earns its place.
seo-bulk-update-meta sets SEO fields on up to 100 posts per call through the active plugin's own per-post writer. Without dry_run or confirm it is refused with wppilot_confirmation_required and told how many posts it would overwrite. dry_run=true returns each post's before and after and writes nothing; confirm=true writes. Results are per post (updated, unchanged or error), and one failing post never stops the rest. A field the plugin doesn't store fails that post with wppilot_seo_field_unsupported instead of pretending it saved.
Take the next 25 posts from the audit list that are missing a description.
Draft a description for each with the same rules as before. Run
seo-bulk-update-meta with dry_run=true, one item per post. Show me the
before and after as a table. Do not confirm until I reply with the post
IDs I approve.
Why 25, not 100? Because you should actually read the dry run, and 25 rows is a table you'll check properly. Advice in r/woocommerce threads about rewriting thousands of product descriptions points the same way: smaller batches with retries and logging are more reliable.
Modest batches also matter for undo: the ledger docs say a single bulk call keeps before-images for its first megabyte of changes only.
Each written post gets its own ledger row. Yoast SEO, Rank Math, SEOPress, The SEO Framework, Slim SEO and SmartCrawl rows restore with wppilot/rollback-change. AIOSEO rows are irreversible; to undo them, rerun the write with the before values from the batch.
Pro also covers the case from that Reddit thread: category and tag archive descriptions. In Yoast that's yoast-edit-term-seo. Term SEO is available for Yoast, Rank Math, AIOSEO and SEOPress, not the three smaller plugins. And Pro's content-fix-plan can turn a finished audit into reviewable items, including "adding a missing description through the SEO plugin," which content-fix-apply applies only for the items a person picked.
Step 7: Undo when you need to
You'll write a few descriptions you regret. Every change shows up in wp-admin under WPPilot > Changes, which "undoes one change, one bulk batch, or every undoable change a filter shows, up to 200 at a time, without involving the agent that made them." Bulk writes are grouped, so you can undo a whole batch or just the posts that came out wrong.
Two limits from the same page: "Rollback is never universal," and history ages out. The ledger keeps the newest 10,000 changes or 90 days, and drops large before-images after 30 days. Review new descriptions within the month.
Step 8: Stop the gap from coming back
New posts keep going out with empty descriptions. WPPilot Free's scheduled routines are read-only audits the server runs on WP-Cron with no agent connected. A routine can run audit-content with checks set to ["seo_meta"] daily or weekly at an hour you choose, compare each run with the last, and email a summary to administrators you pick by user ID. Routines can only run read-only audits, so they never change a page.
Create a weekly routine for Monday at 7:00 site time that runs
audit-content with the seo_meta check and emails the report to user 1.
Show me the routine before saving it.
Each week you get the new gaps to close with the Step 4 prompt.
Mistakes worth avoiding
- Letting copy work touch canonicals and robots. WPPilot's rules say to leave them "out of copy work"; they decide which URL search engines see.
- Skipping the served-page check. Caches and themes will happily show the old tag.
- Treating length as law. Google says there's no limit on description length; the snippet is truncated to fit the device. Around 140 to 160 characters keeps the important part visible, but a good 170 character description is still good.
Free vs Pro for this job
The Free vs Pro comparison has the full list. For missing meta descriptions:
WPPilot Free
-
audit-contentwith theseo_metacheck - Read and set one post's SEO title, description and robots in all seven SEO plugins, with undo
-
verify-rendered-pagefor the served HTML - Scheduled routines that re-run the audit and email results
- The change ledger and the WPPilot > Changes undo screen
WPPilot Pro adds
-
seo-bulk-get-metawith missing description, missing title and duplicate title filters -
seo-bulk-update-meta, up to 100 posts per call, dry run first - Category and tag archive SEO in the four larger suites
- Canonicals, keyphrases, social fields, schema and redirects where the suite supports them (Yoast redirects also need Yoast Premium)
-
content-fix-plan/content-fix-apply, and Site Kit reads to choose pages by click-through rate
For a few dozen important pages, Free covers the whole job. Pro matters when the list runs into the hundreds or you need archive pages. Global SEO plugin settings stay read-only in both.
Where to go next
- The audit-first version with Claude, including its ability list: Fix WordPress SEO with Claude
- Bulk calls, filters and confirmation rules: Supported SEO plugins ability reference
- The weekly check: Scheduled WordPress audits
- What undo covers and what it can't: Change ledger and rollback
The whole workflow in one line: audit in Read Only, pick the pages that matter, write from the page with no invented claims, save only the description, check what's served, and let a weekly routine flag new gaps. The AI does the typing. You still decide what's true.
Top comments (0)