Skip to main content

Post Types & Taxonomies

Create custom post types and taxonomies from the WordPress admin — no code required. Start from a blueprint for a common content type, or build one row by row: labels, key, supported editor features, URLs, visibility and archive behaviour.

Post types created here can also be targeted by the Custom Fields extension, displayed with the [posts] element, and edited with the Page Builder.

The Post Types & Taxonomies admin page

The screen has three tabs:

TabWhat it holds
Post TypesThe two definition lists, plus a live overview of what is registered and how much content each type holds.
BlueprintsOne-click packs — post type, its taxonomies, and a matching field group.
ToolsJSON export / import (including Custom Post Type UI imports), PHP code export, and the key-rename migration.

Blueprints

The fastest way to get a working content type. Pick a blueprint and click Install — it creates the post type, the taxonomies that belong with it, and (when Custom Fields is active) a matching field group, all wired together.

BlueprintWhat you get
TestimonialsQuotes with author, role, company, URL and a 1-5 rating slider; a Testimonial Category taxonomy.
Team MembersProfiles with job title, email, phone, LinkedIn, bio and an optional link to a WordPress user; a hierarchical Department taxonomy; ordered by menu order.
Case StudiesClient, project URL, year, headline result, a gallery and related case studies; Sector and Service taxonomies; Page Builder enabled.
FAQManually ordered questions grouped by Topic. Non-public — designed to be pulled into a page.
ServicesHierarchical, with summary, price and an icon picker; Page Builder enabled.
EventsStart and end date-times, venue, address, booking URL and a video embed; single-select Event Type; sorted oldest first.
PropertiesPrice, beds, baths, floor area with units, a map location, gallery and virtual tour; single-select Property Type, hierarchical Location with nested URLs, flat Features.
Job ListingsLocation, salary range, closing date, apply URL and a hiring manager; Department and Contract Type. Kept out of site search.
LocationsAddress, phone, email, opening hours and a map location; hierarchical so a region can contain its sites.
RecipesServings, prep/cook time, repeating ingredient and step lists and a video; Cuisine, Course and Dietary taxonomies.
DownloadsA resource library — file, version, size and a gated flag; Download Category.
tip

Blueprints only ever add. Anything whose key already exists — from another blueprint, another plugin, or your own row — is reported and left exactly as it is, so installing one can never damage existing content, and re-installing is safe.

The Blueprints tab — a card per ready-made content type

Developers can register their own with the fw_ext_post_types_blueprints filter.

Post type options

Each row's popup is split into tabs.

A post type's options popup, showing its General tab

General

OptionWhat it sets
EnabledWhether the type is registered. Turn this off to switch a post type off without deleting its definition — see Removing a post type.
Singular / Plural labelsThe display names (e.g. "Project" / "Projects").
Key (slug)The post type's identifier. Max 20 characters, permanent — but see Renaming a post type key.
DescriptionShown in the REST schema and by some plugins.
SupportsWhich editor panels are enabled: title, editor, featured image, excerpt, author, comments, revisions, page attributes, native custom fields.
Page BuilderEnables the Unyson+ Page Builder on this post type. Equivalent to ticking it on the Page Builder settings page — you don't need to do both.
HierarchicalPage-like (parent/child) vs post-like.
Menu iconA Dashicon, an uploaded PNG/JPG, raw SVG markup, or none.
Menu positionIts position in the admin menu.

Visibility

Public is the master switch; the rest default to sensible values derived from it, and you only change them for a non-standard combination.

OptionWhat it sets
PublicVisible on the front end and queryable.
Publicly queryableWhether front-end URLs resolve for this type.
Exclude from searchKeeps the type out of site search while it stays otherwise public.
Available in menusWhether it appears in the Appearance → Menus editor.
Admin screens / Admin menu item / Admin barWhich parts of the admin UI are generated.
Block editor / RESTGutenberg and the REST API.
REST baseThe endpoint name under /wp-json/wp/v2/. Worth setting deliberately if anything headless consumes the type.
ExportableWhether it's included in Tools → Export.

URLs

OptionWhat it sets
URL slugThe slug used in permalinks. Lets a post type keyed book live at /books/.
Use permalink prefixWhether the site's permalink base is prepended.
Has archiveWhether the type gets an archive page.
Archive slugA different path for the archive than for single items — e.g. items at /book/…, archive at /library/.
caution

If your permalink structure starts with a prefix such as /blog/, leaving Use permalink prefix on puts every item of every custom type underneath it (/blog/books/…). Turn it off for clean /books/… URLs — this is usually what you want.

Taxonomies

Built-in taxonomies attaches WordPress' own Categories and/or Tags to the post type, sharing the same terms as your posts. To keep terms separate, create your own taxonomy instead.

Archive

Optional overrides applied to this type's archive page only — items per page, order by (title, menu order, last modified, comment count, random) and direction. Blank inherits the site-wide setting.

Labels

Optional overrides for individual admin strings — the menu item, "All items", "Add new", "Edit", "View", "Search", the empty-state message, the archive title, and the featured-image box (so a Book can say "Cover" and a Team Member "Headshot"). Anything left blank keeps the label generated from the singular and plural names.

Taxonomy options

TabWhat it holds
GeneralEnabled, singular/plural labels, key (max 32), the post types it attaches to (required), description, hierarchical (Category-style) vs flat (Tag-style), and an optional default term assigned when none is chosen.
EditorThe term selector — default checkboxes/tag input, single select (radio buttons), or hidden — plus the admin column, Quick Edit and tag-cloud toggles.
Visibility & URLsPublic, availability in menus, REST + REST base, URL slug, permalink prefix, and nested term URLs (/genre/fiction/thriller/).
LabelsThe same optional per-string overrides as post types.
tip

Single select is the right choice for anything mutually exclusive — a status, a property type, a course. It enforces exactly one term per item, which the default checkbox box cannot.

What the screen tells you

Above the lists, an overview table shows every definition with its status (Registered, Disabled, Not registered, No key), a live content count, and links straight to that type's list, "Add new", and its fields.

Validation runs when you save and reports, per row, anything that will not register: a missing, unusable, over-length or reserved key; a duplicate key; a post type and taxonomy sharing a key; a key another plugin already owns; a taxonomy attached to no post types. It also warns about softer problems — a URL slug that collides with an existing page, an archive enabled on a non-public type, a non-numeric menu position.

note

Validation never blocks a save. Your definitions are always stored exactly as entered, so nothing is lost while you fix the problem — the notices just explain what will not register, and why.

Removing a post type

Removing a row does not delete content. It stops registering the type, which makes the existing posts invisible — no admin menu, no edit screen, and their URLs stop resolving — while the data stays in the database.

So the screen treats removal as recoverable: it asks for confirmation, and every removal is recorded in a Recently removed panel showing how much content is now orphaned, with a Restore button that brings the type and its content back exactly as they were.

tip

To switch a post type off, untick Enabled on its General tab rather than deleting the row. The definition and its content stay intact, and turning it back on is instant.

Tools

The Tools tab — Export, Import, Get PHP code and Rename a post type key

Export and import

Export downloads every definition as JSON — useful for moving a schema to another site, keeping it in version control, or bundling it with a theme.

Import accepts that file and also a Custom Post Type UI export, so an existing schema can be brought across without retyping it. Both the combined CPT UI file and a single post type or taxonomy section are understood, including labels, supports, archive slug and menu icon. Existing keys are never overwritten; an optional Replace mode clears the current definitions first.

Get PHP code

Generates the register_post_type() and register_taxonomy() calls equivalent to your definitions, ready to paste into a child theme's functions.php, with label strings wrapped in __() against a text domain you choose.

The extension is only a UI over those exact calls, so moving a definition into code changes nothing about your existing content — it keeps working, and you can then delete the row. Use it when you want a definition in version control, or shipped inside a distributable theme.

Renaming a post type key

A post type key is normally permanent, because changing it orphans everything already saved under it. This tool migrates the content with the key: it rewrites the post type of every existing item, updates the definition, and re-points any taxonomy attached to the old key.

caution

This rewrites rows in the database. Back up before running it on a site with a lot of content. The tool refuses reserved keys and keys already registered by something else, and shows how many items will move before you run it.

How it registers

Definitions are stored in the extension's settings and registered with register_post_type() / register_taxonomy() on the WordPress init hook (priority 20, post types before taxonomies). A save that changed something schedules a flush_rewrite_rules() that runs on wp_loaded on the next request, so permalinks work immediately without disturbing rewrite rules that other plugins register later in init.

Developers can adjust the arguments before registration with the fw_ext_post_types_args and fw_ext_post_types_taxonomy_args filters, react to schema changes with the fw_ext_post_types_saved action, and tune archive queries with fw_ext_post_types_archive_query. Every user-created type also gets fw-cpt-single-{key} / fw-cpt-archive-{key} body classes for styling.

See Per-extension hooks for the full list.

Typical workflow

  1. Activate Post Types & Taxonomies from Unyson+ → Extensions.
  2. Open the Blueprints tab and install the closest match — or add a Post Type by hand.
  3. Adjust the labels, URL slug and archive behaviour on the row's tabs.
  4. Optionally add a Taxonomy and attach it to the post type(s).
  5. Save. The overview table confirms what registered and how much content each type holds, and Custom Fields adds meta boxes to your new post types.