Taxonomias são sistemas de classificação para organizar conteúdo. O EmDash inclui categorias e tags integradas e suporta taxonomias personalizadas para necessidades de classificação especializadas.
Taxonomias integradas
O EmDash fornece duas taxonomias padrão:
| Taxonomia | Tipo | Descrição |
|---|---|---|
| Categorias | Hierárquica | Classificação aninhada com relações pai-filho |
| Tags | Plana | Rótulos simples sem hierarquia |
Ambas estão disponíveis para a coleção de posts por padrão.
Gerenciar termos
Criar um termo
Painel admin
-
Vá para a página de taxonomia (ex.
/_emdash/admin/taxonomies/category) -
Insira o nome do termo no formulário Adicionar novo
-
Opcionalmente configure:
- Slug - Identificador de URL (gerado automaticamente do nome)
- Pai - Para taxonomias hierárquicas
- Descrição - Descrição do termo
-
Clique em Adicionar
Editor de conteúdo
-
Abra uma entrada de conteúdo no editor
-
Encontre o painel de taxonomia na barra lateral
-
Para categorias, marque as caixas dos termos aplicáveis, ou clique em + Adicionar novo
-
Para tags, digite nomes de tags separados por vírgulas
-
Salve o conteúdo
API
A seguinte requisição cria um termo na taxonomia category:
POST /_emdash/api/taxonomies/category/terms
Content-Type: application/json
Authorization: Bearer YOUR_API_TOKEN
{
"slug": "tutorials",
"label": "Tutoriais",
"parentId": "term_abc",
"description": "Guias práticos e tutoriais"
} Editar um termo
-
Vá para a página de termos da taxonomia
-
Clique em Editar ao lado do termo
-
Atualize o nome, slug, pai ou descrição
-
Clique em Salvar
Excluir um termo
-
Vá para a página de termos da taxonomia
-
Clique em Excluir ao lado do termo
-
Confirme a exclusão
Consultar taxonomias
O EmDash fornece funções para consultar termos de taxonomia e filtrar conteúdo por termo.
Obter todos os termos
Recupere todos os termos de uma taxonomia:
import { getTaxonomyTerms } from "emdash";
// Obter todas as categorias (retorna estrutura de árvore)
const categories = await getTaxonomyTerms("category");
// Obter todas as tags (retorna lista plana)
const tags = await getTaxonomyTerms("tag");
Para taxonomias hierárquicas, os termos incluem um array children:
interface TaxonomyTerm {
id: string;
name: string; // Nome da taxonomia ("category")
slug: string; // Slug do termo ("news")
label: string; // Rótulo de exibição ("News")
parentId?: string;
description?: string;
children: TaxonomyTerm[];
count?: number; // Número de entradas com este termo
}
Calcular count agrega cada atribuição conteúdo-termo nas coleções da taxonomia, que é a parte mais custosa da chamada. Se você só precisa de rótulos e slugs, pule — count é então omitido dos termos retornados:
const tags = await getTaxonomyTerms("tag", { includeCounts: false });
Obter um único termo
O seguinte exemplo busca um termo por taxonomia e slug:
import { getTerm } from "emdash";
const category = await getTerm("category", "news");
// Retorna TaxonomyTerm ou null
Obter termos de uma entrada
O seguinte exemplo recupera as categorias e tags atribuídas a uma única entrada:
import { getEntryTerms } from "emdash";
// Obter todas as categorias de um post
const categories = await getEntryTerms("posts", "post-123", "category");
// Obter todas as tags de um post
const tags = await getEntryTerms("posts", "post-123", "tag");
Filtrar conteúdo por termo
Use getEmDashCollection com o filtro where:
import { getEmDashCollection } from "emdash";
// Posts na categoria "news"
const { entries: newsPosts } = await getEmDashCollection("posts", {
status: "published",
where: { category: "news" },
});
// Posts com a tag "javascript"
const { entries: jsPosts } = await getEmDashCollection("posts", {
status: "published",
where: { tag: "javascript" },
});
Ou use a função de conveniência:
import { getEntriesByTerm } from "emdash";
const newsPosts = await getEntriesByTerm("posts", "category", "news");
Construir páginas de taxonomia
Arquivo de categoria
Crie uma página que lista posts de uma categoria:
---
import { getTaxonomyTerms, getTerm, getEmDashCollection } from "emdash";
import Base from "../../layouts/Base.astro";
export async function getStaticPaths() {
const categories = await getTaxonomyTerms("category");
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>
Arquivo de tag
Crie uma página que lista posts com uma tag:
---
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 com 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>
Widget de lista de categorias
Exiba uma lista de categorias com contagem de posts:
---
import { getTaxonomyTerms } from "emdash";
const categories = await getTaxonomyTerms("category");
---
<nav class="category-list">
<h3>Categorias</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>
Nuvem de tags
Exiba tags com tamanho baseado no uso:
---
import { getTaxonomyTerms } from "emdash";
const tags = await getTaxonomyTerms("tag");
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>
Exibir termos no conteúdo
Mostre categorias e tags em um post:
---
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>Publicado em:</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>
Taxonomias personalizadas
Crie taxonomias além de categorias e tags para necessidades especializadas.
Criar uma taxonomia personalizada
Use a API admin para criar uma taxonomia:
POST /_emdash/api/taxonomies
Content-Type: application/json
Authorization: Bearer YOUR_API_TOKEN
{
"name": "genre",
"label": "Gêneros",
"labelSingular": "Gênero",
"hierarchical": true,
"collections": ["books", "movies"]
}
Usar taxonomias personalizadas
Consulte e exiba taxonomias personalizadas da mesma forma que as integradas:
import { getTaxonomyTerms, getEmDashCollection } from "emdash";
// Obter todos os gêneros
const genres = await getTaxonomyTerms("genre");
// Obter livros de um gênero
const { entries: sciFiBooks } = await getEmDashCollection("books", {
where: { genre: "science-fiction" },
});
Atribuir a coleções
Taxonomias especificam a quais coleções se aplicam:
{
"name": "difficulty",
"label": "Níveis de dificuldade",
"hierarchical": false,
"collections": ["recipes", "tutorials"]
}
Referência da API de taxonomias
Endpoints REST
| Endpoint | Método | Descrição |
|---|---|---|
/_emdash/api/taxonomies | GET | Listar definições de taxonomias |
/_emdash/api/taxonomies | POST | Criar taxonomia |
/_emdash/api/taxonomies/:name/terms | GET | Listar termos |
/_emdash/api/taxonomies/:name/terms | POST | Criar termo |
/_emdash/api/taxonomies/:name/terms/:slug | GET | Obter termo |
/_emdash/api/taxonomies/:name/terms/:slug | PUT | Atualizar termo |
/_emdash/api/taxonomies/:name/terms/:slug | DELETE | Excluir termo |
Atribuir termos ao conteúdo
A seguinte requisição atribui termos de categoria a um post:
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 passos
- Criar um blog - Usar categorias e tags em um blog
- Consultar conteúdo - Filtrar por termos de taxonomia
- Trabalhar com conteúdo - Atribuir termos no editor