Custom Content Types
Define your own content models beyond the built-in Page and Post — products, events, jobs, portfolios, anything.
Contensio ships with two system content types — Page and Post — and lets you define any number of additional types for your project. A "Product", an "Event", a "Job Listing", a "Portfolio Item" — each becomes a first-class entry in the admin sidebar with its own list, edit screen, and permissions.
Creating a content type
Go to Configuration → Content Types and click New Content Type.
Labels
Give the type labels for the default language (required) and each additional language (optional). Contensio uses these throughout the admin UI:
| Label | Example | Where it appears |
|---|---|---|
| Singular | Product | Page titles, breadcrumbs |
| Plural | Products | Sidebar link, list heading |
| URL slug | products | Used in admin URLs (/admin/content/products) |
Contensio derives the internal machine name (e.g. product) from the singular label automatically — you never set it directly.
You can also customise the action labels shown in buttons and empty states: Create, Edit, Delete, All, Search, Not found.
Features
Choose which panels appear on the edit screen for items of this type:
| Option | What it enables |
|---|---|
| Excerpt | A short summary field below the body |
| Featured image | The image picker in the sidebar |
| Comments | The "Allow comments" toggle per item |
| SEO fields | Meta title, meta description, OG image tab |
| Hierarchical | Items can have a parent item (like Pages) |
The block editor, slug field, autosave, and status selector are always on.
Custom fields
In the Custom Fields tab, attach one or more field groups to the type. You can reorder them — the order controls how groups are displayed in the editor and on the frontend.
Image sizes
In the Image Sizes tab, configure what responsive variants Contensio generates when a featured image is uploaded. Each size has a width, height, and fit mode (cover, contain, crop, scale, or pad).
Managing items
Once created, the content type appears in the admin sidebar. The list, create, and edit screens are identical to Posts — the same block editor, same language tabs, same status workflow.
Admin URLs follow the pattern /admin/content/{slug} (e.g. /admin/content/products).
Permissions
Each custom content type automatically gets its own set of permissions ({type}.create, {type}.update, {type}.delete). Assign them to roles under Configuration → Roles to control who can manage items of that type.
Frontend display
Custom content types do not get a public frontend route by default. Contensio's built-in frontend only handles /blog/{slug} (posts) and /{slug} (pages). To display custom type items publicly you have two options:
Option A — Custom route in your app
Add a route and controller to your Laravel application that queries the content type:
use Contensio\Models\Content;
use Contensio\Models\ContentType;
Route::get('/products/{slug}', function (string $slug) {
$type = ContentType::where('name', 'product')->firstOrFail();
// resolve by slug via ContentTranslation...
});
Option B — Plugin or theme
Build a plugin that registers routes and views for the type, following the plugin documentation.
Editing or deleting a content type
Go to Configuration → Content Types, open the type, and update labels, features, or field groups. Changes are immediate — no migrations needed.
Deleting a content type permanently deletes all its content items, translations, and field values. This cannot be undone. The system types (Page, Post) cannot be deleted.