A portfolio section, a product catalog, a team directory: these are custom post types. On a standard WordPress site, registering one means writing PHP in functions.php, and displaying it means PHP template files in the theme. Canvas Pro handles both from the plugin UI. No PHP required, and no template files to name or place.
Why this matters
The typical pain points are well documented. register_post_type() requires knowing hooks, label arrays, rewrite args, and REST parameters before anything appears in the admin. After registration, a type defined in a theme’s functions.php disappears from the admin when you switch themes, because the registration disappears with the theme. The data is still in the database, but there is no longer any UI to reach it. Canvas Pro registers types through the plugin itself, stored in options, so the type persists regardless of what the theme does.
Permalink flushing is another common first experience: a new type produces 404s on its archive URL until you visit Settings, Permalinks and click Save. Canvas Pro handles the flush on save, so the archive works immediately.
Per-type settings
Each type gets a full set of configuration options. Singular and plural labels set the admin menu names. The rewrite slug controls the URL and is set separately from the post type key, so you can have a clean URL without changing the internal identifier. The archive slug sets the archive URL. The posts-per-page override sets how many posts appear on the archive, independent of the site-wide reading setting. A REST API toggle makes the type available to the block editor and the REST API. If a rewrite slug conflicts with an existing page slug, Pro warns you on save so the 404 is caught before it ships.
Custom fields
Fields attach to each type and appear as inputs when editing a post of that type. For the full list of field types and how each one outputs in a template, see Custom Post Type Field Types.
HTML templates
Each type gets 3 HTML template boxes, written in the same token syntax as the rest of Canvas. The Post card template is repeated for each post in the archive loop. The Single post template renders one full post. The Archive header template prints above the post list on the archive page. All 3 accept the standard post tokens ({title}, {permalink}, {date}, {excerpt}, {content}, {thumbnail}, {thumbnail_medium}, {thumbnail_full}, and their URL variants) plus {field:key} for any custom field on the type. Write the markup the way you would write it for any Canvas page: the classes are yours to style, nothing is imposed.
Per-post hide from archive
Each post of a custom type has a Hide from archive checkbox in its editor. Check it and the post stays published and accessible at its own URL but does not appear in the archive list. Useful for a featured item you want to link to directly without it appearing in the main listing.
Version history and export
CPT definitions are covered by version history, so a bad edit to a template or field schema is never permanent. The full definition, including labels, slugs, fields, and templates, travels with a configuration export, so a type you have built on one site can move to another in one file.
For the step-by-step walkthrough, see How to Create a Custom Post Type in WordPress Without PHP.