Skip to content
WP Visibility

Switching

Migrate from Yoast SEO

Run the import while Yoast's data is still on the site: preview first, then import titles, descriptions, canonicals, indexing choices and category SEO. Redirects move separately.

Updated September 22, 2026

Docs

Install WP Visibility beside Yoast, open WP Visibility → Settings and scroll to the Import section, choose Yoast SEO, click Preview changes, read the preview, then click Import now. The import reads Yoast’s rows and never changes or deletes them, so Yoast still works if you reactivate it. When the live pages look right, deactivate Yoast.

Before you start

  • Take a database backup. The import writes WP Visibility’s own post meta, term meta and three settings. It cannot reverse itself, and the migration report is not a backup.
  • Both plugins print head tags while both are active. Do the import in one sitting and deactivate Yoast as soon as you have checked the result, or do the whole thing on a staging copy first.
  • Yoast does not have to be active. Detection looks at the data, not the plugin, so a site where Yoast was removed but its rows were left behind can still be imported.
  • The Import module is on by default. If the section is missing, turn it on under Modules.

What comes across

For every post the import finds, these fields are read. An empty field is skipped, so a post with no custom title stays on your template instead of receiving a blank.

Yoast field WP Visibility field
_yoast_wpseo_title Search title
_yoast_wpseo_metadesc Search description
_yoast_wpseo_canonical Canonical URL
_yoast_wpseo_opengraph-title Social title
_yoast_wpseo_opengraph-description Social description
_yoast_wpseo_opengraph-image-id Social image
_yoast_wpseo_twitter-title X title
_yoast_wpseo_twitter-description X description
_yoast_wpseo_meta-robots-noindex Search engine indexing
_yoast_wpseo_meta-robots-nofollow Link following

Yoast stores three states in its noindex field: 1 means noindex, 2 means the owner explicitly chose index, and no value means inherit the site default. The import keeps them apart. A 1 becomes Noindex, a 2 becomes Index, which overrides a type-wide noindex in WP Visibility, and an absent value writes nothing, so the post keeps inheriting. Nofollow comes across when it was set; there is no explicit follow.

Categories and tags. Yoast keeps all term SEO in one option, wpseo_taxonomy_meta. The import reads each term’s title, description and canonical, plus its indexing choice (noindex becomes Noindex, index becomes Index, default writes nothing), and stores them as WP Visibility term meta. Entries for terms that no longer exist are skipped.

Settings. Exactly three: the title separator, translated from Yoast’s code (sc-ndash becomes an en dash, sc-pipe a pipe, and so on; an unrecognized code is skipped and your WP Visibility default stays), the homepage title, and the homepage meta description. The two templates are translated from Yoast syntax: %%sitename%% becomes {site}, %%sep%% becomes {sep}, %%title%% becomes {title}, %%sitedesc%% becomes {tagline}, %%excerpt%% becomes {excerpt}, %%primary_category%% and %%category%% become {category}, %%page%% becomes {page}, %%currentyear%% becomes {currentyear}, and %%cf_KEY%% becomes {custom_field:KEY}. A Yoast variable with no equivalent is removed rather than left as literal text.

Per-post titles and descriptions go through the same translation, so a post title of %%title%% %%sep%% %%sitename%% arrives as {title} {sep} {site}.

What stays behind

Nothing else is read. In particular:

  • Focus keyphrases, SEO and readability scores, the cornerstone flag, the primary category, breadcrumb titles and schema type selections. These are Yoast’s own editorial tooling, not output.
  • Per post type and archive templates, social defaults, the knowledge graph and organization settings, verification codes, sitemap settings and robots defaults. Set these in WP Visibility’s own settings; budget an hour, and compare a category page and a post type archive against the old output.
  • A separate Twitter image, and an Open Graph image given as an external URL rather than a media library item.
  • Advanced robots directives such as nosnippet and noarchive.
  • Redirect rules. See below.

Which posts are found

The import looks for posts that have a Yoast SEO title stored. A post that has only a description, a canonical or an indexing choice, and no title, is not found and keeps WP Visibility’s defaults. Before you deactivate Yoast, open one or two posts you know were set that way and check them in the WP Visibility sidebar; set the value by hand, or with wp visibility set <id> --description="...".

Preview, then import

From the settings screen. WP Visibility → Settings, Import section. Choose Yoast SEO under Import from and click Preview changes. The preview counts the posts whose mapped values differ from what WP Visibility stores now and shows the first ten with the title and description before and after, variables already translated. Nothing is written. When it reads right, click Import now.

From the command line.

wp visibility import yoast --dry-run --user=admin
wp visibility import yoast --user=admin

The --user must be an administrator. The dry run prints a running count and the same ten-row table; the live run processes posts in batches of 200 and logs progress after each batch.

Over REST. POST /wp-json/wpvis/v1/import/run with source: "yoast" behaves the same way and defaults to dry_run: true. Send dry_run: false to apply, and continue with the returned offset until remaining is 0. This route needs manage_options and does not pass through the review queue.

Three things about the live run:

  • The first batch also applies the three settings and the term data. The preview covers posts only, so check the separator, the homepage title and description, and a category page after the run.
  • Posts whose mapped values already match are skipped, so running the import twice is harmless. Running it again after you have edited titles in WP Visibility is not: the import puts Yoast’s values back.
  • Yoast’s rows are untouched. Reactivating Yoast finds them exactly as they were, which is what makes going back cheap. It does not carry edits you made in WP Visibility back to Yoast.

Read the preview

Read the ten rows as a checklist.

  1. A variable that vanished. Compost Guide where the old title read Compost Guide %%page%% means a variable with no equivalent was removed. Decide whether the template needs a replacement before you apply.
  2. A blank on the after side. The source field was empty too. Yoast was already falling back to a template on that post.
  3. Indexing is not in the table. After the live run, open one post you know was noindexed and one you know was set to index, and confirm the sidebar shows Noindex and Index.

Redirects

The SEO import does not move redirects. If you use Yoast Premium’s redirect manager, export the rules while Yoast is still active and note the count. WP Visibility imports redirects from a CSV on the Redirects page, and a Yoast export is not one of the layouts it recognizes, so reshape it into three columns, source,target,status, first. The redirect import is also a preview by default: Redirect a Changed URL.

After the import

  1. Open ten URLs you know: the homepage, two posts with custom titles, a noindexed page, a category, a tag, a page with a custom canonical. View source and check the title, description, canonical and robots line.
  2. Set the templates and defaults the import does not carry: Set Title and Description Templates.
  3. Deactivate Yoast. Its data stays in the database on deactivation. Deleting the plugin may remove that data, depending on Yoast’s own uninstall behavior, so delete only when you are sure you will not go back.
  4. Resubmit the sitemap. WP Visibility serves it at /sitemap.xml, and Yoast’s index was at a different address: Submit Your Sitemap.

Field names checked against the WP Visibility importer on September 22, 2026.