Taxonomien

Auf dieser Seite

Taxonomien sind Klassifikationssysteme zur Organisation von Inhalten. EmDash enthält integrierte Kategorien und Tags und unterstützt benutzerdefinierte Taxonomien für spezialisierte Klassifikationsanforderungen.

Integrierte Taxonomien

EmDash bietet zwei Standard-Taxonomien:

TaxonomieTypBeschreibung
KategorienHierarchischVerschachtelte Klassifikation mit Eltern-Kind-Beziehungen
TagsFlachEinfache Labels ohne Hierarchie

Beide sind standardmäßig für die Posts-Sammlung verfügbar.

Begriffe verwalten

Begriff erstellen

Admin-Dashboard

  1. Gehen Sie zur Taxonomie-Seite (z.B. /_emdash/admin/taxonomies/category)

  2. Geben Sie den Begriffsnamen im Neu hinzufügen-Formular ein

  3. Setzen Sie optional:

    • Slug - URL-Identifikator (automatisch aus dem Namen generiert)
    • Übergeordnet - Für hierarchische Taxonomien
    • Beschreibung - Begriffsbeschreibung
  4. Klicken Sie auf Hinzufügen

Inhaltseditor

  1. Öffnen Sie einen Inhaltseintrag im Editor

  2. Finden Sie das Taxonomie-Panel in der Seitenleiste

  3. Aktivieren Sie bei Kategorien die Kontrollkästchen für zutreffende Begriffe oder klicken Sie auf + Neu hinzufügen

  4. Geben Sie bei Tags Tag-Namen durch Kommas getrennt ein

  5. Speichern Sie den Inhalt

API

Die folgende Anfrage erstellt einen Begriff in der category-Taxonomie:

POST /_emdash/api/taxonomies/category/terms
Content-Type: application/json
Authorization: Bearer YOUR_API_TOKEN

{
  "slug": "tutorials",
  "label": "Tutorials",
  "parentId": "term_abc",
  "description": "Anleitungen und Tutorials"
}

Begriff bearbeiten

  1. Gehen Sie zur Taxonomie-Begriffsseite

  2. Klicken Sie neben dem Begriff auf Bearbeiten

  3. Aktualisieren Sie Name, Slug, übergeordnetes Element oder Beschreibung

  4. Klicken Sie auf Speichern

Begriff löschen

  1. Gehen Sie zur Taxonomie-Begriffsseite

  2. Klicken Sie neben dem Begriff auf Löschen

  3. Bestätigen Sie die Löschung

Taxonomien abfragen

EmDash bietet Funktionen zum Abfragen von Taxonomie-Begriffen und zum Filtern von Inhalten nach Begriff.

Alle Begriffe abrufen

Rufen Sie alle Begriffe einer Taxonomie ab:

import { getTaxonomyTerms } from "emdash";

// Alle Kategorien abrufen (gibt Baumstruktur zurück)
const categories = await getTaxonomyTerms("category");

// Alle Tags abrufen (gibt flache Liste zurück)
const tags = await getTaxonomyTerms("tag");

Bei hierarchischen Taxonomien enthalten Begriffe ein children-Array:

interface TaxonomyTerm {
	id: string;
	name: string; // Taxonomie-Name ("category")
	slug: string; // Begriff-Slug ("news")
	label: string; // Anzeige-Label ("News")
	parentId?: string;
	description?: string;
	children: TaxonomyTerm[];
	count?: number; // Anzahl der Einträge mit diesem Begriff
}

Die Berechnung von count aggregiert jede Inhalts-Begriff-Zuweisung in den Sammlungen der Taxonomie, was der teuerste Teil des Aufrufs ist. Wenn Sie nur Labels und Slugs benötigen, überspringen Sie es — count wird dann aus den zurückgegebenen Begriffen weggelassen:

const tags = await getTaxonomyTerms("tag", { includeCounts: false });

Einzelnen Begriff abrufen

Das folgende Beispiel ruft einen Begriff nach Taxonomie und Slug ab:

import { getTerm } from "emdash";

const category = await getTerm("category", "news");
// Gibt TaxonomyTerm oder null zurück

Begriffe eines Eintrags abrufen

Das folgende Beispiel ruft die einem einzelnen Eintrag zugewiesenen Kategorien und Tags ab:

import { getEntryTerms } from "emdash";

// Alle Kategorien eines Posts abrufen
const categories = await getEntryTerms("posts", "post-123", "category");

// Alle Tags eines Posts abrufen
const tags = await getEntryTerms("posts", "post-123", "tag");

Inhalte nach Begriff filtern

Verwenden Sie getEmDashCollection mit dem where-Filter:

import { getEmDashCollection } from "emdash";

// Posts in der Kategorie "news"
const { entries: newsPosts } = await getEmDashCollection("posts", {
	status: "published",
	where: { category: "news" },
});

// Posts mit dem Tag "javascript"
const { entries: jsPosts } = await getEmDashCollection("posts", {
	status: "published",
	where: { tag: "javascript" },
});

Oder verwenden Sie die Komfortfunktion:

import { getEntriesByTerm } from "emdash";

const newsPosts = await getEntriesByTerm("posts", "category", "news");

Taxonomie-Seiten erstellen

Kategorie-Archiv

Erstellen Sie eine Seite, die Posts einer Kategorie auflistet:

---
import { getTaxonomyTerms, getTerm, getEmDashCollection } from "emdash";
import Base from "../../layouts/Base.astro";

export async function getStaticPaths() {
  const categories = await getTaxonomyTerms("category");

  // Hierarchischen Baum für Routing abflachen
  function flatten(terms) {
    return terms.flatMap((term) => [term, ...flatten(term.children)]);
  }

  return flatten(categories).map((cat) => ({
    params: { slug: cat.slug },
    props: { category: cat },
  }));
}

const { category } = Astro.props;

const { entries: posts } = await getEmDashCollection("posts", {
  status: "published",
  where: { category: category.slug },
});
---

<Base title={category.label}>
  <h1>{category.label}</h1>
  {category.description && <p>{category.description}</p>}
  <p>{category.count} Beiträge</p>

  <ul>
    {posts.map((post) => (
      <li>
        <a href={`/blog/${post.data.slug}`}>{post.data.title}</a>
      </li>
    ))}
  </ul>
</Base>

Tag-Archiv

Erstellen Sie eine Seite, die Posts mit einem Tag auflistet:

---
import { getTaxonomyTerms, getEmDashCollection } from "emdash";
import Base from "../../layouts/Base.astro";

export async function getStaticPaths() {
  const tags = await getTaxonomyTerms("tag");

  return tags.map((tag) => ({
    params: { slug: tag.slug },
    props: { tag },
  }));
}

const { tag } = Astro.props;

const { entries: posts } = await getEmDashCollection("posts", {
  status: "published",
  where: { tag: tag.slug },
});
---

<Base title={`Beiträge mit Tag "${tag.label}"`}>
  <h1>#{tag.label}</h1>

  <ul>
    {posts.map((post) => (
      <li>
        <a href={`/blog/${post.data.slug}`}>{post.data.title}</a>
      </li>
    ))}
  </ul>
</Base>

Kategorie-Listen-Widget

Zeigen Sie eine Liste von Kategorien mit Beitragsanzahl an:

---
import { getTaxonomyTerms } from "emdash";

const categories = await getTaxonomyTerms("category");
---

<nav class="category-list">
  <h3>Kategorien</h3>
  <ul>
    {categories.map((cat) => (
      <li>
        <a href={`/category/${cat.slug}`}>
          {cat.label} ({cat.count})
        </a>
        {cat.children.length > 0 && (
          <ul>
            {cat.children.map((child) => (
              <li>
                <a href={`/category/${child.slug}`}>
                  {child.label} ({child.count})
                </a>
              </li>
            ))}
          </ul>
        )}
      </li>
    ))}
  </ul>
</nav>

Tag-Wolke

Zeigen Sie Tags mit Größe basierend auf Nutzung an:

---
import { getTaxonomyTerms } from "emdash";

const tags = await getTaxonomyTerms("tag");

// Schriftgrößen basierend auf Anzahl berechnen
const counts = tags.map((t) => t.count ?? 0);
const maxCount = Math.max(...counts, 1);
const minSize = 0.8;
const maxSize = 2;

function getSize(count: number) {
  const ratio = count / maxCount;
  return minSize + ratio * (maxSize - minSize);
}
---

<div class="tag-cloud">
  {tags.map((tag) => (
    <a
      href={`/tag/${tag.slug}`}
      style={`font-size: ${getSize(tag.count ?? 0)}rem`}
    >
      {tag.label}
    </a>
  ))}
</div>

Begriffe auf Inhalten anzeigen

Zeigen Sie Kategorien und Tags auf einem Beitrag an:

---
import { getEntryTerms } from "emdash";

interface Props {
  collection: string;
  entryId: string;
}

const { collection, entryId } = Astro.props;

const categories = await getEntryTerms(collection, entryId, "category");
const tags = await getEntryTerms(collection, entryId, "tag");
---

<div class="post-terms">
  {categories.length > 0 && (
    <div class="categories">
      <span>Veröffentlicht in:</span>
      {categories.map((cat, i) => (
        <>
          {i > 0 && ", "}
          <a href={`/category/${cat.slug}`}>{cat.label}</a>
        </>
      ))}
    </div>
  )}

  {tags.length > 0 && (
    <div class="tags">
      {tags.map((tag) => (
        <a href={`/tag/${tag.slug}`} class="tag">
          #{tag.label}
        </a>
      ))}
    </div>
  )}
</div>

Benutzerdefinierte Taxonomien

Erstellen Sie Taxonomien über Kategorien und Tags hinaus für spezialisierte Bedürfnisse.

Benutzerdefinierte Taxonomie erstellen

Verwenden Sie die Admin-API, um eine Taxonomie zu erstellen:

POST /_emdash/api/taxonomies
Content-Type: application/json
Authorization: Bearer YOUR_API_TOKEN

{
  "name": "genre",
  "label": "Genres",
  "labelSingular": "Genre",
  "hierarchical": true,
  "collections": ["books", "movies"]
}

Benutzerdefinierte Taxonomien verwenden

Fragen Sie benutzerdefinierte Taxonomien genauso ab wie integrierte:

import { getTaxonomyTerms, getEmDashCollection } from "emdash";

// Alle Genres abrufen
const genres = await getTaxonomyTerms("genre");

// Bücher in einem Genre abrufen
const { entries: sciFiBooks } = await getEmDashCollection("books", {
	where: { genre: "science-fiction" },
});

Sammlungen zuweisen

Taxonomien spezifizieren, für welche Sammlungen sie gelten:

{
  "name": "difficulty",
  "label": "Schwierigkeitsgrade",
  "hierarchical": false,
  "collections": ["recipes", "tutorials"]
}

Taxonomie-API-Referenz

REST-Endpunkte

EndpunktMethodeBeschreibung
/_emdash/api/taxonomiesGETTaxonomie-Definitionen auflisten
/_emdash/api/taxonomiesPOSTTaxonomie erstellen
/_emdash/api/taxonomies/:name/termsGETBegriffe auflisten
/_emdash/api/taxonomies/:name/termsPOSTBegriff erstellen
/_emdash/api/taxonomies/:name/terms/:slugGETBegriff abrufen
/_emdash/api/taxonomies/:name/terms/:slugPUTBegriff aktualisieren
/_emdash/api/taxonomies/:name/terms/:slugDELETEBegriff löschen

Begriffe zu Inhalten zuweisen

Die folgende Anfrage weist einem Post Kategorie-Begriffe zu:

POST /_emdash/api/content/posts/post-123/terms/category
Content-Type: application/json
Authorization: Bearer YOUR_API_TOKEN

{
  "termIds": ["term_news", "term_featured"]
}

Nächste Schritte