Seite wählen

Kopieren der WordPress-Dateien

Klar kann man die gesamten WordPress-Dateien per FTP herunter und wieder rauf laden. In vielen Fällen bleibt einem keine andere Wahl und FTP ist der Weg zum Ziel. Besser ist natürlich SFTP, welches mit einer verschlüsselten Verbindung arbeitet. SFTP hat vor allem auch den Vorteil, dass es ein stabileres Protokoll ist und es wesentlich weniger Übertragungsfehler gibt. Das macht sich bei Datenmengen und vielen Dateien dann doch schon bemerkbar. Also überlege es dir vielleicht nicht doch SFTP zu benutzen, die meisten Hoster bieten es ja mittlerweile an.

SFTP funktioniert Grunde wie FTP nur über Port 22 statt Port 21 und ist verschlüsselt. Der FTP Client, ich bevorzuge Filezilla weil es Opensource ist und aktiv weiterentwickelt wird, gibt bei der Verbindung dann meist noch eine Anzeige zur Bestätigung der Schlüsseldaten aus. Also nicht wundern, wenn auf einmal ganz viele hexadezimale Zeichen auftauchen sollten, das ist OK so und man kann diese Einstellung getrost speichern, damit sie beim nächsten Mal nicht mit angezeigt wird. Was nicht OK wäre ist, wenn diese Anzeige mit anderen Werten bei einem der nächsten Verbindung erscheinen sollte. Dann hat sich vielleicht die IP-Addresse des Servers geändert oder es wurde eine andere Domain angegeben, die zwar gültig ist, weil sie auf dieselbe IP-Adresse zeigt aber halt doch nicht dieselbe ist, die im Zertifikat hinterlegt wurde.

Kurz gesagt, wenn sich was ändert, bekommst Du die Meldung nochmal und Du musst dann entscheiden, ob Du verbinden willst oder lieber erst mal der Sache nachgehst.

Kopieren der WordPress-Datenbank

PhpMyAdmin vs. Adminer vs. MySQLdump

Für das Verwalten und Bearbeiten Datenbanken gibt es viele verschiedene Tools. Für das Web und für MySQL-Datenbanken haben sich PhpMyAdmin und für spezielle Setups auch Adminer etabliert. PhpMyAdmin besteht aus vielen Dateien wogegen Adminer nur eine einzige Datei mit ca. 400 KB Größe ist, was vieles einfacher macht, vor allem wenn man eine dünne Leitung hat.

Hat man Zugriff auf das Terminal des Betriebssystems und etwas Geschick im Umgang mit Kommandozeilentools empfehle ich immer ‚mysqldump’ zu benutzen für das Erstellen von sogenannten Datenbank-Dumps. Sprich alle Daten aus einer Datenbank landen in einer Datei, die man dann packen und versenden oder sich herunterladen kann. Dieser Datenbank-Dump kann man dann wieder auf dem Zielsystem einspielen.

Wichtig im Hinterkopf zu behalten ist, dass die SQL-Dumps aus den verschiedenen Programmen nicht unbedingt untereinander kompatibel sind. Mit großer Wahrscheinlichkeit lässt sich zwar ein MySQL-Dump in ein PhpMyAdmin importieren. Aber auch das ist nicht jedes Mal der Fall und um auf Nummer sicher zu gehen, exportiert man am besten mit genau demselben Script mit dem man dann schlussendlich auch importieren wird.

PhpMyAdmin Export

Bei PhpMyAdmin, welches von den meisten Hostern mit angeboten wird, findet man die Exportfunktion auf der rechten Hälfte in der oberen Menüleiste.

PhpMyAdmin

Bevor man allerdings da drauf klickt, sollte man die entsprechende Datenbank auf der rechten Seite auswählen, da man ansonsten nur eine bestimmte Tabelle aus der Datenbank exportiert. In der Standardeinstellung wird eine nicht-gepackte SQL Datei zum Anzeigen bereitgestellt. Allerdings kann man sich auch eine gepackte Datei herunterladen, was natürlich für unsere Zwecke passender ist. Dazu wählt man die Exportmethode „Angepasst – zeige alle möglichen Optionen an“ aus worauf hin sich die Auswahlmöglichkeiten erweitern.

Nun müssen wir nur noch unter dem Unterpunkt „Ausgabe“ die Komprimierung aktivieren. Wir können zum Beispiel GZip oder Zip auswählen, um das Komprimieren der SQL-Datei zu aktivieren. Das reicht im Grunde schon, denn alle anderen Standardeinstellungen sollten so weit passen.

PhpMyAdmin Import

Der Import ist noch einfacher als der Export. Nachdem auf dem Zielsystem die richtige Datenbank auf der Linken Bildschirmhälfte ausgewählt wurde, öffnet ein Klick auf Import, zu finden im Hauptmenü auf der rechten Bildschirmhälfte das Importmenü. Jetzt kann man entweder das gepackte WordPress-Datenbank-Dump aus der Downloadleiste des Browsers in das Fenster ziehen, oder man wählt die Datei mit „Datei auswählen“ aus.

Eine der Dinge, die schieflaufen könnten ist, dass die maximale Datei-Uploadgröße zu gering ist bzw. der WordPress-Datenbank-Dump zu groß. Stellschrauben sind in der PHP-Konfiguration zu finden in diesen Fällen schlage ich immer vor am besten dem Hoster ein E-Mail abzusetzen und das Problem zu schildern. Die maximale Datei-Upload-Größe sieht man rechts neben der „Datei auswählen“ Schaltfläche.

Einstellungen in der WordPress Konfiguration (wp-config.php) bzw. der Datenbank vornehmen

Um auf die Seite grundlegend zugreifen zu können müssen zwei konstanten angepasst werden, die in der Datenbank stehen. In der Datenbanktabelle wp_options befinden sich zwei Einträge, die oft die option_id 1 bzw. 2 haben also in einer Auflistung mit Beispielsweise PhpMyAdmin ganz oben stehen dürften. Die beiden Datenbankzeilen heißen ‚siteurl‘ und ‚home‘. Dort muss die neue Domain, unter der die neue WordPress-Installation zu finden ist angepasst werden, damit man zumindest auf die Startseite zugreifen kann. Ganz wichtig drauf achten, dass das richtige Protokoll mit angegeben wird also, dass die komplette URL eingetragen wird wie hier zum Beispiel: https://www.desertcoderz.com

Eine zweite Alternative dazu ist die Konstanten in der WordPress-Konfigurationsdatei wp-config.php anzupassen. Dort heißen sie WP_SITEURL, und WP_HOME und wird in der Define-Funktion angegeben und damit definiert. Das Ganze würde dann so aussehen:

define('WP_SITEURL', 'https://www.desertcoderz.com');
define('WP_HOME', '<a href="https://www.desertcoderz.com/">https://www.desertcoderz.com</a>');

Natürlich muss hier die eigene Domain vollständig eingetragen werden. Um das ganze universaler zu halten, und damit nur eine Konfigurationsdatei für die verschiedenen Umgebungen benötigt wird habe ich die Konfiguration um folgenden Code erweitert.

function siteURL()
{
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $domainName = $_SERVER['HTTP_HOST'].'/';
    return $protocol.$domainName;
}

define('WP_SITEURL', siteURL());
define('WP_HOME', siteURL());

Damit werden Protokoll und URL automatisch von den Server-Umgebungsvariablen ausgelesen und die Konstanten definiert.

Domainname und URLs in der Datenbank ersetzen

Einer der Nachteile von WordPress ist der, dass das System sehr stark an die Domain, auf der es installiert wurde, gebunden ist. Das hat zur Folge, dass man beim Übertragen der WordPress-Installation auf einen anderen Server, beim Ändern der Domain oder beim Einrichten eines SSL Zertifikates die vielen stellen, in der Datenbank ersetzen muss, in der die Domains bzw. URLs enthalten sind.

Was man auf keinen Fall tun sollte ist es einfach die Domain per Ersetzen-Funktion eines Editors in der SQL-Datei oder per einfachem SQL-Query zu ändern. Warum das keine gute Idee ist, erkläre ich gleich. Generell darf man SQL-Dateien nicht wirklich als Textdateien betrachten, auch wenn sie so aussehen mögen. Sie sollten immer als Binary Dateien betrachtet werden und nach Möglichkeit nicht in einem Texteditor bearbeitet werden, da eine unterschiedliche Zeichenkodierung des Editors die Zeichenketten verunstalten können.

Oder in den Datenbankzellen können sich zum Beispiel serialisierte PHP-Arrays befinden, denen immer die Länge des Strings, Arrays oder Objektes vorangestellt ist. Ändert sich nun die Länge eines Strings bei einem „Replace“ dann muss auch die Zahl, welche die Länge repräsentiert geändert werden.

Das String „Hello World“ würde serialisiert so aussehen:

s:11:“Hello World“;

Man sieht hier dass der der Datentyp „s“ (String) und dessen Länge „11“ (Bytes ASCII-Zeichen) definiert sind. Wenn ich jetzt aus der Zeichenkette „Hello“ ein „Hi“ mache dann würde es nach einem Replace (und falsch) so aussehen:

s:11:“Hi World“;

Das würde die Funktion, welche die Zeichenkette in einen für PHP verständlichen Wert umwandelt, mit einem Fehler quittieren, da die Länge des Strings nicht mehr stimmt. Richtig müsste es ja so sein:

s:8:“Hi World“;

Das bedeutet, wir brauchen einen Mittler, der uns die Daten korrekt anpasst. Und das kann man mit Replace-Plugins bewerkstelligen.

Von den Search- und Replace-Plugins gibt es viele. Ich benutze gerne das „Better Search and Replace“ Plugin von Delicious Brains. Man findet die entscheidende Ansicht des Replace-Plugins in der Linken WordPress-Menüleiste im Backend unter „Werkzeuge“.

In diesem Beispiel ändere ich gerade das Protokoll der Domain von HTTP auf HTTPS, nachdem ich das SSL-Zertifikat eingerichtet habe. Unter „Tabellen auswählen“ müssen im Grunde alle Tabellen ausgewählt werden. Nach einem ersten Testlauf mit eingeschalteter „Testlauf?“ Option, kann man sich die Anzahl der Treffer anzeigen lassen und dann mit dem Ersetzen der Domain in der Datenbank Ernst machen, in dem man diese Checkbox ausschaltet und den Ersetzen-Vorgang nochmal auslöst.

Die GUIDs würde ich auf nicht ersetzen stellen und diese immer ignorieren, was ja die Standardeinstellung des Replace-Plugins ist. Das ändert nämlich sonst den einzigartigen Schlüssel zu jedem Beitrag und RSS-Reader würden dann die Artikellisten der ganze Website nochmal nachladen und bei den Abonnenten würde ständig der Benachrichtigungs-Alarm ausgelöst werden.

Problem beim Ändern von Bild-URLs im WordPress-Theme

Es kann bei einigen Themes oder Plugins vorkommen, dass die URLs nicht aktualisiert werden und immer noch die alte Domain für Assets wie zum Beispiel Bilder ausgegeben wird. Das kann daran liegen, dass das WordPress-Theme oder Plugin die Layout-Daten für die Seite einschließlich der URLs nochmal in verschlüsselter Form in der Datenbank speichert. In dem Fall müsste man, falls das WordPress-Theme keine Funktion zur Aktualisierung der URLs zur Verfügung stellt, die betreffenden Seiten nochmal editieren und wieder abspeichern. Somit dürfte sich dann zum Beispiel auch das Problem einer unsicheren Seite, durch gemischte Inhalte, nach Einrichten des SSL-Zertifikates lösen.