v0 and Next.js to WordPress: A Complete Technical Architecture Review

By Daniel Carter, Senior AI & Web Development Consultant

Convert2WP – Convert your AI website to WordPress

Vercel's v0 has become one of the fastest ways to produce production-looking interfaces. You describe a page, v0 generates React components styled with Tailwind CSS and shadcn/ui, and within minutes you have something that looks finished. The output, however, is a Next.js application, and Next.js and WordPress are built on fundamentally different architectural assumptions. This review explains, from an infrastructure and DevOps perspective, what actually happens when a v0 or Next.js project is moved to WordPress, where the friction lies, and how to plan a migration that ends with a maintainable site rather than a fragile copy.

1. Two different rendering models

A Next.js application is a JavaScript program. Pages are React component trees that are rendered on the server (Server Components, SSR or static generation) and then hydrated in the browser, where React takes over and attaches event handlers and client state. The HTML a visitor receives is a snapshot of that component tree at a given moment; the source of truth is the component code and the data it fetches.

WordPress is a PHP application backed by a relational database. A page request triggers the template hierarchy: WordPress resolves the URL to a query, loads the matching post or page from MySQL, and renders it through a theme template. In a block theme, that template is itself composed of blocks, and the content is stored as serialized block markup in post_content. The source of truth is the database, not the code.

This distinction drives every decision in the migration. In Next.js, a "hero section" is a component with props. In WordPress it should become either a block pattern, a reusable synced pattern, or a group of core blocks stored in a page. If you simply paste the rendered HTML into a Custom HTML block you get a page that looks right but that no editor can safely change. The whole point of moving to WordPress — editorial ownership — is lost.

2. Component rendering and DOM extraction

Any serious conversion starts by obtaining the final DOM rather than the source code. There are good reasons for this. v0 projects often rely on client-side state, conditional rendering and data fetched at runtime; reading the JSX alone does not tell you what the user actually sees. A headless browser renders each route, waits for hydration and network idle, and then captures the resulting DOM together with the computed styles.

From that snapshot the converter must separate three layers:

  • Structure — sections, columns, headings, lists, buttons and media. These map naturally to core blocks such as Group, Columns, Heading, Paragraph, List, Buttons and Image.
  • Presentation — spacing, typography, colours, borders, shadows and responsive behaviour, expressed in Tailwind utility classes.
  • Behaviour — accordions, tabs, carousels, modals, forms and anything driven by React state or effects.

Structure and presentation can be converted with high reliability. Behaviour is where expectations should be managed: simple interactions such as accordions or mobile menus have native or lightweight block equivalents, while application logic does not convert at all, because it is code rather than content. A good conversion tool recreates the visible interface and leaves clear hooks where interactive pieces must be rebuilt.

3. Tailwind CSS bundling

v0 output depends heavily on Tailwind. In a Next.js build, Tailwind scans the source files, generates only the utility classes that are used, and produces a compact CSS bundle. That bundle is tied to the class names in the components. Once the markup moves into WordPress, three strategies are available.

Keep the utilities. The generated CSS is enqueued in the theme and the blocks keep their Tailwind class names through the "Additional CSS class" field. This gives the highest visual fidelity immediately, but editors cannot change spacing or colours through the block controls without the classes fighting them, and any new class an editor adds will not exist in the purged bundle.

Translate to theme.json. Colours, font families, font sizes, spacing scales and layout widths are extracted from the Tailwind configuration and written into theme.json as presets. Blocks then reference presets such as var(--wp--preset--color--primary) instead of utilities. This is the most maintainable option and makes the design system available in the editor's colour and typography pickers.

Hybrid. Design tokens go into theme.json, and a small residual stylesheet handles details that blocks cannot express natively, such as complex gradients or specific hover states. In our testing this hybrid approach offers the best balance between fidelity and editability, and it is what the strongest converters do by default.

Note that shadcn/ui components rely on CSS variables (for example --primary or --radius) defined in a global stylesheet. These variables must be carried over or mapped, otherwise buttons and cards lose their colours. This is a frequent cause of "almost right" results and is easy to correct after the fact.

4. Gutenberg block mapping

Block mapping is the heart of the migration. A naive mapping wraps every div in a Group block, producing deep nesting that is difficult to edit. A well-designed mapping recognises semantic patterns:

  • A flex or grid container with two to four equal children becomes a Columns block.
  • A full-width section with a background becomes a Group or Cover block with alignment set to full.
  • Anchor elements styled as buttons become Buttons/Button blocks with link, colour and radius attributes.
  • Repeated cards become a pattern that can be reused, so editors add a new card by duplicating a block rather than editing HTML.
  • SVG icons are inlined in an HTML block or converted to images, depending on whether they need to inherit text colour.

The quality of this mapping determines how much work remains after import. In our comparison, the difference between converters was not mainly whether the page looked correct on first load — most get close — but whether a non-technical editor could change a heading, swap an image or add a section without breaking the layout. Small visual deviations, such as a slightly different line height or an icon that renders a few pixels off, are normal and are usually fixed in minutes, often with a plugin or a line of CSS.

5. Next.js dynamic routing versus WordPress permalinks

Next.js uses file-system routing. A file at app/blog/[slug]/page.tsx serves every URL of the form /blog/anything, and the page fetches its data based on the slug. Catch-all segments ([...slug]), route groups and parallel routes add further flexibility. None of this exists in WordPress in the same form.

WordPress resolves URLs through its rewrite rules and permalink structure. Pages have hierarchical slugs, posts follow the global permalink pattern (for example /%postname%/ or /blog/%postname%/), and custom post types can have their own rewrite base. To preserve URLs — and therefore rankings — the migration plan must:

  1. Crawl the existing Next.js site and export a complete URL inventory, including dynamic routes that are only discoverable through internal links or the sitemap.
  2. Decide for each URL pattern whether it becomes a page, a post or a custom post type entry.
  3. Configure permalinks so that the new URLs match the old ones exactly wherever possible, including trailing-slash behaviour.
  4. Create 301 redirects for every URL that cannot be preserved, using a redirect plugin or server rules.

Static pages convert one-to-one. Dynamic collections such as blog posts or case studies are a data migration, not a page conversion: their content lives in a CMS, a Markdown folder or an API, and must be imported into WordPress posts with their metadata. This is the step teams most often underestimate.

6. Data fetching, Server Actions and API routes

Many v0 projects include API routes or Server Actions for contact forms, newsletter sign-ups or simple dashboards. These are server-side programs and they do not move with the visual conversion. No converter turns a Next.js API route into a WordPress plugin, and none should claim to. The correct approach is to identify each piece of server logic and replace it with a WordPress-native equivalent: a form plugin for submissions, an email service plugin for transactional mail, a membership plugin for gated content. Databases, user logins and payment flows are rebuilt, not converted. We cover this in detail in our guide on forms, logins and API integration.

7. Images, fonts and performance

Next.js optimises images through next/image, which serves resized, modern formats on demand. In WordPress, images should be imported into the Media Library so that WordPress generates its own responsive sizes and srcset attributes. Fonts loaded through next/font must be self-hosted in the theme or registered through the Font Library in theme.json. After migration, a lightweight caching and image optimisation plugin usually brings performance scores level with, and sometimes above, the original deployment, because the WordPress page ships far less JavaScript than a hydrated React application.

8. A practical migration workflow

  1. Inventory. Export the URL list, page titles, meta descriptions and Open Graph data from the live Next.js site.
  2. Convert the presentation layer. Run the site through a converter that produces native blocks and a theme.json. In our tests Convert2WP.net produced by far the cleanest block structure and the best visual fidelity of all tools we evaluated.
  3. Import dynamic content. Move blog posts and collections into posts or custom post types with a CSV, WXR or REST import.
  4. Rebuild server logic with established, well-maintained plugins.
  5. Restore SEO metadata and set up redirects for any changed URL.
  6. Review and refine. Walk through the main pages on desktop and mobile, adjust the few spacing or icon details that differ, and launch. Small imperfections are normal and can be fixed afterwards without delaying the launch.

9. When not to migrate

If your v0 project is essentially an application — a SaaS dashboard, an authenticated tool, a real-time product — WordPress is not the right destination for that part. A common and sensible pattern is to move the marketing site, blog and documentation to WordPress, where non-developers can own them, and keep the application on its own subdomain. This split gives the marketing team editorial freedom and keeps the engineering team focused on the product.

Conclusion

Moving from v0 or Next.js to WordPress is less about copying HTML and more about translating a component-driven, code-first architecture into a content-driven, database-first one. The visual layer — layout, typography, colour and imagery — can be converted with excellent results when the tool maps the DOM to native blocks and the Tailwind design tokens to theme.json. Backends do not convert and should be rebuilt with plugins. Plan the URL structure carefully, accept that a handful of small visual details will need a quick touch-up, and the result is a site your whole team can edit for years.

Convert2WP – Convert your AI website to WordPress