PHPackages                             sitegeist/taxonomy - 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. sitegeist/taxonomy

ActiveNeos-package[Utility &amp; Helpers](/categories/utility)

sitegeist/taxonomy
==================

Manage vocabularies and taxonomies as separate node-hierarchy.

v2.0.2(1y ago)1589.7k↓15.1%16[8 issues](https://github.com/sitegeist/Sitegeist.Taxonomy/issues)[14 PRs](https://github.com/sitegeist/Sitegeist.Taxonomy/pulls)1GPL-3.0+JavaScriptCI passing

Since May 30Pushed 1mo ago5 watchersCompare

[ Source](https://github.com/sitegeist/Sitegeist.Taxonomy)[ Packagist](https://packagist.org/packages/sitegeist/taxonomy)[ RSS](/packages/sitegeist-taxonomy/feed)WikiDiscussions 2.0 Synced 1mo ago

READMEChangelog (10)Dependencies (6)Versions (56)Used By (1)

Sitegeist.Taxonomy
==================

[](#sitegeisttaxonomy)

> Manage vocabularies and taxonomies in Neos as node in a separate subtree `/taxonomies` distinct from `/sites`

### Authors &amp; Sponsors

[](#authors--sponsors)

- Martin Ficzel -

*The development and the public releases of this package is generously sponsored by our employer .*

About
-----

[](#about)

If taxonomies are defined as documents in the `/sites` subtree of the Neos ContentRepository, things tend to get complicated:

- If the meaning of an item is determined by its position in a hierarchy, it is complicated to add more than one relation or relations for different contexts.
- Mixing Taxonomies (meaning) with content (presentation) leads to a complicated structure that often is hard to comprehend for editors.
- It is hard to share taxonomies across multiple sites.
- It is hard to ensure taxonomies exist in all needed dimensions since this also affects the site structure.
- Limiting read and write access to taxonomies inside sites is possible but not trivial.

Sitegeist.Taxonomies store vocabularies and taxonomies as nodes outside of the `/sites` hierarchy in the content repository. This way, the meaning of the taxonomy relations can be expressed better, taxonomies can be used across multiple sites and the taxonomy documents can be defined without interfering with the taxonomy meaning.

It also provides a separate backend module for managing vocabularies and taxonomies.

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

[](#installation)

Sitegeist.Taxonomy is available via packagist `composer require sitegeist/taxonomy`. We use semantic-versioning, so every breaking change will increase the major version number.

Storing vocabularies and taxonomies in the ContentRepository
------------------------------------------------------------

[](#storing-vocabularies-and-taxonomies-in-the-contentrepository)

Sitegeist.Taxonomy defines three basic node types:

- `Sitegeist.Taxonomy:Root` - The root node at the path `/`, allows only vocabulary nodes as children
- `Sitegeist.Taxonomy:Vocabulary` - The root of a hierarchy of meaning, allows only taxonomies nodes as children
- `Sitegeist.Taxonomy:Taxonomy` - An item in the hierarchy that represents a specific meaning allows only taxonomy nodes as children

```
    Sitegeist.Taxonomy:Root:
      childNodes:
        animals:
          type: 'Sitegeist.Taxonomy:Vocabulary'
```

Referencing taxonomies
----------------------

[](#referencing-taxonomies)

Since taxonomies are nodes, they are simply referenced via `reference` or `references` properties:

```
    taxonomyReferences:
      type: references
      ui:
        label: 'Taxonomy References'
        inspector:
          group: taxonomy
          editorOptions:
            nodeTypes: ['Sitegeist.Taxonomy:Taxonomy']
            startingPoint: '/'
            placeholder: 'assign Taxonomies'
```

If you want to limit the selectable taxons to a vocabulary or even a taxonomy, then you can configure a more specific startingPoint:

```
    taxonomyReferences:
      ui:
        inspector:
          editorOptions:
            startingPoint: '//animals/mammals'
```

Content-Dimensions
------------------

[](#content-dimensions)

Vocabularies and Taxonomies will always be created in all base dimensions. This way, it is ensured that they can always be referenced. The title and description of a taxons and vocabularies can be translated as is required for the project.

Querying Taxonomies
-------------------

[](#querying-taxonomies)

The flow Query operations `referenceNodes()` and `backReferenceNodes` in combination to search for documents that have similar taxons assigned.

```
similarDocuments = ${
    q(documentNode)
        .referenceNodes('taxonomyReferences')                  // the taxons the current document references
        .backReferenceNodes('taxonomyReferences')              // all nodes that reference one of the same taxons
        .filter('[instanceof Neos.Neos:Document]')             // only documents
        .remove(documentNode)                                  // but nut the current one
        .get()
    }

```

The package includes the following flowQuery operations:

- `referencedTaxonomies()`: the taxons referenced by the documents in flowQuery context
- `referencingTaxonomies()`: the documents referencing by the taxons in flowQuery context
- `subTaxonomies()` : sub-taxons of taxons in the context
- `withSubTaxonomies()`: current taxons in the context plus sub-taxons

```
similarDocuments = ${
  q(documentNode)
    .referencedTaxonomies()                                // the taxons the current document references
    .withSubTaxonomies()                                   // including all sub taxons
    .referencingTaxonomies()                               // the documents that reference the same taxons
    .remove(documentNode)                                  // but nut the current one
    .get()
  }

```

CLI Commands
------------

[](#cli-commands)

The taxonomy package includes some CLI commands for managing the taxonomies.

- `taxonomy:vocabularies` List all vocabularies
- `taxonomy:taxonomies` List taxonomies inside a vocabulary

Privileges
----------

[](#privileges)

Sitegeist.Taxonomy brings the following privilege targets to allow you to restrict read access, management and editing of taxonomies:

- `Sitegeist.Taxonomy:Module.Show` Show the backend Module and explore the existing taxonomies by default granted to Editors.
- `Sitegeist.Taxonomy:Module.ManageVocabularyActions` Add, edit and delete vocabularies. By default granted to Administrators.
- `Sitegeist.Taxonomy:Module.ManageTaxonomyActions` Add, edit and delete taxons. By default granted to Administrators.

Reading and referencing taxonomies from other nodes is currently not limited.

Extensibility
-------------

[](#extensibility)

Packages can add additional fields to the forms of taxonomies and vocabularies. To do this the following steps are required.

1. Extend the NodeTypes `Sitegeist.Taxonomy:Taxonomy` or `Sitegeist.Taxonomy:Vocabulary` in your package.
2. Add tha path to your additional `Root.fusion` to the Setting in path `Sitegeist.Taxonomy.backendModule.additionalFusionIncludePathes`.
3. In the fusion code define each field as prototype that accepts the props `name` plus `taxon` &amp; `defaultTaxon` resp. `vocabulary` &amp; `defaultVocabulary`.
4. Register addtional prototypesNames by adding them to the Settings `Sitegeist.Taxonomy.backendModule.additionalVocabularyFieldPrototypes` or `Sitegeist.Taxonomy.backendModule.additionalTaxonomyFieldPrototypes`

Contribution
------------

[](#contribution)

We will gladly accept contributions. Please send us pull requests.

License
-------

[](#license)

See [LICENSE](./LICENSE)

###  Health Score

55

—

FairBetter than 98% of packages

Maintenance61

Regular maintenance activity

Popularity42

Moderate usage in the ecosystem

Community26

Small or concentrated contributor base

Maturity77

Established project with proven stability

 Bus Factor1

Top contributor holds 75.5% 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 ~94 days

Recently: every ~14 days

Total

28

Last Release

355d ago

Major Versions

v1.4.0 → v2.0.02025-04-01

### Community

Maintainers

![](https://www.gravatar.com/avatar/1159e78bff9c03cc5ed626447ca5072097107f58af459a9b8bac8d933ba8298c?d=identicon)[wilhelm.behncke](/maintainers/wilhelm.behncke)

![](https://www.gravatar.com/avatar/829b4ccb51e8cff3c1e4b59d60cfe8d1b86f6d77fc31a6b3fc99227f432542ca?d=identicon)[mficzel](/maintainers/mficzel)

---

Top Contributors

[![mficzel](https://avatars.githubusercontent.com/u/1309380?v=4)](https://github.com/mficzel "mficzel (117 commits)")[![grebaldi](https://avatars.githubusercontent.com/u/2522299?v=4)](https://github.com/grebaldi "grebaldi (16 commits)")[![jonnitto](https://avatars.githubusercontent.com/u/4510166?v=4)](https://github.com/jonnitto "jonnitto (4 commits)")[![davidspiola](https://avatars.githubusercontent.com/u/7107011?v=4)](https://github.com/davidspiola "davidspiola (4 commits)")[![gerdemann](https://avatars.githubusercontent.com/u/690536?v=4)](https://github.com/gerdemann "gerdemann (4 commits)")[![nezaniel](https://avatars.githubusercontent.com/u/1687674?v=4)](https://github.com/nezaniel "nezaniel (3 commits)")[![radandt](https://avatars.githubusercontent.com/u/239361?v=4)](https://github.com/radandt "radandt (2 commits)")[![ahaeslich](https://avatars.githubusercontent.com/u/1756367?v=4)](https://github.com/ahaeslich "ahaeslich (2 commits)")[![DrillSergeant](https://avatars.githubusercontent.com/u/883552?v=4)](https://github.com/DrillSergeant "DrillSergeant (1 commits)")[![dogawaf](https://avatars.githubusercontent.com/u/381969?v=4)](https://github.com/dogawaf "dogawaf (1 commits)")[![hedayati-m](https://avatars.githubusercontent.com/u/66601551?v=4)](https://github.com/hedayati-m "hedayati-m (1 commits)")

---

Tags

neoscmsnodetypetaxonomy

###  Code Quality

Static AnalysisPHPStan

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/sitegeist-taxonomy/health.svg)

```
[![Health](https://phpackages.com/badges/sitegeist-taxonomy/health.svg)](https://phpackages.com/packages/sitegeist-taxonomy)
```

###  Alternatives

[shel/neos-colorpicker

A plugin for Neos CMS which provides a colorpicker editor

1494.4k6](/packages/shel-neos-colorpicker)[yoast/yoast-seo-for-neos

Yoast SEO for Neos CMS

24164.8k](/packages/yoast-yoast-seo-for-neos)[shel/neos-hyphens

A plugin for Neos CMS which provides hyphens for the inline editor

20200.7k1](/packages/shel-neos-hyphens)[techdivision/ckstyles

Neos package which enables you adding your custom style classes for the CkEditor with a simple Yaml configuration

21166.3k](/packages/techdivision-ckstyles)[psmb/flatnav

Custom navigation module for Neos CMS

2541.7k](/packages/psmb-flatnav)[kaufmanndigital/gdpr-cookieconsent

A ready-to-run package, that integrates an advanced cookie consent banner into your Neos CMS site.

2540.7k](/packages/kaufmanndigital-gdpr-cookieconsent)

PHPackages © 2026

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