Create groups of frequently asked questions and embed them anywhere on your site with a single line. Accordion display - each answer expands and collapses on click.
- FAQ sets - group related Q&A items under a named set
- Unlimited items per set
- Accordion display - single-open accordion; clicking a question expands the answer, clicking again collapses it
- Embeddable by ID or slug - drop any FAQ set into any page, post, or widget area with one line
- Admin CRUD - create, edit, and delete FAQ sets with their items in a single form
- Inline item editing - add, edit, and remove Q&A items dynamically without leaving the form
- Sort order - control which set appears first in listings
- Auto-slug - slugs are generated from the title and kept unique automatically
- An admin creates a FAQ set in Tools → FAQ → New FAQ set, adds Q&A items, and saves.
- The set is embedded anywhere in a theme using
@include('faq::partials.faq-set', ['faqSetId' => 1]). - Visitors click a question to expand its answer. Clicking another question collapses the open one.
Go to Plugins in your Contensio admin, find FAQ Manager, and click Install.
composer require contensio/plugin-faqThe plugin is auto-discovered. Go to Plugins in the admin and enable it. Migrations run automatically on first enable.
@include('faq::partials.faq-set', ['faqSetId' => 1])@include('faq::partials.faq-set', ['faqSetSlug' => 'general-questions'])The ID and slug are both shown on the FAQ sets list screen. Using an ID is more robust - it never changes even if the set title changes.
The embedded widget is self-contained and renders server-side. No JavaScript is needed for the data - Alpine.js handles only the accordion open/close state.
Shows all FAQ sets with their item count and embed snippet. From here you can create, edit, or delete a set.
| Field | Description |
|---|---|
| Title | Set name, displayed above the accordion |
| Description | Optional intro text shown below the title |
| Sort order | Controls ordering in admin listings (lower = first) |
| Questions & Answers | Add or remove items dynamically; minimum 1 item |
Each Q&A item has a Question field (up to 500 characters) and an Answer textarea (up to 5,000 characters). Plain text only - line breaks are preserved in the rendered output.
| Method | URL | Description |
|---|---|---|
GET |
/account/faq |
Admin FAQ sets list |
GET |
/account/faq/create |
New FAQ set form |
POST |
/account/faq |
Create FAQ set |
GET |
/account/faq/{id}/edit |
Edit FAQ set |
PUT |
/account/faq/{id} |
Update FAQ set |
DELETE |
/account/faq/{id} |
Delete FAQ set and all its items |
Two tables created by the migration:
| Column | Type | Description |
|---|---|---|
id |
bigint | Primary key |
title |
varchar(255) | Set name |
slug |
varchar(255) | URL-safe identifier (unique) |
description |
text | Optional intro text (nullable) |
sort_order |
smallint | Display order |
created_at / updated_at |
timestamp |
| Column | Type | Description |
|---|---|---|
id |
bigint | Primary key |
faq_set_id |
bigint | FK → faq_sets.id (cascade delete) |
question |
varchar(500) | The question text |
answer |
text | The answer text (plain text, line breaks preserved) |
sort_order |
smallint | Display order within the set |
created_at / updated_at |
timestamp |
- PHP 8.2+
- Contensio 2.0+
- Alpine.js (included in all Contensio default themes)
AGPL-3.0-or-later - see LICENSE.