Von WordPress zu Publii: Lessons learned

Ich habe ja vor drei Wochen meine Website von WordPress zu Publii umgezogen. Das lief verblüffend schnell und glatt. Im Nachgang war aber doch noch allerhand zu tun.

  1. Ich habe sukzessive noch einige kostenlose (Core Lightbox Gallery, External Links, Security txt, Syntax Highlighter) und kostenpflichtige (Follow Buttons, Language File Editor, LLMs.txt Generator, Social Sharing, Static Search) Plugins für Publii installiert.
  2. Ich hatte sowohl eine Seite als auch einen Beitrag, die irgendwelche Code-Überbleibsel aus dem Gutenberg-Editor enthielten, an denen Publii sich beim Rendering verschluckt hat. Nachdem ich den Code im HTML-Modus jeweils händisch bereinigt hatte, gab es keinen Schluckauf mehr.
  3. Meine Links zu Videos bei YouTube und Vimeo hat der WordPress-Importer von Publii in Beiträgen nicht automatisch umgewandelt. Hier musste ich alle betroffenen Posts manuell nachbearbeiten. Dabei ist mir auch noch ein Fehler aufgefallen: Links auf YouTube-Playlists funktionieren in Publii bis zur aktuellen Version 0.47.9 nicht, wenn man die Option zur Verwendung von youtube-nocookie aktiviert hat. Das soll mit dem nächsten Update behoben werden.
  4. Die größten Probleme hat mir die Tatsache gemacht, dass ich in meinem WordPress Permalinks vom Typ Tag und Name eingestellt hatte. Damit sahen alle URLs so aus: https://teezeh.de/2026/08/15/beitragstitel/. Bei den Publii-URLs gibt es allerdings den /yyyy/mm/dd-Teil nicht, sodass alle internen Links in älteren Beiträgen kaputt waren. Dagegen hilft zum Glück der folgende Eintrag in der .htaccess (hochzuladen über den Dateimanager von Publii):
    RewriteEngine On
    RewriteRule ^[0-9]{4}/[0-9]{2}/[0-9]{2}/([^/]+)/?$ /$1/ [R=301,L,NE]
    Der freundliche Tippgeber bei GitHub hat mir sogar noch ein Python-Skript geliefert, um auch die vorhandenen Legacy-Links in der sqlite-Datenbank von Publii umzuschreiben. Der Inhalt seines Posts ist leider nicht mehr öffentlich sichtbar (ich hatte ihn zum Glück noch in der Benachrichtigungs-Mail von GitHub). Ich bin gerade noch unschlüssig, ob ich das Skript noch zusätzlich über die Datenbank laufen lasse. An und für sich reicht der Redirect.