Blocks
A block is a reusable chunk of structured content that you embed in any page or post with a single shortcode: {{block:name}}. When the site is built, each shortcode is replaced by the block’s rendered HTML; edit the block once, and every page that embeds it changes.
How embedding works
In the body editor of any page or post, type:
{{block:my-block-name}} - The name must match a published block’s Internal Name, in the same language as the page.
- An unpublished block is silently skipped: the placeholder is removed from the output rather than rendered.
- The same block can be embedded multiple times in one body; every location renders it identically.
- To find out where a block is used, open it in the admin and check its usage view, which lists every page and post whose body mentions it.
Simple block types
These types need no JSON, just flat fields:
| Type | Best for | Key fields |
|---|---|---|
| cta | Call-to-action section | heading, subheading, button label, button URL |
| image | Standalone image with caption | image URL, alt text, caption |
| quote | Pull quote | quote text, attribution, label |
| hero | Full-width banner | heading, subheading, button label, button URL, image |
| testimonial | Customer testimonial | quote text, attribution, avatar, label |
| stat | Single large statistic | heading (the number), subheading (the label) |
| promo | Image + text two-column | image, heading, body copy, button |
| embed | Iframe / third-party embed | raw HTML body, caption |
| video | Embedded video with poster | embed URL, heading, caption, poster image |
| form | Contact form | heading, subheading, submit label, action URL |
| newsletter | Email signup strip | heading, subheading, button label |
| audio | Embedded audio player | heading, audio file URL |
| callout | Note / warning / tip box | heading, body copy, variant (info, warning, success, note) |
| code_block | Syntax-highlighted code sample | language, optional label, code text |
| divider | Horizontal rule between sections | none: styling only |
| heading | Standalone section heading | heading text, level (h1–h6), optional subheading |
| spacer | Vertical space between blocks | none: height set via the padding/margin appearance controls |
| text | Freeform rich-text section | heading, body copy |
Structured block types
These repeat rows of data stored as JSON; each type’s admin form includes a row editor that writes the JSON for you:
| Type | Best for | Data shape |
|---|---|---|
| accordion | Collapsible FAQ / sections | repeated rows of title + body, rendered natively (no JavaScript) |
| table | Data table | one header row plus rows of cell values |
| columns | 2-, 3-, or 4-column feature grid | repeated rows of heading, body, optional image |
| gallery | Image grid | repeated rows of image URL, alt text, optional caption |
| button_group | Row of call-to-action buttons | repeated rows of button label, URL, optional style; group style variant |
| citations | Source / reference list | repeated rows of citation text, optional URL, anchor id |
| faq | FAQ section with SEO markup | repeated rows of question + answer; auto-generates Schema.org FAQPage data |
| feature_grid | Icon-led feature list | repeated rows of icon (image or glyph), heading, body |
| grid | Freeform custom-HTML grid layout | repeated raw-HTML cells; column count and gap |
| logo_bar | Partner / client logo strip | repeated rows of logo image, alt text, optional link URL |
| page_list | Auto-linked list of a page's children | a parent-page reference: cards (title, URL, description) are generated from live page data at build time, no manual rows |
| pricing_table | Plan / pricing comparison | repeated tier rows: name, price, period, feature list, optional button, optional "featured" flag |
| team | Team / staff roster | repeated rows of photo, name, role, bio, optional links |
| timeline | Chronological history or roadmap | repeated rows of date, title, body |
| schedule | Weekly recurring schedule (hours, service times) plus dated exceptions | repeated weekly day/time/label rows, plus repeated dated-exception rows; auto-generates Schema.org Event data for upcoming exceptions |
Text-safety conventions: rich HTML is accepted in a specific set of body fields: accordion and columns row bodies, embed bodies, callout body copy, faq answers, feature_grid item bodies, grid cells, text block body copy, and timeline event bodies. Every other field (titles, headings, image URLs, captions, button labels) is escaped automatically.
Appearance options for every block
Each block has shared styling controls applied as inline styles on its wrapper:
- Background color: a hex, rgb, or hsl value. You can also put a utility class name here instead of a color: that string is attached as a CSS class to the wrapper instead of a background style.
- Border: enable, set a width, and override the border color.
- Text color: applied to heading and body elements for types that support it.
- Padding and margin: CSS-style shorthand around the whole block.
Working with blocks in the admin
Blocks are managed from the Blocks screen, a paginated list grouped by type, with each entry’s name, language, published flag, and last-updated date.
- New blocks start blank; errors during save are shown all at once.
- Sample blocks: the list page can construct a starter set (hero, CTA, promo, stat, quote, and testimonial) pre-styled and in English; existing blocks of the same names are left alone.
- Trash: deleting a block moves it to the trash with an undo link, so mistakes are recoverable.
- Usage report shows where a block is referenced.
- Bulk actions operate on up to 500 selected blocks: publish, unpublish, move to trash, duplicate as drafts, change the block type (only to currently registered types), and others. Any change globally triggers a site build.
- Import: blocks (and snippets) can be brought in via JSON or CSV.
When you change a block, its shortcode containers rebuild automatically so the live site reflects the update.
Extending: adding a new block type
New block types are one registry entry plus two files: register the type slug on the Block Types screen (that table is the sole authority for valid types), then add a builder template and an admin form for the type. When writing the builder template, escape user-controlled fields as usual; the only expected raw-HTML fields are embed bodies and body rows inside accordion/columns content.
Stacks: reusable sequences of blocks
For larger sections that repeat across pages, stacks let you export/import, duplicate, view where each one is used, and diff revisions; all from the Stacks section next to Blocks.
Also in Blocks
The grid block lays out freeform cells in a CSS grid: its fields for columns, gap, and cell count, and how cell HTML is rendered.
Use the feature_grid block for repeating feature items with an optional icon, heading, and body, plus its fields and HTML safety rules.
Use the pricing_table block for plan comparisons: its heading and per-tier fields for name, price, period, features, button, and featured.
Add a team block: a grid of people with photo, name, role, short bio, and optional links, plus its fields and how members are added.
The timeline block: an ordered list of dated events with a date label, title, and body, plus its fields and how HTML is handled.
Use the faq block to render question-and-answer pairs with automatic FAQPage structured data: fields, raw HTML answers, appearance.
Add a numbered list of sources to the end of an article with the citations block: its heading, per-citation URL and text, and anchor IDs.
The form block embeds a form on a page or post: how it links to a Form record by form_id, its heading and button fields, and where it submits.
Use the page_list block to list a parent page's live children as cards that stay in sync at build time, plus its fields and HTML safety rules.
Use the embed block to place third-party embed code such as an iframe, map, or video in a page, with its fields and the unescaped-HTML warning.
Add a table block: a plain HTML data table from column headers and rows, with its fields, and when to use it instead of the pricing table block.
The schedule block: weekly recurring hours plus dated exceptions, with automatic Schema.org Event markup.