The Gutenberg Editor: A Power User's Model
The block editor has been the WordPress default since 2018, and a surprising number of people still use it like a slightly awkward Word document: type at the top, fight the toolbar, paste from Google Docs, hope for the best. That works, in the way that driving in first gear works.
The editor stops feeling awkward the moment you understand what it actually is under the hood, and how its pieces divide responsibility. This post is that mental model: what a block really is, the three layers the editor operates on, when to reach for a pattern versus a synced pattern versus a template part, why theme.json is the quiet control panel behind everything, and what to do when a block "breaks." None of this requires writing code. All of it makes you faster.
The one idea underneath everything: blocks are annotated HTML
Here is the single most useful thing to know about the block editor, and the thing almost nobody tells beginners: your content is still just HTML, stored in the same post_content field WordPress has used for two decades. Blocks are HTML with structured comments around them.
Switch any post to the code editor (in the editor's options menu, or Ctrl/Cmd+Shift+Alt+M) and you'll see something like this:
<!-- wp:heading {"level":2} --><h2 class="wp-block-heading">Pricing</h2><!-- /wp:heading -->
That comment pair is called block serialization. The comment names the block type (wp:heading), carries its settings as a small JSON object ({"level":2}), and wraps ordinary HTML. When the editor loads a post, it parses these comments back into editable blocks. When you hit save, it serializes them back out. That's the whole trick.
This one fact explains a remarkable amount of block-editor behavior:
- Your content is portable. Select blocks in one site's editor, copy, and paste into another site's editor. The serialized markup travels on your clipboard, and the receiving editor parses it back into real blocks. This is the fastest way to move a designed section between sites — no export tool required.
- Deactivating a plugin doesn't vaporize your content. If a plugin that provided a custom block is deactivated, the HTML it saved is still in the database. The editor just no longer knows how to edit it, so it shows a placeholder. Reactivate the plugin and the block comes back to life.
- "Invalid content" errors are a diff, not corruption. When the editor complains that a block "contains unexpected or invalid content," it means the saved HTML no longer matches what the block's current code would generate. More on how to handle that calmly below.
- Front-end output is predictable. On the public site, WordPress mostly just strips the comments and serves the HTML (dynamic blocks like Latest Posts render server-side instead). There is no heavyweight runtime rendering your paragraphs, which is one reason block-editor pages tend to be lighter than the same layout built in a drag-and-drop page builder.
Once you internalize "blocks are annotated HTML," the editor goes from mysterious to mechanical. Everything else is layers on top.
The three layers: content, structure, design
Power users don't ask "how do I change this?" They ask "at which layer should this change live?" The block editor — especially with a modern block theme — splits your site into three layers with different owners and different blast radii.
Layer 1: Content
The blocks inside an individual post or page. Stored per-post in the database. Changing it affects exactly one URL. This is where you spend most of your time, and it's the safest layer: worst case, you use revisions to roll back one post.
Layer 2: Structure
Templates and template parts — the header, the footer, the layout that wraps a single post, the archive page. In a block theme you edit these in the Site Editor (Appearance → Editor), and they're built from the same blocks as your content. Changing a template affects every page that uses it. Edit deliberately, and know that WordPress stores your template customizations in the database, layered over the theme's files — there's always a "Reset" option to fall back to what the theme shipped.
Layer 3: Design
Colors, type scale, spacing, and which controls even appear in the editor. This layer lives in the theme's theme.json file and in the Styles panel of the Site Editor. Changing it affects everything, everywhere, at once — which is exactly what you want for "make all our buttons the new brand green."
The decision rule is simple and worth memorizing:
- Should this change appear on one page? Edit the page. (Content)
- Should it appear on every page of a certain kind? Edit the template. (Structure)
- Should it change the look of an element sitewide? Edit Styles / theme.json. (Design)
Most block-editor frustration is a layer mismatch: someone hand-recolors a heading on forty pages (content layer) when the real fix was one change in Styles (design layer). If you ever find yourself making the same visual tweak on a third page, stop — you're at the wrong layer.
Patterns vs. synced patterns vs. template parts
The editor gives you three ways to reuse a chunk of blocks, and picking the wrong one is the most common structural mistake I see. The distinction hinges on one question: when you edit it later, what should happen?
| Tool | What it is | When you edit one copy | Reach for it when… |
|---|---|---|---|
| Pattern | A starting-point arrangement of blocks. Inserted copies are independent. | Nothing happens to other copies. | You want a consistent starting layout that gets customized each time — a testimonial section, a feature grid. |
| Synced pattern | One shared instance referenced from many places (formerly "reusable block"). | Every copy updates everywhere. | The content itself must stay identical sitewide — a legal disclaimer, a current promo banner, contact details. |
| Template part | A named structural region of the theme (header, footer, sidebar). | Every template using it updates. | The chunk is part of the site's frame, not its content. |
Three sharp edges worth knowing:
- Synced patterns are a commitment. Editing one edits all of them, including on pages you forgot exist. Before changing a synced pattern on a large site, check where it's used. If you only wanted to change one instance, detach it first (convert to regular blocks) — but understand that detaching permanently forks that copy.
- Pattern overrides split the difference. Newer WordPress versions let a synced pattern mark specific fields (a heading, an image) as editable per-instance while the layout stays synced. This is the right tool for "same card design, different text on every page" — a case that used to force an awkward choice.
- Don't build headers out of synced patterns. It technically works, and it's how people got by before block themes. But template parts get proper treatment in the Site Editor, in theme exports, and in the template hierarchy. Structure belongs at the structure layer.
theme.json: the control panel you should know exists
Even if you never open the file, theme.json shapes every editing session you have. It's a single JSON file in the theme that declares two things:
- Settings — which controls appear in the editor at all. Whether users can pick arbitrary colors or only the brand palette. Whether font size is a free-for-all or a fixed type scale. Whether spacing controls, drop caps, or custom gradients exist. Settings can be set globally and then overridden per block type.
- Styles — the defaults: base typography, the color of links, spacing between blocks, per-block default styles.
Why should a non-developer care? Because constraint is a feature. A site where the color picker offers exactly six brand colors, the type scale has five sizes, and spacing snaps to a scale is a site that still looks designed after eighteen months of edits by four different people. A site where every control is wide open drifts into rainbow soup one "quick tweak" at a time.
If you work with a developer, the highest-leverage request you can make is: "lock the palette and the type scale in theme.json." It's typically a small job, and it prevents an entire category of slow visual decay. If you are the developer, note that settings.color.palette, settings.typography.fontSizes, and settings.spacing.spacingScale plus disabling custom values gets you most of the benefit, and style variations let you offer approved alternate looks without reopening the floodgates.
The habits that make you fast
Mechanics matter less than the model, but a few habits pay for themselves within a week:
- Live in List View. The toggle at the top-left of the editor opens an outline of every block on the page. On any layout more complex than plain prose, this is how you select, reorder, and reason about structure — dragging a Group in List View beats fishing for its handle in the canvas every time. Selecting nested blocks by clicking the canvas is a beginner's tax; List View is the refund.
- Insert with the slash command. Type
/on an empty line and start typing the block name:/heading,/columns,/quote. Faster than any inserter panel, and it teaches you the block vocabulary as you go. - Escape, then arrows. Pressing Escape while typing moves you from text editing to block selection; arrow keys then move between blocks, and Enter drops you back in. Combined with Shift+click for multi-select, you can restructure a page without touching the mouse.
- Group early. Wrap related blocks in a Group as soon as a section takes shape. Groups are what you move, style, and later extract as patterns. A page built from five named Groups is legible in List View; a flat list of forty blocks is not. (Rows and Stacks are just Groups with horizontal or vertical layout — same idea.)
- Use the code editor as an X-ray, not an ambulance. Toggling to the code editor to read the serialized markup is a great way to understand what a mysterious layout is doing. Hand-editing it is how blocks get invalidated. Read freely; type rarely.
- Copy blocks, not text. When duplicating a design across pages or sites, use the block toolbar's Copy (or "Copy all blocks" in the options menu). You get the full serialized structure, not a plaintext shadow of it.
When a block breaks: reading validation errors calmly
Sooner or later you'll open an old page and find a block replaced by a warning: "This block contains unexpected or invalid content." Remembering the serialization model turns this from alarming to boring. The editor re-generated what the block's markup should be, compared it to what's saved, and found a mismatch. Common causes: a plugin or theme update changed the block's output, someone hand-edited the HTML, or content was migrated with an overzealous find-and-replace.
Your options, in the order you should try them:
- Attempt recovery. The three-dot menu on the broken block offers "Attempt recovery," which re-parses the saved HTML into the current block definition. It succeeds more often than its modest name suggests, and it's non-destructive to try.
- Check for a deactivated plugin. If the block came from a plugin that's been deactivated or removed, no amount of recovery will help — the editor literally doesn't have the block's definition. Reactivate the plugin first, then edit.
- Convert to Custom HTML. If recovery fails but the front end renders fine, converting the block to Custom HTML freezes it as-is. The page keeps working; you just lose the friendly editing controls for that chunk. A perfectly acceptable outcome for a five-year-old landing page nobody redesigns.
- Rebuild. For content you actively maintain, bite the bullet: rebuild the section with current blocks, ideally as a pattern so next time the fix is in one place.
The rule of thumb: never panic-delete a broken block. The content is still there in the markup, and at minimum you can salvage it from the code editor view.
The decision rules, on one screen
If you take nothing else away, take these:
- Making the same visual tweak on a third page? Wrong layer — fix it in Styles or a template instead.
- Reusing a layout that gets customized each time → pattern. Content that must stay identical everywhere → synced pattern. Part of the site's frame → template part.
- Same design, different words per page → synced pattern with overrides, not forty detached copies.
- Want lasting visual consistency? Constrain the palette and type scale in theme.json. Constraint now beats cleanup later.
- Complex page? Navigate in List View, structure with Groups.
- Broken block? Attempt recovery → check plugins → convert to HTML → rebuild. In that order, without deleting anything.
Blocks reward the model, not the memorizing
You don't need to memorize every block or setting — the editor changes a little with each WordPress release anyway. What doesn't change is the model: content is annotated HTML you can read; the site divides into content, structure, and design layers; reuse tools differ by what happens on edit; and theme.json decides what's even possible. Hold onto those four ideas and every new editor feature slots into a drawer you already have. That's what "power user" actually means here — not more clicking, just less guessing.