{"id":9146,"date":"2024-02-22T09:34:20","date_gmt":"2024-02-22T08:34:20","guid":{"rendered":"https:\/\/www.wegneronline.com\/blog\/?p=9146"},"modified":"2024-02-22T09:34:20","modified_gmt":"2024-02-22T08:34:20","slug":"migration-von-serendipity-zu-wordpress","status":"publish","type":"post","link":"https:\/\/www.wegneronline.com\/blog\/2024\/02\/22\/migration-von-serendipity-zu-wordpress\/","title":{"rendered":"Migration von Serendipity zu WordPress"},"content":{"rendered":"\n<p>Mein Blog lief bis gestern mit dem eher unbekannten CMS <a href=\"https:\/\/docs.s9y.org\/\">Serendipity<\/a>, welches nicht nur unn\u00f6tig kompliziert zu buchstabieren ist, sondern ein funktionell ziemlich rudiment\u00e4res, aber daf\u00fcr stabiles Blog-System bietet. Au\u00dferdem ist die Entwicklungsgeschichte richtig spannend! <\/p>\n\n\n\n<p>Durch verschiedene PHP-Versionen und Serverumz\u00fcge hat es mich begleitet, dabei aber immer weitere Bugs und Inkompatibilit\u00e4ten erzeugt. Zum Schluss konnte ich keine Bilder mehr hochladen &#8211; Ursache unbekannt, der Image Picker wurde mit einer leeren Seite ausgeliefert. Troubleshooting einer Serendipity-Installation ist furchtbar.<\/p>\n\n\n\n<p>Da <a href=\"https:\/\/www.wordpress.org\">WordPress<\/a> inzwischen ziemlich komfortabel geworden ist und sich zu sowas wie einem Industriestandard (<a href=\"https:\/\/www.mobiloud.com\/blog\/wordpress-market-share\">43% aller Webseiten laufen angeblich heute mit WordPress!<\/a>) entwickelt hat, war es Zeit, zu wechseln. Auch wenn ich mit der Plugin- und Theme-Flut nicht zufrieden bin: Eine WP-Seite, die heute l\u00e4uft, ist morgen mangels Maintenance schon out-of-date. Oh well&#8230; das ist wohl der Preis des Fortschritts.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Doch wie bekommt man die Inhalte von einem unbekannten, <a href=\"https:\/\/nureinblog.at\/6386-warum-ich-zu-wordpress-gewechselt-bin\">nur durch eine Hand voll Developer gepflegten<\/a> CMS, bei dem links und rechts<a href=\"https:\/\/s9ycamp.info\/archives\/31-Offizielles-Ende-von-S9yCamp.html\"> die Projekte eingestellt<\/a> werden, und f\u00fcr das <a href=\"https:\/\/docs.s9y.org\/docs\/developers\/developing.html\">nur ein Hauch an Doku<\/a> existiert in ein super popul\u00e4res, flashy shiny fancy CMS migriert?<\/p>\n\n\n\n<p>Es wird komplex.<\/p>\n\n\n\n<p>Es gibt ein Migrationsplugin namens <a href=\"https:\/\/github.com\/ShakataGaNai\/s9y-to-wp\">s9y-to-wp<\/a>, welches jedoch seit 2011 brach liegt (was auch einiges \u00fcber den Status von Serendipity aussagt). Dieses kann als Basis genutzt werden.<\/p>\n\n\n\n<p>Dank eines ebenfalls <a href=\"https:\/\/duesiblog.de\/2022\/12\/migrating-from-serendipity-s9y-to-wordpress\/\">hilfreichen Blog-Posts von Matthias D\u00fcsi<\/a> k\u00f6nnen einige Klippen schon direkt umschifft werden: Die dort erw\u00e4hnten Workarounds kann ich so nur best\u00e4tigen. <\/p>\n\n\n\n<p>Die Installationsanleitung des Plugins ist allerdings Lichtjahre out of date, und ich habe zus\u00e4tzlich zu den Themen im D\u00fcsiblog weitere Probleme gehabt, daher beschreibe ich im Vorgehen im Folgenden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die Basics<\/h2>\n\n\n\n<p>Ihr braucht Zugriff auf die alte Serendipity-Datenbank, sowie ein frisch installiertes WordPress &#8211; m\u00f6glichst sollte die neue Installation von WP im gleichen Pfad sein, wie die alte S9Y-Installation, das macht es sp\u00e4ter einfacher. Also einfach den alten S9Y-Ordner umbenennen, WP in den Ordner installieren, und den Inhalt des Ordners &#8222;\/uploads&#8220; aus dem alten Verzeichnis nach &#8222;\/wp-content\/uploads&#8220; schieben.<\/p>\n\n\n\n<p>Dann in der neuen WP-Installation unter &#8222;\/wp-content\/plugins&#8220; einen Ordner &#8222;s9y-to-wp&#8220; anlegen und dort die <a href=\"https:\/\/github.com\/ShakataGaNai\/s9y-to-wp\/blob\/master\/serendipity.php\">serendipity.php<\/a> hineinlegen. Die Zeile mit den Magic Quotes wie beim D\u00fcsiblog beschrieben \u00e4ndern\/l\u00f6schen.<\/p>\n\n\n\n<p>In WP kann nun unter &#8222;Plugins&#8220; das entsprechende &#8222;Serendipity to WordPress Importer&#8220;-Plugin aktiviert werden, woraufhin in der Men\u00fcbar der gleichnamige Punkt auftaucht.<\/p>\n\n\n\n<p>Dann dem ersten Teil der Installationsanleitung des Plugins folgen und folgendes SQL in der frisch installierten WP-Datenbank ausf\u00fchren:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><code>TRUNCATE wp_posts;<\/code><br><code>TRUNCATE `wp_postmeta`;<\/code><br><code>TRUNCATE `wp_term_relationships`;<\/code><br><code>TRUNCATE `wp_term_taxonomy`;<\/code><br><code>TRUNCATE `wp_comments`;<\/code><br><code>TRUNCATE `wp_commentmeta`;<\/code><br><code>DELETE FROM wp_terms WHERE wp_terms.term_id!=1;<\/code><\/p>\n<\/blockquote>\n\n\n\n<p>Dann den Assistenten des Plugins im WP-Backend durchklicken.<\/p>\n\n\n\n<p>Anschlie\u00dfend gibt es wieder ein paar SQL-Befehle f\u00fcr die WP-Datenbank, welche <em>theoretisch<\/em> die Zuordnungen und Indexes intern korrigieren soll. Das hat bei mir \u00fcberhaupt nicht gut funktioniert und ich denke, dass hier einiges an Inkompatibilit\u00e4t mit dem inzwischen deutlich anders funktionierenden Datenmodell von WP besteht. <\/p>\n\n\n\n<p>Sei&#8217;s drum, folgendes SQL:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><code>UPDATE `wp_comments` as a SET a.`comment_post_ID`= (SELECT b.`menu_order` FROM `wp_posts` as b WHERE a.`comment_post_ID`= b.`ID`);<\/code><br><code>UPDATE `wp_term_relationships` SET `object_id`=`object_id`+9000;<\/code><br><code>UPDATE `wp_term_relationships` as a SET a.`object_id`= (SELECT b.`menu_order` FROM `wp_posts` as b WHERE a.`object_id`-9000= b.`ID`);<\/code><br><code>UPDATE `wp_posts` SET `ID`=`ID`+9000;<\/code><br><code>SELECT `id`+1 FROM `wp_posts` ORDER BY `id` DESC LIMIT 0,1;<\/code><br><code>ALTER TABLE `wp_posts` AUTO_INCREMENT = XXX; -- Where XXX is the value returned from the select above<\/code><\/p>\n<\/blockquote>\n\n\n\n<p>Der Block, mit dem die &#8222;menu_order&#8220; f\u00fcr &#8222;wp_posts&#8220;-Eintr\u00e4ge gesetzt wird (habe ich oben direkt weg gelassen) funktioniert nicht und scheitert mit einer entsprechenden Fehlermeldung, dass &#8222;menu_order&#8220; nicht NULL sein kann. Da dieses Feld auch nur die Anzeigereihenfolge der Posts in einem theoretischen Men\u00fc steuert &#8211; und wir nur Beitr\u00e4ge, aber keine Seiten importieren und Beitr\u00e4ge keine &#8222;menu_order&#8220; haben &#8211; kann man das getrost ignorieren.<\/p>\n\n\n\n<p>Schwieriger wird es tats\u00e4chlich bei den Post-IDs, die +9000 gez\u00e4hlt werden. Das ist schon wild, zumal wir die &#8222;comment_post_ID&#8220; im ersten Befehl bereits gesetzt haben. Die Logik ist mir hier nicht ganz klar, aber mir hat es die Zuordnung der Kommentare zu den Posts damit zerschossen. Die mussten dann wieder korrekt zugeordnet werden&#8230; in meinem Fall manuell, da es nicht so viele Kommentare sind. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nacharbeiten<\/h2>\n\n\n\n<p>Au\u00dferdem schwierig ist, dass WP inzwischen auch Entw\u00fcrfe, Teile von Einstellungen usw. in der Tabelle &#8222;wp_posts&#8220; speichert. Das sorgt daf\u00fcr, dass teilweise w\u00e4hrend des Imports einzelne Eintr\u00e4ge &#8222;dazwischengeklemmt&#8220; werden und das einfache Hochz\u00e4hlen nicht mehr ganz stimmt. Was da unter der Motorhaube passiert, wei\u00df ich nicht genau. Aber Posts mit der ID &#8222;5&#8220; in S9Y waren schlussendlich nicht &#8222;9005&#8220;, sondern oftmals um ein oder zwei versetzt. <\/p>\n\n\n\n<p>An sich st\u00f6rt das nicht, au\u00dfer man hat die Post-ID in den Permalinks inkludiert. Das war bei mir kein Problem, daher habe ich das entschieden. Die &#8222;comment_post_ID&#8220; musste ich sowieso manuell nachziehen, also war das an der Stelle dann auch egal<\/p>\n\n\n\n<p>Die Posts selbst haben keinerlei Kategoriezuweisung mehr gehabt. Auch das kann nicht automatisch nachgezogen werden, weil die Zuweisung einfach als &#8222;0&#8220; gesetzt wird. Die Plugin-Doku sagt dazu:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>After the import, you&#8217;ll need to edit one of the categories (just open and save it) to fix the hierarchy.<\/p>\n<\/blockquote>\n\n\n\n<p>N\u00f6. Funktioniert nicht. Die Kategorien werden aber &#8222;flat&#8220; in WP angelegt, sodass man im Backend mit der Massenbearbeitung von Posts das ganz gut in den Griff bekommt. Eine m\u00f6gliche Hierarchie kann man dann h\u00e4ndisch wieder anlegen.<\/p>\n\n\n\n<p>Damit Bilder und andere Medien angezeigt werden, gen\u00fcgt ein einfacher SQL-Search\/Replace auf &#8222;\/uploads&#8220; im besten Fall aus:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>UPDATE wp_posts<br>SET post_content = REPLACE(post_content, &#8218;\/uploads&#8216;, &#8218;\/wp-content\/uploads&#8216;);<\/p>\n<\/blockquote>\n\n\n\n<p>Dann werden die Bilder und alle anderen Medien wieder angezeigt. Der Vorteil an S9Y ist, dass hier Medien als HTML eingebunden wurden und WP damit auch zurecht kommt. Im Backend werden ggf. nur HTML-Bl\u00f6cke angezeigt, aber da bestehende Artikel nicht oft noch mal bearbeitet werden, war das f\u00fcr mich in Ordnung und das bleibt jetzt so.<\/p>\n\n\n\n<p>Und damit ist die Migration an sich erstmal abgeschlossen. Ein bisschen Aufr\u00e4umarbeiten sind dennoch notwendig &#8211; &#8222;more&#8220;-Tags, kleinere Design-Problemchen durch die HTML-Bl\u00f6cke, etc. <\/p>\n\n\n\n<p>Es ist schon eine etwas hemds\u00e4rmelige, rudiment\u00e4re Migration. <\/p>\n\n\n\n<p>Aber immerhin: Der Inhalt ist da \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mein Blog lief bis gestern mit dem eher unbekannten CMS Serendipity, welches nicht nur unn\u00f6tig kompliziert zu buchstabieren ist, sondern ein funktionell ziemlich rudiment\u00e4res, aber daf\u00fcr stabiles Blog-System bietet. Au\u00dferdem ist die Entwicklungsgeschichte richtig spannend! Durch verschiedene PHP-Versionen und Serverumz\u00fcge hat es mich begleitet, dabei aber immer weitere Bugs und Inkompatibilit\u00e4ten erzeugt. Zum Schluss konnte &hellip; <a href=\"https:\/\/www.wegneronline.com\/blog\/2024\/02\/22\/migration-von-serendipity-zu-wordpress\/\" class=\"more-link\"><span class=\"screen-reader-text\">Migration von Serendipity zu WordPress<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-9146","post","type-post","status-publish","format-standard","hentry","category-5-informatik"],"_links":{"self":[{"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/posts\/9146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/comments?post=9146"}],"version-history":[{"count":1,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/posts\/9146\/revisions"}],"predecessor-version":[{"id":9147,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/posts\/9146\/revisions\/9147"}],"wp:attachment":[{"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/media?parent=9146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/categories?post=9146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/tags?post=9146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}