Von Wordpress zu Hugo

Migration von Wordpress zu Hugo.io

Faxen dicke

Jetzt hab ich die Schnauze voll von Wordpress - mal wieder hat es ein Schlaumichel geschafft, sich in mein Wordpress einzuschleusen und Werbung einzuspielen. Und das trotz regelmäßiger Wordpress Updates.

So hab ich mich kurzerhand entschlossen, meinen Blog auf ein Hugo System zu migrieren.

Hugo Website Creator

Hugo ist ein in Go geschriebenes Tool, mit dem man in Markdown Syntax geschriebene Seiten als statische Website konvertieren lassen kann.

  • Hierbei werden automatsich Indexseiten (für das Bloglisting) erzeugt;
  • man kann Menustrukturen aufbauen
  • Es gibt einen Katalog von Themes, die man direkt nutzen kann
  • Während der Entwicklung kann Hugo als Server laufen, der die Markdown Files überwacht und Änderungen automatisch berücksichtigt (und den laufenden Browser aktualisiert

Wenn man unbedingt dynamische Seiten braucht, kann man Hugo auch auf dem Server laufen lassen; oder man hilft sich mit Tools wie formspree Ich brauch es nicht:

  • Kommentarfunktion hab ich eh schon im Wordpress abgeschaltet
  • Ein Kontaktformular brauch ich auch nicht - eine Emailadresse reicht.

Migration

Nachdem ich die ersten Posts von Hand übertragen hatte, dachte ich mir, dass es wohl auch Migrationstools geben sollte. https://gohugo.io/tools/ listet einige auf; den Wordpress 2 Hugo Exporter hatte ich ausprobiert, funktionierte aber nicht.

Also hab ich es anders gemacht:

  • Die Bilder vom Server in Hugos “static” Ordner kopiert (scp)
  • Die Beiträge über den Wordpress XML Exporter runtergeladen
  • Mit dem python wp_export_parser und einem eigenen Script das Exportfile geparsed
  • Den Content mit html2text nach Markdown konvertiert

Das ganze hab ich in Python gebastelt. Python ist nicht meine Baustelle, der Code ist bestimmt verbesserungsfähig. Aber funktioniert hats trotzdem:

from wp_export_parser import WPParser
import sys
import html2text

with open(sys.argv[1]) as export_file:
    parser = WPParser(export_file)
    domain =  parser.get_domain() # outputs www.example.com
    for p in parser.get_items():

        categories = p['categories']
        comments = p['comments']
        type = p['post_type'] #type can be 'page' or 'post'

        if type == 'post':
            filename = p['link'].replace('http://' + domain,'post')[:-1] + '.md'

            if filename.find('?p=') != -1:
                continue

            file = open (filename,'w')
            file.write('+++\n')
            file.write('categories= [' + ','.join(('"' + str(x) + '"') for x in categories) + ']\n')

            time = p['pubDate'].strftime('%Y-%m-%dT%H:%M:%S')
            file.write('date= "' + time + '"\n')
            file.write('title= "' + p['title'].encode('utf-8') + '"\n')
            file.write('+++\n')
            b = p['body'].encode('utf-8')

            b = p['body'].replace('http://detlef-huettemann.com/wp-content/uploads/', '/')
            b = html2text.html2text(b).encode('utf-8')
            file.write(b)
            file.close()