Taxonomías

En esta página

Las taxonomías son sistemas de clasificación para organizar contenido. EmDash incluye categorías y etiquetas incorporadas, y admite taxonomías personalizadas para necesidades de clasificación especializadas.

Taxonomías incorporadas

EmDash proporciona dos taxonomías predeterminadas:

TaxonomíaTipoDescripción
CategoríasJerárquicaClasificación anidada con relaciones padre-hijo
EtiquetasPlanaEtiquetas simples sin jerarquía

Ambas están disponibles para la colección de publicaciones de forma predeterminada.

Gestión de términos

Crear un término

Admin Dashboard

  1. Vaya a la página de taxonomía (por ejemplo, /_emdash/admin/taxonomies/category)

  2. Ingrese el nombre del término en el formulario Agregar nuevo

  3. Opcionalmente configure:

    • Slug - Identificador de URL (generado automáticamente desde el nombre)
    • Padre - Para taxonomías jerárquicas
    • Descripción - Descripción del término
  4. Haga clic en Agregar

Content Editor

  1. Abra una entrada de contenido en el editor

  2. Encuentre el panel de taxonomía en la barra lateral

  3. Para categorías, marque las casillas de los términos aplicables, o haga clic en + Agregar nuevo

  4. Para etiquetas, escriba los nombres de etiquetas separados por comas

  5. Guarde el contenido

API

La siguiente solicitud crea un término en la taxonomía 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"
}

Editar un término

  1. Vaya a la página de términos de taxonomía

  2. Haga clic en Editar junto al término

  3. Actualice el nombre, slug, padre o descripción

  4. Haga clic en Guardar

Eliminar un término

  1. Vaya a la página de términos de taxonomía

  2. Haga clic en Eliminar junto al término

  3. Confirme la eliminación

Consultar taxonomías

EmDash proporciona funciones para consultar términos de taxonomía y filtrar contenido por término.

Obtener todos los términos

Recuperar todos los términos para una taxonomía:

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");

Para taxonomías jerárquicas, los términos incluyen un array 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
}

Obtener un término individual

El siguiente ejemplo obtiene un término por taxonomía y slug:

import { getTerm } from "emdash";

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

Obtener términos para una entrada

El siguiente ejemplo recupera las categorías y etiquetas asignadas a una sola entrada:

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");

Filtrar contenido por término

Use getEmDashCollection con el filtro 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" },
});

O use la función de conveniencia:

import { getEntriesByTerm } from "emdash";

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

Construir páginas de taxonomía

Archivo de categorías

Cree una página que liste las publicaciones en una categoría:

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

Archivo de etiquetas

Cree una página que liste las publicaciones con una etiqueta:

---
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 de lista de categorías

Muestre una lista de categorías con conteos de publicaciones:

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

Nube de etiquetas

Muestre etiquetas con tamaño basado en el uso:

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

Mostrar términos en el contenido

Muestre categorías y etiquetas en una publicación:

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

Taxonomías personalizadas

Cree taxonomías más allá de categorías y etiquetas para necesidades especializadas.

Crear una taxonomía personalizada

Use la API de administración para crear una taxonomía:

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

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

Usar taxonomías personalizadas

Consulte y muestre taxonomías personalizadas de la misma manera que las incorporadas:

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" },
});

Asignar a colecciones

Las taxonomías especifican a qué colecciones se aplican:

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

Referencia de API de taxonomía

Endpoints REST

EndpointMétodoDescripción
/_emdash/api/taxonomiesGETListar definiciones de taxonomía
/_emdash/api/taxonomiesPOSTCrear taxonomía
/_emdash/api/taxonomies/:name/termsGETListar términos
/_emdash/api/taxonomies/:name/termsPOSTCrear término
/_emdash/api/taxonomies/:name/terms/:slugGETObtener término
/_emdash/api/taxonomies/:name/terms/:slugPUTActualizar término
/_emdash/api/taxonomies/:name/terms/:slugDELETEEliminar término

Asignar términos al contenido

La siguiente solicitud asigna términos de categoría a una publicación:

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

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

Próximos pasos