Render WordPress Gutenberg in Next.js — 1:1

localhost:3000/about Acme About Docs Shop Contact rendered by NextPress About Acme Family-owned shop in Portland, Oregon — since 2014. Our story We started in a garage. Twelve years later, we still hand-pack every order. The site you’re looking at? Edited in WordPress, served by Next.js. Same blocks, same theme, same fonts. No double-build. Hand-packed in Portland Every order ships within 48 hours. Carbon-neutral postage included. Read more From the journal → How we source our linen → Five years of mended hems → Notes from the workshop, Spring ’26

Full Gutenberg, no compromises.

Wire it in, render the page.

Bring the WooCommerce blocks with you.

  • WC Cart / Checkout / My Account blocks render against the user’s real session.
  • Cart token shared between the Next app and the rendered block via @woographql/session-utils.
  • Product blocks, filters, mini-cart — same WPGraphQL endpoint, no parallel REST surface.
  • Block-level mutations (add to cart, apply coupon) round-trip through WooGraphQL.
app/[…uri]/page.tsx
import { Content, nextImageParser } from '@axistaylor/nextpress'
import { fetchContentByUri } from '@/lib/utils'
import { NextPressLink } from '@/components/NextPressLink'

// proxyByWCR (NextPress middleware) forwards the cart-token
// cookie to WordPress for matching URIs, so the WP renderer
// reads the same session as your Next app. WC Cart, Checkout,
// My Account, and product blocks all render against the user's
// real cart — no withSession wrapper required.
export default async function Page({
  params,
}: {
  params: Promise<{ uri?: string[] }>
}) {
  const { uri } = await params
  const path = '/' + (uri ?? []).join('/')
  const { content, contentCssClasses } = await fetchContentByUri(path)

  return (
    <Content
      content={content}
      contentCssClasses={contentCssClasses}
      instance="shop"
      linksAs={NextPressLink}
      parsers={[nextImageParser]}
    />
  )
}