The blog move
Move a WordPress Blog to Next.js: Posts, Archives, Comments and Feeds, Intact
Somewhere in your WordPress blog is a 2017 post with a [gallery] shortcode, three tags nobody uses and a comment thread that still gets a reply every spring. Moving the blog to Next.js means moving that post too, in a form that reads well and ranks as it did.
October 8, 2026 · 8 min read
The short answer
Export posts through the WordPress REST API while the old plugins are still active, so shortcodes arrive as finished HTML. Map categories, tags and authors to structured fields, decide which archives to rebuild, carry comments as static text or retire them, rebuild the RSS feed at /feed/, keep every post URL, and edit future articles in a CMS such as Athena.
On this page
- What a WordPress blog is made of, table by table
- Shortcodes and the posts nobody has opened since 2017
- Categories, tags and authors: keep what earns its keep
- Comments: carry them, freeze them or let them go
- Featured images, pagination and the RSS feed
- The blog move, from export to first new post
- Writing the next post in Athena, with Calliope drafting
What a WordPress blog is made of, table by table
A blog looks like a list of articles. In the database it is a handful of tables doing several jobs at once. Posts, pages, revisions, menu items and every uploaded image sit together in wp_posts, told apart by a type column. Custom fields, SEO titles and builder data pile up in wp_postmeta. Categories and tags live in the terms tables. Authors are rows in wp_users. Comments have a table of their own, complete with the commenter's email address and IP.
There are three ways to get it out. The built-in exporter under Tools, Export writes a WXR file, which is XML with the raw post content and metadata. The REST API at /wp-json/wp/v2/posts returns JSON, including a rendered version of each post. A direct database export gives you everything, including the parts no API exposes. We usually combine the REST API for content with a database read for the plugin metadata the API leaves out.
Not everything in those tables should travel. Revisions, auto-drafts and trashed posts stay behind; a busy blog can hold more revision rows than published posts. Scheduled and private posts need a decision from a person, not a script. And the SEO title and meta description for each post usually sit in the SEO plugin's postmeta fields, not in the post itself, so they are exported separately and attached to the matching post. Lose them and every article falls back to a generic title the day the new site launches.
Shortcodes and the posts nobody has opened since 2017
Old posts are where blog migrations go wrong. A post written in the classic editor stores shortcodes as plain text in the content: [caption] around images, [gallery ids="12,15,18"], a contact form plugin's shortcode, a button from a theme that is no longer installed. On a builder site the problem is larger. Divi 4 stores whole layouts as et_pb_ shortcodes, and WPBakery uses vc_ ones, so a post's raw content can be more brackets than words.
The useful trick is timing. The REST API's rendered content is the post after WordPress has run its content filters, which includes expanding shortcodes. Export while every plugin is still active and you receive finished HTML instead of a puzzle. Then clean that HTML into structured content: headings, paragraphs, images with their alt text, quotes and embeds, without the wrapper divs and inline styles a builder adds.
- Gallery and caption shortcodes become image blocks with captions, using the original files described in the images migration guide.
- Embeds written as a bare YouTube or social URL on its own line become embed blocks, because WordPress turned them into players at display time.
- Plugin shortcodes such as forms, tables or calculators become components in the new build, or get replaced when the feature is no longer needed.
- Builder shortcodes from Divi or Avada get stripped to their content, with layouts rebuilt only where the post earns traffic.
Block editor posts are the easy ones. Their content is HTML wrapped in HTML comments with names such as wp:paragraph and wp:image, and those markers say exactly what each block is, so they convert cleanly.
Categories, tags and authors: keep what earns its keep
Categories are usually worth keeping at their existing URLs. They group posts by topic, they collect internal links, and on established blogs they rank for broad searches. Each one becomes a record with a name, slug, description and an introduction that makes the archive page worth landing on.
Tags are a different story. Most WordPress blogs have far more tags than readers ever click, many attached to a single post. Each one created an archive page, and a pile of one-post archives is thin content in any framework. During the move we sort tags into three groups: ones with real traffic, which keep their pages; near-duplicates of categories, which merge and redirect; and the long tail, which redirects to the closest category. The redirect guide covers the mechanics.
Authors become profiles with a name, photo, bio and links. If several people write for the blog, author pages earn their place and keep their /author/ addresses. On a site with one writer, the author archive duplicates the blog index and can be redirected to it. Either way, each post keeps its byline.
Comments: carry them, freeze them or let them go
Comments are content too. A long, useful thread under a how-to post adds questions and answers Google can read, and readers trust a post that other people have argued about. A thread of spam and one-word thanks adds nothing. The decision is per blog, sometimes per post.
Carry them over when
- Threads contain real questions and answers that add to the post
- Your best posts have active discussions
- Readers still reply to older posts every month
Freeze or retire them when
- Most comments are spam, pingbacks or one-word thanks
- Nobody has replied in years
- Moderation has been a chore you would happily drop
Carried comments are usually rendered as static text beneath each post: name, date and message, nothing more. The commenter's email and IP address stay out of the new site, because nobody needs them published and nobody should have to store them. Live commenting can come back later through a dedicated service if the community is worth it. Paged comment URLs such as /comment-page-2/ redirect to the post itself.
The third option
Athena CMS, with AI agents on staff.
Not a theme and not a blank Next.js repo. The content system we put behind every custom site: plain fields, a real preview, every version kept, and AI agents that handle the chores a plugin only nags you about.
- PicassoImages
- ApolloSite analysis
- AresCompetitor watch
- PrometheusContent holes
- AtlasPage depth and structure
- DelphiAI search visibility
and 12 more agents. Two come with Athena; the rest are monthly add-ons.

Featured images, pagination and the RSS feed
Each post's featured image becomes a hero field with its own alt text and caption, read from the attachment record rather than guessed. Blog index and archive pagination are rebuilt at the same /page/2/ style addresses and generated at build time, so page nine of the archive is as fast as page one. Each paginated page carries its own canonical tag.
The feed deserves more respect than it gets. Feed readers, podcast directories, newsletter tools that email new posts automatically, and partner sites can all be polling /feed/ without anyone at the company remembering it exists. In Next.js, a route handler at the same path returns RSS XML built from the same content as the pages, with full text or excerpts as before. Category feeds that had subscribers get rebuilt; the rest redirect to the main feed.
| In WordPress | In Next.js + Athena | URL plan | |
|---|---|---|---|
| Posts | wp_posts rows with HTML or shortcodes | Structured fields, prerendered pages | Keep every address |
| Categories | Terms with archive pages | Category records with written intros | Keep the ones with traffic |
| Tags | Terms, often one post each | Merged into categories or kept selectively | Redirect the long tail |
| Authors | wp_users with archive pages | Author profiles | Keep on multi-author blogs |
| Comments | wp_comments with emails and IPs | Static text, personal data dropped | Paged comment URLs redirect |
| Featured images | Attachment posts | Hero field with alt and caption | Ranking files kept or redirected |
| RSS | Feeds on nearly every archive | Route handler at /feed/ | Main feed kept, extras redirected |
The blog move, from export to first new post
- 1
Inventory the blog
Count posts, categories, tags, authors and comments, and list every shortcode in use with the posts that contain it.
- 2
Export with plugins active
Pull rendered content and metadata through the REST API, plus SEO titles and descriptions from the SEO plugin's fields.
- 3
Clean and structure
Convert HTML into structured blocks, fix headings, carry alt text and captions, and flag posts that need a human look.
- 4
Decide archives and comments
Mark which categories, tags and author pages stay, which merge and which redirect, and which comment threads travel.
- 5
Rebuild routes and feeds
Match the old permalink pattern, paginated archives and /feed/ exactly, following the URL structure plan.
- 6
Compare before switching
Check a sample of old and new posts side by side, then replay every old URL against the preview build.
Publishing sites deserve a word of their own. A magazine on the Newspaper theme can hold thousands of posts with deep category trees, and its layouts come from the bundled tagDiv Composer rather than the posts themselves. A small business blog on GeneratePress or Kadence is mostly block editor content and moves quickly. Post count and shortcode mess drive the effort far more than the theme name does.
Writing the next post in Athena, with Calliope drafting
The best reason to move a blog is what writing feels like afterward. In Athena CMS a post is a set of plain fields: title, summary, body, hero image, category, author. There is a real preview, every version is kept, and no plugin update can break the editor on a Tuesday morning. The published page is prerendered and fast, which is the point of the WordPress vs Next.js speed comparison.
Calliope, the agent that writes articles, drafts new posts for your approval. Prometheus finds the questions customers ask that no page answers yet and drafts the page. Iris writes search titles, descriptions and social cards. Ariadne links new posts to old ones and old ones to new. Harmonia can prepare Spanish versions. Each one drafts and waits for a yes unless you allow it to publish. For a full rebuild around the blog, see our Next.js rebuild service, and the migration hub for the rest of the series.
Questions people ask before they call
They should, and in our migrations they do. Next.js can reproduce post name, date-based and category-based permalinks with dynamic routes, including the trailing slash. Posts at identical addresses need no redirects. Anything that does change, such as merged tags or retired archives, gets a permanent redirect to its closest match.
We export posts while the original plugins are still active, so the REST API returns shortcodes already expanded into HTML. That HTML is then cleaned into structured content. Shortcodes for features like forms or calculators become components in the new build. Builder shortcodes are reduced to their text and images, and layouts are rebuilt where the post matters.
Yes. Useful threads are usually carried over as static text under each post, with names and dates but without email or IP addresses. If you want live commenting afterward, a dedicated comment service can be added. Many owners decide to retire old comments instead, especially when most of them are spam.
It will if it is rebuilt at the same address. A Next.js route handler at /feed/ returns RSS XML from the same content as the pages, so readers, podcast apps and newsletter tools keep working without changes. Category feeds with real subscribers are rebuilt too, and the rest redirect to the main feed.
Your team, in Athena CMS, with help. Calliope drafts articles for approval, Iris writes the search titles and descriptions, and Ariadne adds internal links. Nothing publishes without permission unless you allow it. Compare the options in WordPress vs Next.js vs Athena CMS.
Keep reading
- Permalinks, mappedWordPress to Next.js URL Structure: Keep the Addresses Google Already TrustsHow WordPress permalinks, categories, ?p= links, pagination, feeds and attachment pages map to Next.js routes, and which URLs to keep, change or retire.
- The media library moveMigrate WordPress Images to Next.js Without Losing Alt Text, Captions or Image Search TrafficMove a WordPress media library to Next.js: the uploads folder and its resized copies, alt text and captions, next/image, CDNs and images that rank in Google.
- Astra migration guideAstra to Next.js: Migrate an Astra Site Layer by Layer, Rankings IntactMigrate Astra to Next.js without losing rankings: what happens to astra-settings, Site Builder layouts, Spectra blocks and Elementor pages, step by step.
- Kadence migration guideKadence to Next.js: Moving Kadence Blocks, Shop Kit and MembersKadence to Next.js, step by step: parse Kadence Blocks, map the global palette, rebuild Hooked Elements, move Shop Kit stores and members, keep every URL.
- GeneratePress migration guideGeneratePress to Next.js: Leaving the Cleanest Theme in WordPressGeneratePress to Next.js: why GP sites cost less to move, how Elements, hooks and GenerateBlocks CSS migrate, and the URL plan that keeps your rankings.
- Leaving BlocksyBlocksy to Next.js: Moving the Customizer, Content Blocks and Shop ExtrasMove a Blocksy site to Next.js: Customizer settings, header builder, Content Blocks, Post Types Extra fields and Shop Extra features, mapped one by one.
- Everything in WordPress to Next.jsSee the section
See what moving your blog involves
Send us the address. We will count the posts, shortcodes, tags and comments, and tell you what moves cleanly and what needs a hand.
Which of these sounds like you? (pick any)
Rather talk now? Call (210) 346-0848.
