Switching SEO plugins guide
Verify Category and Tag SEO When Switching Plugins
Inventory the categories, tags, and custom taxonomy terms with their own SEO values, run the transfer for your source, and check each archive page against a baseline.
On this page
Category and tag SEO needs its own check during a plugin switch, because every source stores it differently and the import preview does not show it. List the terms that carry their own title, description, canonical, or indexing choice, find out whether your source’s term data transfers at all, and compare each archive page’s published tags before and after.
This guide is about moving term data. Whether a category or tag archive should be indexed at all is a separate question. The post side of the switch is covered in How to Switch SEO Plugins With a Verification Plan.
How each source stores term SEO
The storage format decides what an importer can read. The right-hand columns describe WP Visibility 2.10.3.
| Source | Where term SEO lives | Imported | Not imported |
|---|---|---|---|
| Yoast SEO | One option, wpseo_taxonomy_meta, keyed by taxonomy and term ID |
Title, description, canonical, noindex | Other fields, such as social titles and images; an explicit index choice (the term inherits) |
| Rank Math | Term meta under rank_math_ keys |
Title, description, canonical, noindex, Facebook image | Other rank_math_ term fields; terms without a Rank Math title are not found at all |
| SEOPress | Term meta under _seopress_ keys |
Nothing | All term SEO |
| The SEO Framework | One term meta row, autodescription-term-settings |
Nothing | All term SEO |
| All in One SEO | Its own custom term table | Nothing | All term SEO |
Storage locations checked September 27, 2026 against Yoast’s taxonomy meta class, Rank Math’s metadata class, SEOPress’s list of post and term metas, The SEO Framework’s database page, and AIOSEO’s REST API guide.
Two details change what you check. Entries in Yoast’s option for terms that no longer exist are skipped. Rank Math terms are found by their stored title, so a term with only a description or only a noindex choice keeps WP Visibility’s defaults. The source docs for Yoast, Rank Math, and SEOPress have the full field lists.
Inventory the terms that carry metadata
A site can have many terms and only a few with custom SEO. Find the few. Replace wp_ with the prefix that wp db prefix prints.
On a Yoast site, save the option and count its entries per taxonomy:
wp option get wpseo_taxonomy_meta --format=json > yoast-terms.json
wp eval '$m = get_option( "wpseo_taxonomy_meta" ); foreach ( (array) $m as $tax => $terms ) { echo $tax, "\t", count( (array) $terms ), "\n"; }'
On a Rank Math site, list every term meta row and mark which terms have a title:
wp db query "SELECT term_id, meta_key, meta_value FROM wp_termmeta WHERE meta_key IN ('rank_math_title','rank_math_description','rank_math_canonical_url','rank_math_robots','rank_math_facebook_image_id') ORDER BY term_id" > rankmath-terms.tsv
On any other source, find the plugin’s term meta keys first:
wp db query "SELECT meta_key, COUNT(*) FROM wp_termmeta GROUP BY meta_key ORDER BY meta_key"
All in One SEO keeps term data in its own table, not term meta, so this query will not find it. Its content export, under All in One SEO → Tools → Import/Export, has a Taxonomies tab that exports that data as JSON or CSV (AIOSEO’s import and export guide, checked September 27, 2026).
From the result, build a sheet with one row per term: taxonomy, term ID, archive URL, and the stored title, description, canonical, and indexing value. Include custom taxonomies such as product categories, not only categories and tags. Mark three kinds of row, because they are the ones most likely to be missed:
- Sparse terms: a description or noindex choice with no custom title.
- Deliberate indexing rules: a term set to noindex, or set to index inside a taxonomy that is otherwise hidden.
- Custom canonicals: a term that points its archive at another URL.
Know what the preview does not cover
WP Visibility’s import preview counts the posts that would change and shows up to ten of them with their title and description before and after. It does not list terms. Term data is written on the first batch of the live import, along with the separator and homepage settings.
So a clean preview says nothing about categories and tags. To see the term result before production, run a live import on a staging copy, followed by the checks below.
Where imported values land
After the import, WP Visibility keeps term SEO in one term meta row, _wpvis, per term. The term edit screen under Posts → Categories or Tags (and the equivalent screen for other public taxonomies) shows three fields: Search title, Search description, and Search engine indexing. Quick edit does not show them.
Two imported values have no field on that screen in 2.10.3:
- Canonical. It prints on the archive as stored, on page 2 and later too, unless the archive is noindexed. Read it with
wp term meta get <term-id> _wpvis --format=json. - Rank Math’s term social image. It is used as that archive’s
og:image. Without it, a term archive uses the site’s default social image, if one is set.
If an imported canonical is wrong, rewrite the row without it. Get the JSON, remove the canonical key, and save back every other key. In this example the row held only a title and a canonical:
wp term meta get 42 _wpvis --format=json
wp term meta update 42 _wpvis '{"title":"Pruning guides {sep} {site}"}' --format=json
Take a database backup before editing meta directly.
Check term pages against the baseline
Before the switch, save the published head of a small sample of archives while the old plugin is active. After the staging import, save it again and compare. An illustrative sample for garden.example:
| Archive | Why it is in the sample |
|---|---|
/category/pruning/ |
Custom title and description |
/category/pruning/page/2/ |
Pagination with a custom title |
/tag/seasonal/ |
Set to noindex |
/tag/compost/ |
Description only, no custom title |
/plant-type/roses/ |
A custom taxonomy term |
/category/old-offers/ |
A custom canonical |
For each URL, capture the title, description, canonical, and robots tag:
for u in /category/pruning/ /category/pruning/page/2/ /tag/seasonal/ /tag/compost/ /plant-type/roses/ /category/old-offers/; do
echo "== $u"
curl -s "https://garden.example$u" | grep -Eio '<title>[^<]*</title>|<meta name="description"[^>]*>|<link rel="canonical"[^>]*>|<meta name=.robots[^>]*>'
done > terms-after.txt
Run the same loop against the baseline copy and diff the two files. Read each difference as one of these:
| Difference | Likely cause | Action |
|---|---|---|
| Title now uses the archive template | Source has no term import, or the old title came from the old plugin’s own archive template | Re-enter on the term edit screen, or adjust the Archive title template setting |
| Title lost a word | A source variable was removed | See Translate SEO Title Variables |
| Noindex gone | Term not found, or source has no term import | Set Noindex on the term |
| Term now noindexed | A taxonomy-wide rule with no explicit index override | Set Index on the term |
| Canonical now points at the archive itself | Source has no term import, or the term was not found | Decide whether the old canonical is still needed |
Indexing differences have their own procedure in Check Noindex and Inherited Defaults After an SEO Plugin Switch.
Re-enter what did not come across
For SEOPress, The SEO Framework, and All in One SEO, plan to type the values in by hand from your sheet, one term at a time, on the term edit screen. Do it while the old plugin’s data is still in the database, and before you deactivate it, so you can copy from the source screens. Canonicals from these sources have no field to receive them; decide whether each one is still needed, and if it is, consider a redirect instead of a canonical when the old archive should no longer exist.
Checklist
- Sheet of every term with custom SEO, including custom taxonomies.
- Sparse, deliberately indexed, and canonical terms marked.
- Staging live import run, since the preview omits terms.
- Archive sample diffed before and after, including a page 2.
- Missing terms re-entered, and the sheet kept with the migration record.
