Umzug von Jekyll zu WordPress

This post is also available in english.

Die letzten Jahre hatte ich das Blog ja in Jekyll geführt. Jekyll ist ein statischer Seitengenerator: Auf dem Server läuft dafür also keine Software, sondern ich habe ein Programm (eben Jekyll) auf meinem lokalen Rechner, wo dieses dann aus den Quelldateien für das Blog eben jenes erzeugt. Am Ende fallen da haufenweise Ordner und HTML-Dateien raus, die dann nur auf den Webserver hochgeladen werden müssen und dann für Besucher ein komplettes Blog ergeben.

Vorteile davon sind unter Anderem, dass der Webserver damit keine Ahnung hat – es müssen keine Seiten spontan für Besucher generiert werden, sondern es muss einfach nur die vorhandene HTML-Datei ausgeliefert werden. Und ich muss mir keine Sorgen um Sicherheitslücken machen, weil auf dem Webserver keine extra Software laufen muss, die Sicherheitslücken haben könnte.

Nachteilig ist dafür, dass ich nicht “mal so eben” bloggen kann. Sondern ich brauche alle Quelldateien auf einem Rechner, auf dem Jekyll installiert ist, um dann dort die HTML-Dateien bauen lassen zu können und sie dann auf den Webserver zu laden. Mit WordPress kann ich einfach das Admin-Interface im Browser aufrufen und dort einen neuen Beitrag “zusammenklicken”. Und das Argument mit den Sicherheitslücken zieht auch nicht so richtig, weil ich auf dem Server eh schon eine WordPress-Instanz betreibe, um unseren Podcast Nerd, Nerd, Nerd & Uli darüber anzubieten.

Als der Entschluss mit dem Umzug zurück von Jekyll zu WordPress getroffen war, stand für mich auch ziemlich schnell fest, dass ich die ganzen Inhalte auch wieder in WordPress haben möchte. Ich möchte hier meine über 1400 Blogeinträge haben und nicht “wieder bei Null anfangen”. Also brauchte ich eine Möglichkeit, meine Inhalte von Jekyll zurück nach WordPress zu konvertieren. Etwas fertiges konnte ich nicht finden, also habe ich meine eigene Lösung gebaut, die dann auch ziemlich gut funktionierte. Ich beschreibe sie hier, damit sie vielleicht auch für andere noch hilfreich sein kann.

Alle Dateien, die ihr dafür braucht, findet ihr in meinem Gitea. Ich möchte ganz deutlich erwähnen: Der Code ist nicht unbedingt der Schönste. Da habe ich ganz deutlich abgewogen: Ich werde den Code nie wieder verwenden und “schönerer” Code hätte mich nur Zeit gekostet, ohne weitere Vorteile zu bringen. Also blieb hässlicher, aber (für mich!) funktionierender Code übrig.

Die Konvertierung erfolgt in 5 Schritten:

  1. Export aller Beiträge in eine XML-Datei.
  2. Extrahieren der Bilder.
  3. Import der Bilder in WordPress.
  4. Anpassung der Beitrags-XML-Datei an geänderte Bild-URLs.
  5. Import der Beiträge in WordPress.

Export der Beiträge in eine XML-Datei

Im Gitea findet ihr die Datei wp_export.xml. Packt diese in euren Jekyll-Ordner und passt sie an. Die Änderungen, die ihr machen müsst, sind eigentlich alle deutlich. Ändert vor allem alle Stellen, in denen mein Name oder fabianonline.de vorkommen. 😉

Lasst anschließend Jekyll wie üblich per jekyll build laufen. Anschließend findet ihn im _site-Ordner eine wp_export.xml, die alle eure Posts enthält. Importiert diese aber noch nicht in euer WordPress-Blog.

Extrahieren der Bilder

Statt einfach alle Bilddateien in WordPress zu importieren, habe ich mich entschieden, nur die Bilder zu importieren, die auch wirklich verwendet werden. Hierfür habe ich das Script extract_media.rb geschrieben. Dieses sucht in der im vorherigen Schritt erzeugten wp_export.xml nach Bilddateien und schreibt diese in eine XML-Datei, die dann von WordPress importiert werden kann.

Ladet euch die Datei herunter und passt sie wieder an. Folgende Stellen sind dabei besonders wichtig:

images = STDIN.read.scan(/(?:src|href)="(\/uploads\/.+?)"/).to_a.map(&:first).uniq

Diese sucht nach allen src– und href-Attributen, die mit /uploads/ beginnen. Dies war für mein Blog der Fall, weil alle Dateien im Ordner uploads lagen. Bei euch kann das anders sein, also passt den Regex gegebenenfalls an.

<wp:post_date><![CDATA[1970-01-01 13:41:29]]></wp:post_date>
<wp:post_date_gmt><![CDATA[1970-01-01 12:41:29]]></wp:post_date_gmt>

In diesem Block wird ein fester Zeitpunkt am 1. Januar 1970 verwendet. Warum nicht das Erstelldatum der Datei oder ähnliches verwenden? Weil WordPress die Dateien beim Import abhängig vom Datum in Ordner packt. Das könnte dazu führen, dass die Dateien an einem uns unbekannten Ort landen (beispielsweise bei Dateien rund um Mitternacht am Monatswechsel). Deshalb verwende ich hier fest den 1.1.1970.

<wp:attachment_url><![CDATA[https://blog.fabianonline.de#{path}]]></wp:attachment_url>

Dieser Block gibt den Pfad an, unter dem die Datei aktuell noch (!) erreichbar ist.

Führt nun das Skript aus und übergebt ihm die wp_export.xml aus Schritt 1:

ruby extract_media.rb < wp_export.xml > wp_media.xml

Das Skript erzeugt euch so eine wp_media.xml, welche die Infos zu den Anhängen enthält.

Import der Bilder in WordPress

Die Bilder können jetzt schonmal in WordPress importiert werden. Begebt euch im WordPress-Admin-Bereich zu “Werkzeuge > Daten importieren” und wählt dort den “Wordpress Importer” aus. Hier wählt ihr dann die wp_media.xml aus und startet den Import per “Datei hochladen und importieren”. Im folgenden Schritt lasst alle Dateien eurem Benutzer zuweisen und aktiviert die Option “Anhänge importieren”. Nun wird WordPress alle Dateien laden und importieren.

Anpassung der Beiträge an geänderte Bild-URLs

Höchstwahrscheinlich sind die Pfade zu den Bildern bei WordPress anders als bei eurem Jekyll-Blog. WordPress erlaubt keine eigenen Ordner und legt die Dateien fest in einem Pfad nach dem Schema wp-content/uploads/<JAHR>/<MONAT>/<DATEINAME> ab. Bei Multisite-Blogs (wie meinem) wird es sogar wp-content/uploads/sites/<SITE_ID>/<JAHR>/<MONAT>/<DATEINAME>. Also müssen in der wp_export.xml die Pfade zu den Bildern korrigiert werden. Dabei hilft euch das Skript finalize_export.rb. Achtet hierbei zunächst auf den Block, der wie schon in der extract_media.rb die Pfade extrahiert.

data = data.gsub("=&quot;#{path}&quot;", "=&quot;/wp-content/uploads/sites/5/1970/01/#{File.basename(path)}&quot;")

Obige Zeile ändert die Pfade zu den Bilddateien. Da wir in extract_media.rb das Datum auf den 1.1.1970 festgesetzt hatten, landen alle Dateien im Ordner /1970/01/.

Zudem entfernt das Skript alle Newlines aus den Beiträgen. Absätze sind da eh schon als <p>-Elemente enthalten. Zusätzliche Newlines hätten dann nur den Effekt, dass der Beitragstext komisch umgebrochen ist.

Ruft das Skript auf, indem ihr im den Inhalt der wp_export.xml übergebt:

ruby finalize_export.rb < wp_export.xml > wp_posts.xml

Es entsteht die Datei wp_posts.xml.

Import der Beiträge in WordPress

Dieser Schritt funktioniert quasi so, wie der Import der Bilder: Ruft wieder den “Wordpress Importer” auf und wählt diesmal die Datei wp_posts.xml aus. Weist die Posts wieder einem Benutzer zu. Achtet diesmal darauf, dass die Option “Anhänge importieren” ausgeschaltet ist. Die Medien haben wir ja schon importiert. Nochmal ist das nicht nötig und würde wegen der geänderten Pfade eh nicht mehr funktionieren.

Das war’s. Jetzt solltet ihr alle eure Beiträge in WordPress haben.

Falls es nicht richtig geklappt haben sollte, weil ihr eine Datei nicht korrekt angepasst hattet oder so, ist das Plugin Bulk Delete übrigens sehr praktisch, um schnell alle Posts wieder löschen und nochmal von Vorne anfangen zu können.

Ein Gedanke zu „Umzug von Jekyll zu WordPress“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.