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
  1. What a WordPress blog is made of, table by table
  2. Shortcodes and the posts nobody has opened since 2017
  3. Categories, tags and authors: keep what earns its keep
  4. Comments: carry them, freeze them or let them go
  5. Featured images, pagination and the RSS feed
  6. The blog move, from export to first new post
  7. 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.

and 12 more agents. Two come with Athena; the rest are monthly add-ons.

The Athena CMS editor: plain fields with AI rewrite, a Publish box and revisions

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.

Where each part of a WordPress blog goes in a Next.js build with Athena CMS
In WordPressIn Next.js + AthenaURL plan
Postswp_posts rows with HTML or shortcodesStructured fields, prerendered pagesKeep every address
CategoriesTerms with archive pagesCategory records with written introsKeep the ones with traffic
TagsTerms, often one post eachMerged into categories or kept selectivelyRedirect the long tail
Authorswp_users with archive pagesAuthor profilesKeep on multi-author blogs
Commentswp_comments with emails and IPsStatic text, personal data droppedPaged comment URLs redirect
Featured imagesAttachment postsHero field with alt and captionRanking files kept or redirected
RSSFeeds on nearly every archiveRoute handler at /feed/Main feed kept, extras redirected

The blog move, from export to first new post

  1. 1

    Inventory the blog

    Count posts, categories, tags, authors and comments, and list every shortcode in use with the posts that contain it.

  2. 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. 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. 4

    Decide archives and comments

    Mark which categories, tags and author pages stay, which merge and which redirect, and which comment threads travel.

  5. 5

    Rebuild routes and feeds

    Match the old permalink pattern, paginated archives and /feed/ exactly, following the URL structure plan.

  6. 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

Free · No obligation

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.

CallGet a quote