Custom Taxonomies

Organize content with categories, tags, and your own custom taxonomies — assignable to whichever content types you choose.

What it is

Every site has two built-in taxonomies for blog posts: Category (hierarchical — a category can have sub-categories) and Tags (flat). Beyond those two, you can define your own custom taxonomies — a "Region," a "Product Line," anything specific to your content — and choose which content types each one applies to: the blog, one or more of the content types you've defined (see Content Types), or several at once.

A taxonomy is a category of organization; its individual values (e.g. "Recipes" within Category, or "vegan" within Tags) are called terms. Assigning a term to an article or entry is what lets you later find "everything tagged vegan" or "everything in the Recipes category."

Managing taxonomies

  1. 1

    Open Taxonomies

    In the site editor, go to Workspace → Taxonomies. Category and Tags are already there — every site starts with them.

  2. 2

    Create a custom taxonomy

    Give it a name and a slug, choose whether it's hierarchical (terms can have a parent, like Category) or flat (like Tags), and pick which content types it's assignable to — the blog and/or any content type you've defined; at least one is required. You don't need to pre-create its terms — the next step handles that.

  3. 3

    Assign terms from the entry editor

    Open any blog post or content-type entry and use its Category/Tags (or your custom taxonomy's) field — a searchable picker, not free text. Search existing terms or type a new one to create it on the spot; there's no separate "add this term first" step.

Hierarchical vs. flat

A hierarchical taxonomy (like the built-in Category) lets a term have a parent — "Desserts" under "Recipes," for example — so you can browse or filter at either level. A flat taxonomy (like Tags) has no parent/child relationship; every term stands on its own.

Every term gets its own page

Once a term has at least one published entry, your published site automatically gets an indexable archive page for it — listing every entry that carries it, at yoursite.com/tags/vegan or yoursite.com/category/recipes. You don't create these pages yourself; they're generated straight from your terms, and they update automatically as entries are published, unpublished, or re-tagged.

A term with no published entries yet doesn't get a page at all — an empty archive would just be a thin, low-value page for search engines, so nothing is published for it until it has real content.

Anywhere you render terms on a page yourself (e.g. a tag cloud built from a repeating terms block), each rendered term automatically links to its archive page too.

SEO for a term's archive page

Every term archive comes with a search-friendly title, a meta description generated from the term's own description (or a plain "N posts in X" summary if it doesn't have one), and a canonical URL — no setup required. Two overrides are available if you want more control, currently via the manage_taxonomies MCP tool's updateTerm action rather than the dashboard UI:

  • seoMetaDescription — replaces the auto-generated meta description for that term's archive page specifically.
  • seoNoindex — excludes the archive from your sitemap and marks it noindex for search engines, while still keeping the page itself live and linkable. Useful for a low-value or purely organizational term (e.g. a catch-all "uncategorized") you don't want competing for search visibility with your real content.

Customizing an archive page's layout

Every taxonomy's archive pages start with a plain, generic list — title, excerpt, cover image, date. You can replace that with a real, custom layout: one template per taxonomy, shared by every one of its terms (all of yoursite.com/tags/* uses the same layout, not one per tag). This is currently available via the manage_templates MCP tool only — there's no dashboard UI for it yet.

A template has two kinds of placeholder, kept strictly separate. Outside the entry list, term-level placeholders describe the term itself: {{name}}, {{description}}, {{count}}, {{path}}, and {{taxonomyName}}. The entry list itself is a single container marked data-zg-archive-entries — its one child element is the "card" that gets repeated once per published entry, and inside that card the same-looking placeholders mean the entry's own fields instead: {{title}}, {{excerpt}}, {{path}}, {{publishedAt}}, and {{coverImageUrl}}. Which meaning applies is purely a matter of whether the placeholder sits inside or outside that one container — a {{path}} outside it is the archive page's own URL, the same placeholder inside a card is that specific entry's URL instead.

There's no saved-variant or per-locale variant support for an archive template yet (unlike content-type detail-page templates, which have both) — exactly one template per taxonomy. Deleting it reverts that taxonomy's archive pages to the default generic list.

Example prompt
"Create an archive template for the 'tags' taxonomy with a two-column card grid — cover image on top, title and excerpt below."

Choose which content types it applies to

A taxonomy is only assignable to the content types you've explicitly checked for it — the blog, one specific content type, or several at once. Check multiple to share one vocabulary (e.g. one "Region" taxonomy used by both blog posts and a Testimonials content type) instead of redefining it per type; a content type you haven't checked simply won't offer that taxonomy in its entry editor. You can widen or narrow this any time from the taxonomy's settings — including for Category and Tags themselves.

  • A content type created after a taxonomy already exists isn't automatically included — add it explicitly if you want that taxonomy there too.
  • An entry can have terms from as many taxonomies as apply to its content type — Category, Tags, and any custom ones, all independently.

Coming from WordPress?

This works the same way WordPress's own register_taxonomy() does — every taxonomy (built-in or custom) is registered against a specific set of post types, not automatically every one. If you've used ACF's "Register Taxonomy" screen, the Assignable to picker here is the same idea as its Post Types field, just presented as checkboxes instead of a multi-select. There's no equivalent of ACF's Public toggle, since every taxonomy here is always visible/API-accessible — and no separate plural/singular label, since nothing here needs one.

Category and Tags can't be removed

Category and Tags are permanent — you can rename them or edit their terms, but you can't delete them or change their slug. They're the two taxonomies every generated site's article frontmatter always exposes, so removing or renaming either would break that.

AI agents can manage taxonomies too

Anything you can do here is also available to an MCP-connected AI agent — manage_taxonomies creates taxonomies and terms and sets a term's archive-page SEO overrides, manage_articles' terms field assigns them to an entry by name (auto-creating the term if it doesn't exist yet), and manage_templates authors a taxonomy's archive-page layout (see above — the only way to do this today, dashboard UI included). See Zitegen MCP tools for details.