
While working with one client, the topic of content management came up early in our conversations. Their site was fairly dated, built on a clunky legacy page builder that leaned on Advanced Custom Fields under the hood. It looked great on the frontend – polished, on-brand, exactly what visitors expected. But on the admin side, it was a different story entirely. Editing a page meant scrolling through a maze of repeater fields and nested groups with no real relationship to what the content would actually look like once published. There was a wide canyon between the editing experience and the end result, and that gap is exactly the kind of problem custom Gutenberg blocks are built to solve.
The page builder had accumulated roughly a dozen different modules over the years: standard content blocks, multi-column layouts, image-left and image-right content sections, and more. Migrating each of these into custom Gutenberg blocks was mostly straightforward. The one exception, and by far the most complex conversion, was the FAQ system.
Because the original setup hadn’t used a custom database table, the FAQ data lived in a bizarre web of postmeta records that referenced other postmeta records, which in turn referenced still more postmeta records. There was a surprising amount of hidden logic holding it all together, and untangling that logic before I could even think about rebuilding it as a clean custom Gutenberg block took real archaeology.
The whole project was iterative by necessity. Just when I thought I’d mapped every pattern in the data, I’d find a piece of content that broke the mold – an FAQ entry with an extra field, a content block missing an expected meta key, something. That’s a big part of why non-destructive conversion processes matter so much when you’re migrating legacy content into custom Gutenberg blocks: you want the freedom to re-run the conversion as many times as it takes without worrying about data loss. Fortunately, that was manageable here, since the original page builder stored everything in postmeta and left post_content entirely empty which, while great for my conversion script, was terrible for site performance and querying.
That contrast is actually a good segue into why custom Gutenberg blocks are worth the investment in the first place. It’s entirely possible to build custom Gutenberg blocks completely from scratch using React and the block editor APIs, and for highly bespoke interfaces, that’s sometimes the right call. But it’s also perfectly viable, and often faster, to build custom Gutenberg blocks by leveraging ACF’s block registration tools, which let you define fields the way you already know and render them with familiar PHP templates.
Either approach beats the alternatives. Custom Gutenberg blocks are so much easier to work with than shortcodes or third-party page builders because editors get a reasonably accurate, real-time view of what the front end will actually look like. There’s no mental translation required between “what I’m editing” and “what the visitor sees” — which means less guesswork, fewer preview-and-revert cycles, and a much smaller gap between admin and frontend than what I started with on this project.