Converting generated pages into posts
7 min read
Generated pages are virtual: fast and always in step with your data, but they are not posts. Conversion turns the live pages of a task into regular, published WordPress posts of the task's post type. You then edit them one by one, like any other content.
Convert when you want to hand-edit each page, move to a different workflow, or when your license ended and you want to keep the pages without the Pro features. For very large sets staying virtual is the lighter choice: converting thousands of pages adds that many rows to your database and makes the admin slower.
Conversion is available on every paid plan (Pro and up) and, so that nothing is held hostage, also after a license has expired (see the end of this page).
Convert a task
- Open Programmatic SEO and click Convert to posts (also on a task's Pages screen, and in the notice after a license expired). The screen Convert pages to posts opens (
#convert). - It explains the difference: "Generated pages today — Generated pages are virtual: they stay in sync with your data, and changing the template or the data updates all of them at once, without storing a post per page." and "After converting — Each page becomes a regular post that you edit one by one. The task no longer manages those pages and is paused afterwards. URLs are kept where possible; pages whose URL changes redirect (301) from the old address to the post."
- Every task has a card with the Post type (for example Page), Live pages, the Plan limit ("%1$s of %2$s left" or "Unlimited") and an Estimate (pages · about MB). Click Convert 120 pages….
- A dialog Convert “City pages” to posts? says "120 pages become regular “Page” posts. From then on you edit them by hand; the task stops managing them and is paused." Click Convert 120 pages.
- A message confirms "Conversion started. You can leave this page; it continues in the background." The card shows Conversion progress: "Converting… 50 of 120 pages done, 0 failed." and finally Conversion finished: "120 pages became posts, 0 failed. The task is paused."
If a card shows no button it says why:
Message | Reason |
|---|---|
"The post type of this task is no longer registered, so its pages cannot become posts." | The custom post type is gone |
"This task has no live pages to convert." | Nothing is live (hidden pages are not converted) |
"This task has %1$s live pages, but your plan can convert only %2$s more. Upgrade or hide pages first." | Above your conversion limit |
The pre-flight
Before it starts the dialog and the card show:
Item | Meaning |
|---|---|
Pages | Live pages of the task |
Estimate | About 0.15 seconds and about the template's size plus 2 KB per page; the real speed depends on your host and template |
URL changes | In a sample of up to 20 pages, how many get a new URL: "In a sample of up to 20 pages, 3 pages get a new URL. Its old URL redirects (301) to the post." |
Large conversion | Shown above 5,000 pages: "%s become regular posts. This adds many rows to your database and cannot be undone from here; make a backup first." |
Type %s to confirm | Above 20,000 pages you must type the page count to start (a request without it is refused: "Type 25000 to confirm converting this many pages.") |
Make a database backup first for anything large. There is no undo: deleting a converted post is the only way back, and the task has to generate the page again.
Limits and speed
- The conversion cap is your plan's generated pages limit (5,000 Pro, 50,000 Business, unlimited Agency), counted over all pages ever converted (including earlier tasks). Over the cap the start is refused: "Your plan allows converting %d more pages. Disable some pages first, or upgrade." If the cap is reached during a run, it stops cleanly: "The page limit of your plan is reached; the remaining pages stay virtual."
- Converted pages are real posts: they no longer count as generated pages, so converting also frees capacity for new generation.
- The run works in chunks of 50 pages in the background (Action Scheduler), is resumable, and never creates a post twice. Failed pages are counted and the first five errors are listed under Errors (%s); run it again to retry them.
- Only live pages convert; hidden, removed, shadowed and moved pages do not.
What each post receives
Part | Content |
|---|---|
Post type, status | The task's post type, published |
Title, content, excerpt | Resolved for the row (what visitors saw) |
Slug | The last segment of the page's path |
Parent | For hierarchical types (pages): the post at the parent path, if it exists |
Author, menu order | From the template |
Comments, pings | Closed |
Template meta | Copied, with variables resolved. Page builder data is handled as JSON (a value such as |
Taxonomy terms | Copied from the template |
Field group values | The template's values with variables resolved, plus the values stored for the page (set by hand or by AI) |
SEO values | With Yoast SEO: description, title (if it differs from the post title), robots; with Rank Math: description, title, robots. The robots setting is always written so the template's setting does not decide. (No SEO plugin: nothing extra; All in One SEO values are not copied.) |
Link back | The post meta |
Language | On multilingual tasks the post gets its page's language and is linked as a translation to the posts of the same row |
Developers can exclude template meta keys with the filter wpmcf/pseo/conversion/skip_meta_keys and react to each conversion with the action wpmcf/pseo/page_converted (post ID, page ID).
URLs and redirects
- A hierarchical post type (pages) keeps the path when the parent path is empty or an existing page. Otherwise the post is created at the top level (
/lyon/) and the old URL redirects. - A non-hierarchical type (posts, custom types) uses its permalink structure, so the URL usually changes; check the URL changes count.
- Every converted page keeps its old path in the page table with status Converted. Visiting the old path redirects with a 301 to the post when the permalink differs. The redirect works on every plan, also after the task or the license is gone, and also when you delete the task: the converted rows stay.
After conversion:
- the task is paused and not deleted;
- running the task again does not recreate or overwrite converted pages, and does not create duplicates;
- the pages list shows them as Converted with Edit post;
- rewrite rules are refreshed once and caches are cleared.
If you want to start over, delete the converted posts and the task.
Before and after a license ends
Situation | Can you convert? | What serves the old URLs |
|---|---|---|
Active license or trial | Yes, up to the plan's page limit | Virtual pages until converted, then the posts (301 where the URL changed) |
Expired paid license, within the 14-day grace period | Yes, up to the last plan's page limit | Virtual pages are still served; converted ones redirect to their posts |
Expired paid license, after the grace period | Yes, same cap | Unconverted pages answer 404; converted ones redirect |
Trial that ended without a purchase | Not guaranteed: see the note below | Not served at once (no grace period) |
Free (never had Pro) | No | – |
A trial that ends has no grace period, and the plugin treats it as a lapsed trial rather than an expired license. Whether the conversion tool is still offered depends on the site’s license record, so convert before a trial ends if you want to keep the pages.
Practical order after an expiry notice: download your data tables as CSV (links in the notice), run the pre-flight, convert, check the old URLs redirect, then decide about renewing. If you renew, the task continues and nothing converted is touched.
Verified behaviour (test run)
In a test on a Business plan, converting three live pages under an existing parent page produced three published pages at the same paths (/section/graz/ and so on) with the title "Visit Graz", the parent page as post_parent, the old URL answering 200 because it now belongs to the post, no URL changes in the pre-flight, a paused task, no live generated pages, and three rows kept with the status Converted after the task was deleted.
Still stuck? Contact support