PHPackages                             oliverthiele/ot-faq - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. oliverthiele/ot-faq

ActiveTypo3-cms-extension[Utility &amp; Helpers](/categories/utility)

oliverthiele/ot-faq
===================

FAQ - FAQ extension with output of structured data in JSON format.

v6.0.1(1mo ago)08.0k↑1158.3%2GPL-2.0-or-laterPHPPHP &gt;=8.3

Since Oct 12Pushed 3w ago2 watchersCompare

[ Source](https://github.com/oliverthiele/ot_faq)[ Packagist](https://packagist.org/packages/oliverthiele/ot-faq)[ Docs](https://github.com/oliverthiele/ot_faq)[ RSS](/packages/oliverthiele-ot-faq/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependencies (4)Versions (20)Used By (0)

OT FAQ — TYPO3 FAQ Extension with Structured Data
=================================================

[](#ot-faq--typo3-faq-extension-with-structured-data)

A FAQ extension for TYPO3 v13 and v14 that renders an accessible Bootstrap 5 accordion and automatically outputs valid **Schema.org FAQPage JSON-LD** structured data for Google Rich Results.

[![TYPO3](https://camo.githubusercontent.com/b53bdca9ce384fc877701998f476e5f2dbf33c5e3563e6f8bd197b46a3160f35/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5459504f332d31332e3425323025374325323031342e332d6f72616e67652e737667)](https://typo3.org/)[![Packagist Version](https://camo.githubusercontent.com/1c122b46091bd139cdcd1241301c1cc294a89ac39418e9ee35bc93d5fc037265/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6f6c69766572746869656c652f6f742d6661712e737667)](https://packagist.org/packages/oliverthiele/ot-faq)[![PHP](https://camo.githubusercontent.com/74bf6a4a8307c70b6fe0c1f38b82f1d3e2a309693d12616774b3f8d4256769bb/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f646570656e64656e63792d762f6f6c69766572746869656c652f6f742d6661712f7068702e737667)](https://php.net/)[![License](https://camo.githubusercontent.com/b962b4cc7ab8c9d2bd9a08e8b10605ad235e380141b4f2fed2aa911dfb1b7360/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6f6c69766572746869656c652f6f742d6661712e737667)](LICENSE)[![Changelog](https://camo.githubusercontent.com/6bc02a7bc61afc1cb3faaa53420df6d904b9940d7f3e2e11a463e1fdbb3cd52d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4368616e67656c6f672d4348414e47454c4f472e6d642d626c75652e737667)](CHANGELOG.md)

---

Features
--------

[](#features)

- **Schema.org FAQPage** — JSON-LD structured data generated automatically from question/answer records
- **Bootstrap 5 accordion** — accessible, animated, with configurable initial state (first open / all closed)
- **Restricted RTE** — custom CKEditor preset (`OtFaqAnswer`) limits the answer editor to HTML tags allowed by Google's FAQ structured data specification
- **Custom parseFunc** — `lib.parseFuncOtFaqAnswer` additionally strips disallowed tags on frontend output
- **ot-irrebuttons integration** — when `oliverthiele/ot-irrebuttons` is installed, each question can have individual buttons (icon, label, link) instead of a single link field
- **Tags &amp; categories** — questions can be tagged and categorised
- **Related questions** — M:N relation between questions
- **Storage page** — questions can be stored on a dedicated folder page; falls back to the plugin's own page
- **SiteSet** — TypoScript is provided as a TYPO3 v13 SiteSet; no manual TypoScript includes required
- **Structured data toggle** — disable JSON-LD output per content element (useful when the same FAQ is embedded on multiple pages)

---

Requirements
------------

[](#requirements)

RequirementVersionTYPO3`^13.4 | ^14.3`PHP`>=8.3`Bootstrap5.x---

Installation
------------

[](#installation)

```
composer require oliverthiele/ot-faq
```

Then run the TYPO3 database analyser or setup command:

```
# via DDEV:
ddev typo3 extension:setup -e ot_faq
```

---

Configuration
-------------

[](#configuration)

### 1. Add SiteSet

[](#1-add-siteset)

Include the SiteSet in your site configuration (`config/sites/yoursite/config.yaml`):

```
dependencies:
    - oliverthiele/ot-faq
```

This automatically includes the TypoScript setup and constants — no manual `@import` needed.

### 2. Add a FAQ content element

[](#2-add-a-faq-content-element)

In the TYPO3 backend, insert a **FAQ** content element (group: Extras) on the page where the FAQ should appear.

The plugin outputs one accordion per content element. Questions are managed separately in the **List** module on the same page (or on a configured storage page).

### 3. Create questions

[](#3-create-questions)

In the **List** module, switch to the FAQ storage page and create `tx_otfaq_domain_model_question` records. Each record holds:

- **Question** — the question text (used as accordion header and JSON-LD `name`)
- **Answer** — rich text, restricted to Google-allowed HTML tags
- **Link** — optional fallback link shown below the answer (replaced by ot-irrebuttons buttons if that extension is active)
- **Related questions** — optional M:N relation
- **Tags / Categories** — optional

---

Google FAQ Guidelines
---------------------

[](#google-faq-guidelines)

Follow the [Google FAQPage structured data guidelines](https://developers.google.com/search/docs/appearance/structured-data/faqpage):

- Each question must be unique across the entire site.
- Every question must be self-contained — do not reference other questions.
- Write questions exactly as a user might ask them (e.g. to a voice assistant).
- If the same FAQ content element is embedded on multiple pages, disable JSON-LD output on all but one page via the \* *Disable structured data*\* checkbox in the FlexForm.

The answer field uses a restricted CKEditor preset that only allows the HTML tags Google permits in FAQ structured data: `a`, `b`, `br`, `div`, `em`, `h2`, `h3`, `h4`, `i`, `li`, `ol`, `p`, `strong`, `ul`

---

ot-irrebuttons Integration (optional)
-------------------------------------

[](#ot-irrebuttons-integration-optional)

When [`oliverthiele/ot-irrebuttons`](https://packagist.org/packages/oliverthiele/ot-irrebuttons) is installed:

- The **Link** field is hidden from the question form.
- An **IRRE Buttons** field is added instead — each question can have one or more buttons with individual label, link, icon and style.
- The controller loads the button records and sets them on the question model at runtime.
- The template renders them via the `IrreButtons` partial.

### Partial path priority

[](#partial-path-priority)

The extension uses a layered fallback for partial resolution:

IndexSourceContent0`EXT:ot_faq`Minimal `IrreButtons.html` + empty `Icon.html` (last resort)**15**`EXT:ot_irrebuttons`Full implementation with Bootstrap Icons**80**Your SitePackageProject-specific icon system (recommended)No sitepackage configuration is required for basic button output. Icons will use Bootstrap Icon class names (`bi bi-*`) by default — only relevant if Bootstrap Icons CSS is loaded in your project.

### Providing a custom icon renderer

[](#providing-a-custom-icon-renderer)

To replace the default Bootstrap Icons with your own icon system, add an `Icon.html` partial in your sitepackage:

```
plugin.tx_otfaq {
    view {
        partialRootPaths {
            80 = EXT:your_sitepackage/Resources/Private/Extensions/OtIrrebuttons/Partials/
        }
    }
}

```

The partial receives `{iconIdentifier}` as an argument. Example using [`oliverthiele/ot-icons`](https://packagist.org/packages/oliverthiele/ot-icons):

```

```

Or using Bootstrap Icons directly (which is the default from ot-irrebuttons):

```

```

---

Template Customisation
----------------------

[](#template-customisation)

The extension follows TYPO3's template override convention. Override paths in your sitepackage TypoScript:

```
plugin.tx_otfaq {
    view {
        templateRootPaths.20 = EXT:your_sitepackage/Resources/Private/Templates/
        partialRootPaths.20  = EXT:your_sitepackage/Resources/Private/Partials/
        layoutRootPaths.20   = EXT:your_sitepackage/Resources/Private/Layouts/
    }
}

```

### Available template variables

[](#available-template-variables)

VariableTypeDescription`{questions}``ObjectStorage`All question records for this content element`{data}``array`The `tt_content` record of the current content element`{settings}``array`FlexForm settings (accordionFlush, initialView, alwaysOpen, disableStructuredData)`{json}``string`Pre-encoded JSON-LD string for the FAQPage schema### Question model properties

[](#question-model-properties)

PropertyGetterDescription`question``getQuestion()`Question text`answer``getAnswer()`HTML answer (RTE, already processed)`link``getLink()`Optional link (typolink format)`irreButtons``getIrreButtons()`Button records from ot-irrebuttons (runtime, not persisted)`relatedQuestions``getRelatedQuestions()`Related question records`tags``getTags()`Tag records---

FlexForm Options
----------------

[](#flexform-options)

OptionDescription**Storage page**PID of the page where question records are stored**Accordion flush**Remove borders and rounded corners (Bootstrap `accordion-flush`)**Initial view**Open first question on page load, or start with all collapsed**Always open**Allow multiple accordion items open simultaneously**Disable structured data**Suppress JSON-LD output for this content element---

License
-------

[](#license)

GPL-2.0-or-later — see [LICENSE](LICENSE)

Author
------

[](#author)

Oliver Thiele — [oliver-thiele.de](https://www.oliver-thiele.de)

###  Health Score

55

—

FairBetter than 97% of packages

Maintenance94

Actively maintained with recent releases

Popularity25

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity74

Established project with proven stability

 Bus Factor1

Top contributor holds 98.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~99 days

Recently: every ~11 days

Total

18

Last Release

35d ago

Major Versions

v2.0.8 → v3.0.02024-05-16

v3.0.1 → v4.0.02025-01-04

v4.1.1 → v5.0.02026-04-06

v5.0.2 → v6.0.02026-04-25

PHP version history (2 changes)2.0.6PHP &gt;=8.1.0

v6.0.0PHP &gt;=8.3

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/5030298?v=4)[Oliver Thiele](/maintainers/oliverthiele)[@oliverthiele](https://github.com/oliverthiele)

---

Top Contributors

[![oliverthiele](https://avatars.githubusercontent.com/u/5030298?v=4)](https://github.com/oliverthiele "oliverthiele (61 commits)")[![theLine](https://avatars.githubusercontent.com/u/2531075?v=4)](https://github.com/theLine "theLine (1 commits)")

### Embed Badge

![Health badge](/badges/oliverthiele-ot-faq/health.svg)

```
[![Health](https://phpackages.com/badges/oliverthiele-ot-faq/health.svg)](https://phpackages.com/packages/oliverthiele-ot-faq)
```

###  Alternatives

[friendsoftypo3/content-blocks

TYPO3 CMS Content Blocks - Content Types API | Define reusable components via YAML

101466.4k45](/packages/friendsoftypo3-content-blocks)[wazum/sluggi

TYPO3 extension for URL slug management with inline editing, auto-sync, locking, access control, and redirects

41515.2k](/packages/wazum-sluggi)[praetorius/vite-asset-collector

Use AssetCollector to embed frontend assets generated by vite

54299.7k1](/packages/praetorius-vite-asset-collector)[typo3/cms-redirects

TYPO3 CMS Redirects - Create manual redirects, list existing redirects and automatically createredirects on slug changes.

167.3M74](/packages/typo3-cms-redirects)[typo3/cms-sys-note

TYPO3 CMS System Notes - Records with messages which can be placed on any page and contain instructions or other information related to a page or section.

116.2M37](/packages/typo3-cms-sys-note)[b13/assetcollector

Asset collector - Add CSS and SVG files and strings as inline style tag/inline svg to the html code.

10123.2k](/packages/b13-assetcollector)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
