Taxonomies

Sur cette page

Les taxonomies sont des systèmes de classification pour organiser le contenu. EmDash inclut des catégories et des étiquettes intégrées, et prend en charge des taxonomies personnalisées pour des besoins de classification spécialisés.

Taxonomies intégrées

EmDash fournit deux taxonomies par défaut :

TaxonomieTypeDescription
CatégoriesHiérarchiqueClassification imbriquée avec relations parent-enfant
ÉtiquettesPlateÉtiquettes simples sans hiérarchie

Les deux sont disponibles pour la collection de publications par défaut.

Gestion des termes

Créer un terme

Admin Dashboard

  1. Accédez à la page de taxonomie (par exemple, /_emdash/admin/taxonomies/category)

  2. Entrez le nom du terme dans le formulaire Ajouter nouveau

  3. Définissez éventuellement :

    • Slug - Identifiant d’URL (généré automatiquement à partir du nom)
    • Parent - Pour les taxonomies hiérarchiques
    • Description - Description du terme
  4. Cliquez sur Ajouter

Content Editor

  1. Ouvrez une entrée de contenu dans l’éditeur

  2. Trouvez le panneau de taxonomie dans la barre latérale

  3. Pour les catégories, cochez les cases des termes applicables, ou cliquez sur + Ajouter nouveau

  4. Pour les étiquettes, tapez les noms d’étiquettes séparés par des virgules

  5. Enregistrez le contenu

API

La requête suivante crée un terme dans la taxonomie category :

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

{
  "slug": "tutorials",
  "label": "Tutorials",
  "parentId": "term_abc",
  "description": "How-to guides and tutorials"
}

Modifier un terme

  1. Accédez à la page des termes de taxonomie

  2. Cliquez sur Modifier à côté du terme

  3. Mettez à jour le nom, le slug, le parent ou la description

  4. Cliquez sur Enregistrer

Supprimer un terme

  1. Accédez à la page des termes de taxonomie

  2. Cliquez sur Supprimer à côté du terme

  3. Confirmez la suppression

Interroger les taxonomies

EmDash fournit des fonctions pour interroger les termes de taxonomie et filtrer le contenu par terme.

Obtenir tous les termes

Récupérer tous les termes d’une taxonomie :

import { getTaxonomyTerms } from "emdash";

// Get all categories (returns tree structure)
const categories = await getTaxonomyTerms("category");

// Get all tags (returns flat list)
const tags = await getTaxonomyTerms("tag");

Pour les taxonomies hiérarchiques, les termes incluent un tableau children :

interface TaxonomyTerm {
	id: string;
	name: string; // Taxonomy name ("category")
	slug: string; // Term slug ("news")
	label: string; // Display label ("News")
	parentId?: string;
	description?: string;
	children: TaxonomyTerm[];
	count?: number; // Number of entries with this term
}

Obtenir un terme unique

L’exemple suivant récupère un terme par taxonomie et slug :

import { getTerm } from "emdash";

const category = await getTerm("category", "news");
// Returns TaxonomyTerm or null

Obtenir les termes d’une entrée

L’exemple suivant récupère les catégories et étiquettes attribuées à une seule entrée :

import { getEntryTerms } from "emdash";

// Get all categories for a post
const categories = await getEntryTerms("posts", "post-123", "category");

// Get all tags for a post
const tags = await getEntryTerms("posts", "post-123", "tag");

Filtrer le contenu par terme

Utilisez getEmDashCollection avec le filtre where :

import { getEmDashCollection } from "emdash";

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

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

Ou utilisez la fonction de commodité :

import { getEntriesByTerm } from "emdash";

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

Créer des pages de taxonomie

Archive de catégories

Créez une page qui liste les publications dans une catégorie :

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

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

  // Flatten hierarchical tree for routing
  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} posts</p>

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

Archive d’étiquettes

Créez une page qui liste les publications avec une étiquette :

---
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={`Posts tagged "${tag.label}"`}>
  <h1>#{tag.label}</h1>

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

Widget liste de catégories

Affichez une liste de catégories avec le nombre de publications :

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

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

<nav class="category-list">
  <h3>Categories</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>

Nuage d’étiquettes

Affichez les étiquettes avec une taille basée sur l’utilisation :

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

const tags = await getTaxonomyTerms("tag");

// Calculate font sizes based on count
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>

Afficher les termes sur le contenu

Affichez les catégories et étiquettes sur une publication :

---
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>Posted 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>

Taxonomies personnalisées

Créez des taxonomies au-delà des catégories et des étiquettes pour des besoins spécialisés.

Créer une taxonomie personnalisée

Utilisez l’API d’administration pour créer une taxonomie :

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

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

Utiliser des taxonomies personnalisées

Interrogez et affichez les taxonomies personnalisées de la même manière que les taxonomies intégrées :

import { getTaxonomyTerms, getEmDashCollection } from "emdash";

// Get all genres
const genres = await getTaxonomyTerms("genre");

// Get books in a genre
const { entries: sciFiBooks } = await getEmDashCollection("books", {
	where: { genre: "science-fiction" },
});

Attribuer aux collections

Les taxonomies spécifient à quelles collections elles s’appliquent :

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

Référence de l’API de taxonomie

Points de terminaison REST

EndpointMéthodeDescription
/_emdash/api/taxonomiesGETLister les définitions de taxonomie
/_emdash/api/taxonomiesPOSTCréer une taxonomie
/_emdash/api/taxonomies/:name/termsGETLister les termes
/_emdash/api/taxonomies/:name/termsPOSTCréer un terme
/_emdash/api/taxonomies/:name/terms/:slugGETObtenir un terme
/_emdash/api/taxonomies/:name/terms/:slugPUTMettre à jour un terme
/_emdash/api/taxonomies/:name/terms/:slugDELETESupprimer un terme

Attribuer des termes au contenu

La requête suivante attribue des termes de catégorie à une publication :

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

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

Prochaines étapes