예제
KO

택소노미

택소노미는 태그, 카테고리, 작성자 같은 그룹으로 콘텐츠를 구성합니다.

설정

config.toml에서 택소노미를 정의합니다:

[[taxonomies]]
name = "tags"
feed = true
paginate_by = 10

[[taxonomies]]
name = "categories"
feed = true

[[taxonomies]]
name = "authors"
타입 기본값 설명
name string 택소노미 이름(프론트 매터에서 사용)
feed bool false 항목별 RSS 피드 생성
sitemap bool true 택소노미 페이지를 사이트맵에 포함
paginate_by int 항목 페이지의 페이지당 항목 수
sort_by string "date" 항목 안 페이지의 정렬 기준: "date", "title", "weight" (정렬 참고)
reverse bool false sort_by가 만든 순서 뒤집기
terms_sort_by string "name" 항목 목록의 정렬 기준: "name" 또는 "count" (정렬 참고)

정렬

sort_by는 각 택소노미 항목에 속한 페이지의 순서를 결정합니다 — 생성되는 항목 페이지, get_taxonomy()term.pages, 항목별 페이지네이션 모두에 적용됩니다. 의미는 섹션 정렬과 정확히 같습니다:

sort_by 값이 잘못되면 경고를 남기고 기본값 "date"를 유지합니다.

terms_sort_by는 항목 목록의 순서를 결정합니다 — 택소노미 인덱스 페이지와 get_taxonomy().items에 적용됩니다:

항목 피드는 예외입니다. feed = true일 때 각 항목의 RSS 피드는 sort_by와 무관하게 항상 역시간순(최신 우선)을 유지합니다 — RSS 소비자는 최신 항목이 먼저 온다고 가정하기 때문입니다.

[[taxonomies]]
name = "tags"
sort_by = "title"
terms_sort_by = "count"

택소노미 사용

프론트 매터에서 항목을 지정합니다:

+++
title = "My Post"
tags = ["crystal", "tutorial"]
categories = ["Programming"]
authors = ["Alice"]
+++

Zola 스타일의 [taxonomies] 테이블도 동작합니다(두 표기는 동등하며, 둘 다 있으면 명시적인 최상위 키가 우선합니다):

+++
title = "My Post"
[taxonomies]
tags = ["crystal", "tutorial"]
tech = ["crystal", "security"]
+++

템플릿에서 페이지 자신의 항목은 page.taxonomies.<name>으로 접근합니다(예: {% for t in page.taxonomies.tech %}). section.pages, site.pages, 항목 페이지 목록 안의 페이지 객체에서도 동일하게 쓸 수 있습니다.

생성되는 URL

tags 택소노미에 crystal 항목이 있을 때:

URL 내용
/tags/ 전체 태그 목록
/tags/crystal/ "crystal" 태그가 붙은 페이지

paginate_by를 설정하면 항목 페이지가 /tags/crystal/page/2/, /tags/crystal/page/3/, … 로 페이지네이션됩니다(1페이지는 /tags/crystal/에 그대로 있습니다). 페이저 객체는 데이터 모델 › Paginator에 설명되어 있습니다.

템플릿

두 템플릿 모두 완성된 목록을 {{ content }}로 받습니다 — taxonomy.html에는 항목 목록이, taxonomy_term.html에는 페이지 목록이 들어갑니다. 커스텀 마크업이 필요하면 content 대신 get_taxonomy()를 사용합니다.

택소노미 인덱스

templates/taxonomy.html — 전체 항목 목록:

{% extends "base.html" %}

{% block content %}
<h1>{{ page.title }}</h1>
{{ content }}
{% endblock %}

커스텀 항목 목록:

{% set tax = get_taxonomy(kind=taxonomy_name) %}
<ul>
{% for term in tax.items %}
  <li>
    <a href="{{ get_taxonomy_url(kind=taxonomy_name, term=term.name) }}">
      {{ term.name }} ({{ term.count }})
    </a>
  </li>
{% endfor %}
</ul>

택소노미 항목

templates/taxonomy_term.html — 특정 항목의 페이지 목록:

{% extends "base.html" %}

{% block content %}
<h1>{{ taxonomy_name }}: {{ taxonomy_term }}</h1>
{{ content }}
{% endblock %}

커스텀 페이지 목록 — 현재 항목의 페이지를 get_taxonomy()로 조회합니다:

{% set tax = get_taxonomy(kind=taxonomy_name) %}
{% for term in tax.items if term.name == taxonomy_term %}
<ul>
{% for p in term.pages %}
  <li><a href="{{ p.url }}">{{ p.title }}</a></li>
{% endfor %}
</ul>
{% endfor %}

템플릿 변수

taxonomy.htmltaxonomy_term.html 모두에서 사용 가능:

변수 타입 설명
taxonomy_name String 택소노미 이름("tags")
taxonomy_term String 현재 항목 이름(인덱스 페이지에서는 빈 문자열)
content String 미리 렌더링된 목록 HTML(항목 또는 페이지)

항목 객체

속성 타입 설명
name String 항목 이름
slug String URL에 안전한 이름
pages Array<Page> 이 항목이 붙은 페이지
count Int 페이지 수

get_taxonomy() 함수

어디서든 택소노미 데이터에 접근합니다:

{% set tags = get_taxonomy(kind="tags") %}
{% if tags %}
<div class="tag-cloud">
{% for term in tags.items %}
  <a href="/tags/{{ term.slug }}/">{{ term.name }}</a>
{% endfor %}
</div>
{% endif %}

get_taxonomy_url() 함수

택소노미 항목의 URL을 생성합니다:

<a href="{{ get_taxonomy_url(kind='tags', term='crystal') }}">
  Crystal articles
</a>

자주 쓰는 패턴

태그 클라우드

{% set tags = get_taxonomy(kind="tags") %}
<div class="tags">
{% for term in tags.items %}
  <a href="/tags/{{ term.slug }}/" 
     class="tag count-{{ term.count }}">
    {{ term.name }}
  </a>
{% endfor %}
</div>

페이지 태그 표시

{% if page.tags %}
<div class="post-tags">
{% for tag in page.tags %}
  <a href="/tags/{{ tag | slugify }}/">{{ tag }}</a>
{% endfor %}
</div>
{% endif %}

카테고리 내비게이션

{% set categories = get_taxonomy(kind="categories") %}
<nav class="categories">
{% for cat in categories.items %}
  <a href="/categories/{{ cat.slug }}/">
    {{ cat.name }} ({{ cat.count }})
  </a>
{% endfor %}
</nav>

함께 보기