Seit einigen Jahren schon ist hungsblog unter der Top Level Domain .de verfügbar. Vor kurzem konnte ich jedoch die entsprechende .com erwerben. Ich war natürlich sehr begeistert, die Website von der einen auf die andere Domain zu migrieren und freue mich, berichten zu können, was es dabei alles zu beachten gibt.
TLDR:
Die beiden wichtigsten Punkte, die bei der WordPress-Migration einer bestehenden Website auf eine andere Domain zu beachten sind, ist die Umleitung des alten Traffics und die Umbenennung der Siteurl der neuen Website einschließlich aller Inhalte, die die alte Website erwähnten.
Disclaimer: Erstellt immer backups. Die Migration sollte auch von Personen mit entsprechendem Hintergrundwissen durchgeführt werden, da einige Änderungen nahezu irreversibel und Auswirkungen und Implikationen vom gesamten System abhängig sind.
Traffic und Server
1. Die Domain kaufen und entsprechende DNS Einträge vornehmen
2. Umleitung des Traffics von alter Domain zur Neuen
Um Google und allen anderen, die die URLs der alten Domain nutzen, mitzuteilen, dass wir auf die neue Domain gewechselt haben, müssen wir Weiterleitungen einrichten. Ein Statuscode 301 zeigt an, dass es sich um eine dauerhafte Änderung handelt. Ich verwende einen Caddy-Server und die Konfiguration ist unten dargestellt. Da WordPress ein Content Management System (CMS) ist, bleibt auch bei einer Änderung der Siteurl (z.B. von hungsblog.de zu hungsblog.com) die zugrundeliegende Pfadstruktur erhalten. Das ist auch der Grund, warum der untenstehende Code wie vorgesehen funktioniert und jede Url von einem alten Beitrag auf die korrekte neue Url umleitet.
hungsblog.de:443 {
redir https://hungsblog.com{uri} 301
}
3. Die Google Search Console benachrichtigen
Wenn ihr eure Website in der Google-Suchkonsole registriert habt, kann es sein, dass sie zunächst nicht indiziert wird, weil sie als Duplikat einer bestehenden Website erkannt wird. Dies kann unter Einstellungen > Adresse ändern geändert werden. Allerdings müssen Ihr Eigentümer beider Domains sein.
Datenbank
1. Datenbank-Backup erstellen
Die folgenden Anweisungen sollen lediglich eine Vorstellung davon vermitteln, wie das Problem des Datenbank Backups angegangen werden kann. Zuerst erstellen wir eine neue Datenbank (new_db). Dann erstellen wir einen Datenbank-Dump unserer alten Datenbank (old_db) und speisen alle SQL-Abfragen in new_db ein (siehe bitnami). Zuletzt muss dem Benutzer der WordPress-Datenbank Rechte erteilt werden, damit dieser auf new_db zugreifen kann.
##############
# The process could look like this, but you could also use a DB client of your choice.
# In my case, I use a mariadb instead of a mysql but the idea should be the same.
##############
# create new db
mariadb -u root -p -e "CREATE DATABASE new_db"
# dump (pay attention to your version, as this might be deprecated)
mysqldump -u root -p old_db > backup.sql
# restore
mariadb -u root -p new_db< backup.sql
# grant privileges
mariadb -u root -p -e "GRANT ALL PRIVILEGES ON new_db.* TO <user> "
Ganz besonders wichtig ist es vor allem, wirklich eine die Tabellen vollständige zu kopieren. Ein “CREATE TABLE AS SELECT * FROM” wird nicht ausreichen, da die notwendigen Table Constraints nicht erstellt werden. Dies wird anfangs eventuell nicht auffallen, aber als ich begann, einen neuen Beitrag zu erstellen, erhielt ich die folgende Fehlermeldung:
Warning: Attempt to read property “post_type” on null in /srv/www/wp-includes/post.php on line 7494
Warning: Attempt to read property “post_type” on null in /srv/www/wp-includes/post.php on line 7495
Warning: Attempt to read property “ID” on null in /srv/www/wp-includes/post.php on line 7499
Warning: Attempt to read property “post_type” on null in /srv/www/wp-includes/post.php on line 7754
Das Googeln des Problems brachte mir ein gutes Verständnis darüber, was der Urpsrung dieses Fehlers sein könnte (WordPress). Ich nehme an, dass WordPress beim Erstellen eines neuen Blogbeitrags eine neue Zeile in der Datenbank anlegt. Die entsprechende Tabelle hätte normalerweise eine AUTOINCREMENT-Constraint, die dann eine neue Post-ID zurückgeben würde. Unter Verwendung dieser Post-ID erstellt die WordPress-Engine ein Objekt, das alle erforderlichen Informationen zu diesem Beitrag erhalten würde. Wenn wir jedoch die Constraint nicht mit erstellen, wird keine ID generiert und nichts zurückgegeben, so dass kein Post-Objekt instanziiert werden kann und wir somit “Attempt to read property “post_type” on null “.
2. Siteurl umbenennen
Damit WordPress intern die richtige URL erstellen kann, müssen wir auch die globale Konfiguration für die Siteurl ändern. Dies kann in der Benutzeroberfläche unter Einstellungen > Allgemein oder direkt in der Datenbank erfolgen.
-- update old links
UPDATE new_db.wp_options
SET option_value = replace(option_value, 'hungsblog.de', 'hungsblog.com')
WHERE option_name = 'home' OR option_name = 'siteurl';
3. Umbenennung aller Erwähnungen der alten Domain in jeglichem Beitrag
Dies ist ein sehr wichtiger Schritt, den viele Websiten vergessen zu erwähnen, insbesondere wenn bereits WordPress Beiträge geschrieben worden sind. Obwohl sich die Siteurl geändert hat, hat sich der bereits geschriebene und in der Datenbank gespeicherte Inhalt (HTML code) nicht geändert. Besonders deutlich wird dies bei Bildern. Wenn ein Beitrag mit einem Bild geladen wird, wird das Bild höchstwahrscheinlich einen Verweis auf die alte Domain haben. Das sollte eigentlich kein Problem sein, da wir die Weiterleitung bereits eingerichtet haben, dennoch kann dies zu einer langsamen Ladegeschwindigkeit führen und unvorhergesehene Probleme mit sich führen. In meinem Fall gab es eine endlose Umleitungsschleife, wenn ich auf die Startseite gehen wollte.
Um die richtigen Tabellen zu bereinigen, referenziere ich hier templatetoaster. Die entsprechenden Anweisungen lauten wie folgt:
UPDATE hungsblog.wp_posts SET post_content = replace(post_content, 'hungsblog.de', 'hungsblog.com');
UPDATE hungsblog.wp_postmeta SET meta_value = replace(meta_value,'hungsblog.de', 'hungsblog.com');
UPDATE hungsblog.wp_usermeta SET meta_value = replace(meta_value, 'hungsblog.de', 'hungsblog.com');
UPDATE hungsblog.wp_links SET link_url = replace(link_url, 'hungsblog.de', 'hungsblog.com');
UPDATE hungsblog.wp_comments SET comment_content = replace(comment_content , 'hungsblog.de', 'hungsblog.com');
WordPress
Schließlich ist es wichtig, der WordPress-Installation mitzuteilen, welche Datenbank sie verwenden soll. Dazu bearbeiten wir die Datei wp-config.php und ersetzen die alte Datenbank durch die neue.