Skip to content

#[AsTaxonomy] ​

Register a class as a custom WordPress taxonomy.

Signature ​

php
#[Attribute(Attribute::TARGET_CLASS)]
final readonly class AsTaxonomy
{
    public function __construct(
        public string $name,
        public array $postTypes = [],
        public ?string $singular = null,
        public ?string $plural = null,
        public bool $public = true,
        public bool $hierarchical = false,
        public bool $showInRest = true,
        public bool $showAdminColumn = true,
        public ?string $rewriteSlug = null,
        public array $labels = [],
        public array|false|null $rewrite = null,
    ) {}
}

Parameters ​

ParameterTypeDefaultDescription
namestring—Taxonomy slug (required)
postTypesstring[][]Associated post type slugs
singular?stringnullSingular label
plural?stringnullPlural label
publicbooltrueWhether publicly visible
hierarchicalboolfalseHierarchical like categories
showInRestbooltrueEnable REST API and Gutenberg
showAdminColumnbooltrueShow column in admin post list
rewriteSlug?stringnullCustom URL slug (shorthand for rewrite)
labelsarray<string, string>[]Custom labels (merged with auto-generated ones)
rewritearray|false|nullnullFull rewrite config, false to disable, or null

Usage ​

Basic Taxonomy ​

php
<?php

namespace App\Taxonomies;

use Studiometa\Foehn\Attributes\AsTaxonomy;
use Timber\Term;

#[AsTaxonomy(
    name: 'product_category',
    postTypes: ['product'],
    singular: 'Category',
    plural: 'Categories',
    hierarchical: true,
)]
final class ProductCategory extends Term {}

Tag-style Taxonomy ​

php
#[AsTaxonomy(
    name: 'product_tag',
    postTypes: ['product'],
    singular: 'Tag',
    plural: 'Tags',
    hierarchical: false,
)]
final class ProductTag extends Term {}

Shared Taxonomy ​

php
#[AsTaxonomy(
    name: 'location',
    postTypes: ['event', 'team', 'office'],
    singular: 'Location',
    plural: 'Locations',
)]
final class Location extends Term {}

With Advanced Configuration ​

Implement ConfiguresTaxonomy for full control:

php
<?php

namespace App\Taxonomies;

use Studiometa\Foehn\Attributes\AsTaxonomy;
use Studiometa\Foehn\Contracts\ConfiguresTaxonomy;
use Studiometa\Foehn\PostTypes\TaxonomyBuilder;
use Timber\Term;

#[AsTaxonomy(
    name: 'skill',
    postTypes: ['team'],
    singular: 'Skill',
    plural: 'Skills',
)]
final class Skill extends Term implements ConfiguresTaxonomy
{
    public static function configureTaxonomy(TaxonomyBuilder $builder): TaxonomyBuilder
    {
        return $builder
            ->setCapabilities([
                'manage_terms' => 'manage_skills',
                'edit_terms' => 'edit_skills',
                'delete_terms' => 'delete_skills',
                'assign_terms' => 'assign_skills',
            ]);
    }
}

Released under the MIT License.