Alter Kram: Wordpress zu Hugo migrieren

2017-03-25 // Tags:

Zum Bloggen habe ich schon diverse Plattformen ausprobiert. Von Wordpress.com zu Tumblr, dann Jekyll, Anchor CMS und wieder Wordpress.org. Zuletzt dann auch Ghost. Nun bin ich bei Hugo. Langsam glaube ich, dass ich die Blog-Software mehr als Selbstzweck sehe denn als Werkzeug zum Bloggen…

Doch schlussendlich habe ich meinen privaten Blog nie als Priorität gesehen. Vielmehr war es ein privates Notizbuch für diversen Krempel. Und mein Hauptaugenmerk lag auf meinem Musik-Magazin, was mittlerweile seit 10 Jahren konsequent auf Wordpress.org läuft. Auch mein neues Projekt, wieder ein Musik-Magazin, läuft ebenfalls auf dem CMS und ich habe bislang keine Ambitionen, dies zu ändern.

Irgendwann hatte ich auch mal einen klaren Schnitt gemacht. Meine zwei Identitäten auf Wordpress.com habe ich jeweils klarr mit einem Abschluss beendet und schlicht von Vorne angefangen. Mit dem Umzug zu Hugo habe ich dann erstmals den Schritt gemacht und die alten Artikel übernommen. Reclaim The Internet! Und darum ist nun meine Blog-Geschichte hier zu finden. Zugegeben, etwas bereinigt habe ich die Beiträge schon. Dumpfe, mittlerweile obsolete Linkks sind ebenso rausgeflogen, wie Beiträge über mein damaliges Hobby Skolopender, Film-Kritiken, Privat-Kram oder Artikel zum Thema Dampfen/E-Zigarette. Schlussendlich habe sind grob 230 Artikel ins Archiv gewandert und werden nicht erneut veröffentlicht. Der Fokus liegt nun hauptsächlich auf dem Thema Linux und IT.
Dennoch kann ich nun auf fast 10 Jahre Blog zurückblicken.

Dennoch bleibt die Frage: Wie lief der Umzug?

Wordpress.com zu Hugo migrieren

Es gibt Plugins, mit denen man von Wordpress leicht zu Hugo migrieren kann. Leider kann man diese Plugins nicht auf Wordpress.com installieren. Doch man kann seine Beiträge dort einfach als XML exportieren. Mit einem eigenen kleinen Python-Skript habe ich dann aus dieser Datei einzelne Markdown-Dokumente für Hugo erstellt:

#!/usr/bin/env python

import datetime
import xml.etree.ElementTree
from lxml import etree

wordpress = etree.parse('wordpress.xml').getroot()

for atype in wordpress.find('channel').findall('item'):
	if atype.find('wp:status', wordpress.nsmap).text == 'publish':
		title = atype.find('title').text
		published_at = atype.find('wp:post_date', wordpress.nsmap).text
		slug = atype.find('wp:post_name', wordpress.nsmap).text
		categories = list();
		for wp_cat in atype.findall('category'):
			categories.append(wp_cat.text)
		content = atype.find('content:encoded', wordpress.nsmap).text
		#print(title, published_at, slug, categories, content)

        	with open('output/%s.md' % slug, 'w') as post_file:
			post_file.write('+++\n')
			post_file.write('title = "%s"\n' % title.encode('utf8'))
			post_file.write('date = "%s"\n' % published_at.encode('utf8'))
			post_file.write('slug = "%s"\n' % slug.encode('utf8'))
			post_file.write('tags = [')
			for category in categories:
				post_file.write('"%s",' % category.encode('utf8'))
			post_file.write(']\n\n')
			post_file.write('+++\n\n')
			post_file.write(content.encode('utf8'))

Voraussetzung: Die exportierten Beiträge heißen wordpress.xml und es existiert ein Ordner output im gleichen Verzeichnis.

Nach Aufruf des Scripts kann man die .md-Dateien aus dem output-Verzeichnis einfach in das content/post-Verzeichnis von Hugo übernehmen.

Für mich gab es dann noch einiges an Handarbeit. Mit Regex und grep, sed oder Atom habe ich HTML zu Markdown übersetzt, interne Links von absoluten Angaben zu relativen übersetzt und Bilder entfernt, da ich diese nicht migriert hatte.
Auch die Tags habe ich von Hand angepasst. Das Skript übernimmt sowohl Schlagworte wie auch Kategorien als neue Tags. Und ich war früher etwas inflationäerer mit Schlagworten als heute. Darum bin ich die neuen Dateien alle durchgegangen und habe die Schlagworte auf das nötigste reduziert.