Hugo: Warnung für alten Content

In meinem alten Blog wollte ich schon immer eine Warnung für Content, der älter als ein Jahr ist. Es gibt zwar ein paar Plugins dafür, aber die machten nicht das was ich wollte und eins anpassen entpuppte sich als ziemlich nervenaufteibend.
Mit dem Umzug auf Hugo und der Anpassung des Hyde-X Themes habe ich nun die Funktion gebaut: Nur bei Blogposts, die älter als ein Jahr sind soll eine Warnung erscheinen.

Generelle Funktionsweise

Wenn die aktuelle Seite vom Typ post ist und der Inhalt älter als ein Jahr ist, dann soll eine Warnung ausgegeben werden, dass der Inhalt möglicherweise nicht mehr aktuell ist. Bei jedem kompilieren der Webseite muss also für jeden Post folgendes geprüft werden:

Wenn "Aktuelles Datum" - "Post Datum" > 356 Tage
Dann: Setze den Warntext
Ansonsten: Mache nichts

Implementierung

Die Implementierung passiert im Theme. Öffne dazu die Datei, die einen einzelnen Post anzeigt.
Als erstes holt man sich das aktuelle Datum und speichert sich das in eine Variable mit dem Namen $currentTime:

{{ $currentTime := (time now) }}

Die Time Funtion ist hier in den Docs genauer beschrieben. now ist ebenfalls eine Funktion (ebenfalls in den Docs) und gibt das aktuelle Datum mit Uhrzeit zurück. Jeder Post sollte ein Attribut date haben. In diesem steht das Veröffentlichungsdatum des Posts. Substrahiert man die aktuelle Zeit mit dem Veröffentlichungskeitsdatum (Variable: .Date) hat man ein Zeitdelta.

{{ $delta := $currentTime.Sub (time .Date ) }}

In der Variable $delta sind nun einige Deltas vorhanden. In $delta.Hours stehen zum Beispiel die Differenz in Stunden. Nun vergleicht man einfach die Stunden-Differenz mit 8760. Warum 8760? Weil 24 Stunden * 365 Tage = 8760. Wenn man seine eigene Zeitspanne definieren will, dann ist das die richtige Stelle dafür.

{{ if gt $delta.Hours 8760 }}
<span class="postAgeWarning">
    Achtung! Dieser Artikel ist älter als ein Jahr. Der Inhalt ist möglicherweise nicht mehr aktuell!
</span>
{{ end }}

Wenn also der Post älter als ein Jahr ist, dann wird ein <span>-Block ins HTML eingepflegt. Dieser hat die Klasse postAgeWarning, damit man im CSS darauf referenzieren kann. Mein CSS Block sieht zum Beispiel aktuell so aus:

.postAgeWarning {
    display: block;
    border-style: none double none double;
    border-color: red;
    padding: 1em;
    margin-bottom: 2em;
}

Der gesamte Codeblock:

<!-- Display warning when the post is older than a year -->
{{ if eq .Type "post" }}
    {{ $currentTime := (time now) }}
    {{ $delta := $currentTime.Sub (time .Date ) }}
    {{ if gt $delta.Hours 8760 }}
    <span class="postAgeWarning">
        Achtung! Dieser Artikel ist älter als ein Jahr. Der Inhalt ist möglicherweise nicht mehr aktuell!
    </span>
    {{ end }}
{{ end }}

Ich bin mir sicher, dass man das auch kürzer hinbekommt, aber für mich als Neuling ist das erstmal ausreichend.

Ein Beispiel wie das aussieht kann hier gefunden werden.

Mögliche Weiterentwicklung

Eine denkbare und mögliche Weiterentwicklung könnte sein, dass die Warnung nur ausgegeben wird, wenn der Artikel quasi mit einem gewissen Parameter ausgestattet ist. Zum Beispiel setzt man in einem Artikel, um den es um Verschlüsselung geht die Variable contentCanExpire auf true. Beim kompilieren der Seite wird dann geschaut, ob diese Variable existiert und auf true steht und nur dann wird die Altersprüfung durchgeführt.

Bei Posts, die kein digitales Verfallsdatum haben wird die Datumsrechnerei gar nicht erst durchgeführt.

Further Reading


Du hast einen Kommentar, einen Wunsch oder eine Verbeserung? Schreib mir doch eine E-Mail! Die Infos dazu stehen hier.

🖇️ = Link zu anderer Webseite
🔐 = Webseite nutzt HTTPS (verschlüsselter Transportweg)
Zurück