Zum Inhalt springen
tbsch Theme
Grundlagen

Front Matter und SEO

Das Theme liest eine ganze Reihe eigener Front-Matter-Parameter. Fast jeder hat einen globalen Default in params.yaml und lässt sich pro Seite (oder pro Sektion via cascade) überschreiben. Die Auflösung ist: Front Matter → globaler Default → Theme-Fallback.

Theme-Parameter gehören in den params:-Block

Alles, was das Theme auswertet, gehört in den params:-Block - so bleibt sichtbar, was von Hugo und was vom Theme kommt. Alle Beispiele hier zeigen es genau so.

Lesezeit & Wortzahl fehlen hier mit Absicht

Dieser Beitrag setzt showReadingTime: false und showWordCount: false im params:-Block - deshalb sind beide im Hero ausgeblendet. Bei allen anderen Beiträgen erscheinen sie.

Aufbau des Front Matter #

---
title: "Mein Beitrag"        # von Hugo gelesen
date: 2026-02-16
draft: false
description: "…"
categories: ["Funktionen"]   # Taxonomien
tags: ["hugo"]

params:                      # alles Theme-spezifische in diesen Block
  showReadingTime: false
  featureimage: titel.webp
  discovery:
    noindex: true
---

Anzeige-Schalter #

Boolesche Schalter (Default in Klammern). Ein expliziter Wert im params:-Block gewinnt - auch ein false:

params:
  showDate: true            # (an)  Veröffentlichungsdatum im Hero
  showDateUpdated: true     # (an)  "Aktualisiert"-Datum aus lastmod im Hero
  showReadingTime: true     # (an)  Lesezeit in der Meta-Zeile
  showWordCount: true       # (an)  Wortzahl in der Meta-Zeile
  showTaxonomies: true      # (an)  Tags & Kategorien im Hero
  showTableOfContents: true # (an)  schwebendes Inhaltsverzeichnis (links)
  showHeadingAnchors: true  # (an)  Direktlink-Anker an jeder Überschrift
  showAuthor: true          # (an)  Autoren-Box am Ende
  showSharingLinks: true    # (an)  Teilen-Leiste
  showComments: true        # (an)  Reaktionen/Kommentare am Ende
  showPagination: true      # (an)  vor/zurück innerhalb der Sektion
  showRelatedContent: false # (AUS) "Verwandte Beiträge" unter dem Beitrag
  showDraftLabel: true      # (an)  "Entwurf"-Badge, solange draft: true
  seriesOpened: true        # (an)  Serien-Box startet aufgeklappt

Werte-Parameter #

Parameter mit einem Wert statt eines Schalters:

params:
  # Nur diese Netzwerke in der Teilen-Leiste zeigen (Schlüssel aus
  # data/sharing.yaml); überschreibt den globalen Satz aus params.yaml.
  sharingLinks: ["bluesky", "mastodon", "email"]

  # Anzahl der "Verwandten Beiträge" (Default 3), wenn showRelatedContent an ist.
  relatedContentLimit: 5

  # Autorname NUR für die strukturierten Daten (Person/JSON-LD) dieser Seite;
  # überschreibt den Standardautor aus params.yaml.
  author: "Gastautorin"

Social-Tags fürs Cross-Posting (socialTags) #

socialTags ist keine flache Liste, sondern ein Block mit hashtags und mentions (je Netzwerk). Er wird nicht auf der Seite gerendert, sondern in den JSON Feed unter der Erweiterung _social geschrieben - von dort übernimmt ihn ein Cross-Posting-Dienst und hängt beim automatischen Posten nach Mastodon bzw. Bluesky die Hashtags und @-Erwähnungen an.

params:
  socialTags:
    hashtags:
      - SelfHosted
      - DNS
      - PiHole
    mentions:
      mastodon: ["selfhosted@lemmy.world"]
      bluesky: ["mariushosting.com"]

Titelbild (featureimage) #

Das Hero-/Titelbild löst das Theme in dieser Reihenfolge auf:

  1. params.featureimage (lokaler Pfad oder absolute URL),
  2. ein Bild namens *background*/*feature*/*cover*/*thumbnail* im Bündel,
  3. das defaultBackgroundImage aus params.yaml.
params:
  featureimage: titelbild.webp     # Bild im Beitragsbündel …
  # featureimage: https://…/og.png # … oder eine absolute URL

Der discovery-Block (Crawling, Index, Suche) #

Für SEO bringt das Theme einen eigenen discovery:-Block mit - Hugo hat dafür keine Entsprechung. Alle Schalter haben einen sinnvollen Default, du setzt nur die Abweichung:

params:
  discovery:
    noindex: true   # default false → <meta name="robots" content="noindex">
    nofollow: true  # default false → ergänzt nofollow
    sitemap: false  # default true  → Seite aus sitemap.xml entfernen
    search: false   # default true  → Seite aus der Pagefind-Suche entfernen
    llms: false     # default true  → Seite aus llms.txt entfernen

partials/seo-robots.html ist die einzige Quelle für die Robots-Direktive (Front Matter → 404 → Default index, follow); es schreibt nur die Opt-out- Tokens (noindex/nofollow), nie das implizite index, follow. Die Sitemap ist daran gekoppelt: jede noindex-Seite fällt automatisch aus der Sitemap.

Die dünnen Schlagwort-Seiten setzen genau das per cascade in content/tags/_index.md; die Rechtsseiten (siehe Datenschutz) kombinieren noindex mit search: false + llms: false und outputs: ["HTML"].

Kuratierte Schlagwort-Hubs (linkTitle + discovery) #

Eine Schlagwort-Seite ist standardmäßig dünn und noindex (die Cascade oben). Um ein Schlagwort in einen indexierbaren Evergreen-Hub zu verwandeln - eine kuratierte Landing-Page, die den Hauptbegriff besetzt, während die einzelnen Beiträge ihre Long-Tails behalten - gib dem Schlagwort ein eigenes _index.md unter content/tags/<tag>/:

# content/tags/seo/_index.md
---
title: "Suchmaschinen-Optimierung"  # <h1> der Seite + SEO-Titel
linkTitle: "seo"                    # kurzes Label in den Tag-Chips
description: "…"                    # Hero-Lede + Meta-Description
discovery:
  noindex: false                    # zurück in den Index, überschreibt die Thin-Tag-Cascade
  sitemap: true
---

Einleitungsabsatz/-absätze, gerendert über der Liste der getaggten Beiträge.

Das eigene discovery der Seite überschreibt die kind: term-Cascade aus content/tags/_index.md, sodass dieses eine Schlagwort index, follow wird und wieder in der Sitemap steht; der Body erscheint als Intro über den Beiträgen.

title vs. linkTitle

Die Tag-Chips (die #tag-Pills im Beitrags-Hero und in der /tags/-Wolke) rendern .LinkTitle, die Hub-Seite rendert .Title als ihr <h1>. So kann ein beschreibender title: "Suchmaschinen-Optimierung" die Überschrift der Seite bleiben, während linkTitle: "seo" jeden Chip als knappes #seo hält - ohne linkTitle würde der volle Titel in jeden Chip lecken. (Chips werden per CSS kleingeschrieben, linkTitle braucht also nur die Kurzform, nicht die exakte Groß-/Kleinschreibung.)

Autorenprofil (authorProfile) #

Auf einer “Über mich”-Seite sorgt authorProfile: true für ProfilePage- und Person-JSON-LD (mit sameAs-Links aus params.author.links) - siehe die Seite Über mich.

params:
  authorProfile: true

Kategorie-Icon (categoryIcon) #

Im _index.md einer Kategorie (content/categories/<name>/) bestimmt categoryIcon das Tabler-Icon, das auf der Kategorie-Karte erscheint (Default tag):

# content/categories/funktionen/_index.md
params:
  categoryIcon: rocket

Hugo-eigene Schlüssel #

Diese liest Hugo selbst, nicht das Theme:

  • title, date, lastmod, draft - Titel und Daten. lastmod wird (bei aktivem showDateUpdated) als “Aktualisiert”-Datum angezeigt.
  • description, summary - Meta-Description bzw. Lede/Teaser.
  • categories, tags, series - die drei Taxonomien des Themes.
  • translationKey - verbindet die Sprachvarianten eines Beitrags.
  • slug, url - URL-Steuerung. outputs - Ausgabeformate (z. B. nur HTML).
  • aliases - clientseitige Weiterleitungs-Stubs (automatisch noindex), praktisch für alte oder Kurz-URLs:
aliases:
  - /alte-url/
  - /l/kurzlink

Die vollständige Liste dieser Schlüssel steht in der Hugo-Dokumentation zum Front Matter.

Mitgeredet

Reaktionen

Noch keine Reaktionen - sei die/der Erste.

Weiterlesen

Verwandte Beiträge