Contensio logo

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.