Suchen & Ersetzen in der WordPress Datenbank
Vor einigen Tagen habe ich einen kleinen Artikel bzgl. Weiterleitung von HTTP- auf HTTPS-Anfragen geschrieben. Auch seit der Veröffentlichung des Artikels über das Plugin "Duplicator" ist dieser Artikel ein absoluter Dauerbrenner was Besucherzahlen anbelangt.
Du stellst dir sicherlich die Frage, was die beiden Artikel miteinander zu tun haben. Auf den ersten Blick nichts, stimmt. Beide Artikel haben im Entferntesten aber mit dem hier im Titel beschrieben Thema zu tun. Um ein WordPress auf SSL umzustellen benötigt man eine umfangreiche Datenbankanpassung. Der Duplicator z.B. macht genau diese Datenbankanpassung innerhalb seines Installations-Scriptes.
Die Rede ist natürlich vom Suchen und Ersetzen. (Search & Replace)
Da man aber z.B. für eine Umstellung auf SSL nicht den Duplicator-Prozess durchlaufen lassen sollte, da er dafür nicht ganz gedacht ist, gibt es andere Lösungen um effizient und korrekt innerhalb der WordPress Datenbank Strings zu ersetzen.
Vorab einige Erklärungen:
Was ist so pikant am Suchen & Ersetzen?
Eigentlich nichts. Da WordPress PHP Arrays aber zum Teil serialisiert als Strings abspeichert, kann man hier nicht einfach ein Wort durch ein anderes ersetzen. Warum? Serialisierte Arrays sind ein relativ komplexes Gebilde. Aus dem Array:
array(
'vorname' => 'Max',
'nachname' => 'Mustermann'
);
Wird z.B. ein serialisierter String erstellt:
a:2:{s:7:"vorname";s:3:"Max";s:8:"nachname";s:10:"Mustermann";}
Wie setzt sich der serialisierte Array also zusammen?
- a: steht für ein Array
- s: steht für einen String
- die Zahlen hinter den Doppelpunkten stehen für die Länge der jeweiligen Werte. a:2 bedeutet also „ein Array mit zwei Schlüsseln/Werten“. s:7 ist somit ein String mit 7 Zeichen und so weiter…
- Alle weiteren Erklärungen hier (php.net).
Und hier zeigt sich dann das Problem beim Suchen & Ersetzen: ersetze ich beispielsweise „Mustermann“ durch „Doe“ muss ebenfalls die Länge des Strings angepasst werden: aus s:10 müsste dann s:3 werden.
Somit ist normales Suchen und Ersetzen beispielsweise innerhalb einer SQL-Textdatei sehr sehr gefährlich und nicht praktikabel, da die Länge der Strings in den serialisierten Arrays nicht angepasst werden. Da diese Arrays somit korrupt sind können sie nicht gelesen werden.
Welche Lösungen gibt es?
Man könnte sich natürlich manuell etwas bauen, das ist aber viel zu aufwändig. Ich habe bisher zwei gut funktionierende und bewährte Lösungen gefunden, die innerhalb der Datgenbank auch serialisierte Daten unterstützen: WP-CLI und Search-Replace-DB.
WP-CLI
WP-CLI steht für WordPress Command Line Interface. Man kann sein WordPress also praktisch komplett per Kommandozeile steuern. Posts erstellen, löschen, Plugins oder Theme installieren, aktivieren und deaktivieren etc. Alle Befehle gibt es hier.
Ein WP-CLI Befehl ist auch „Search & Replace“. Per Kommandozeile kann man also Strings ersetzen. Serialisierte Daten werden hierbei ebenfalls berücksichtigt.
Da man aber in seltenen Fällen diese Erweiterung auf dem Produktivserver (gerade bei so genannten Billig-Hostern) nutzen kann, werde ich diese Lösung nicht weiter beleuchten. (Später eventuell :-) )
Search-Replace-DB
Dieses PHP Script von interconnectit kann auf jedem Server ausgeführt werden, auf welchem auch WordPress läuft. Es bietet eine kleine grafische Oberfläche, die leicht verständlich ist.
Um in der Datenbank nun einen String durch einen anderen zu ersetzen, gehe wie folgt vor:
1. Lege ein Backup deiner Datenbank an!!!
2. Lade hier das Script herunter und entpacke es auf deinem Computer.
3. Den entpackten Ordner per FTP in den root deines WordPress laden (in den Ordner in dem sich auch die wp-config.php Datei befindet)
4. In deinem Browser die passende URL des Scriptes aufrufen.
5. In der grafischen Oberfläche wie folgt vorgehen:
- Search/Replace: den String eingeben, der ersetzt werden soll.
- Database: diese Daten werden direkt aus der wp-config.php des WordPress ausgelesen. Falls man aber eine andere Datenbank ansteuern will kann man dort seine Zugangsdaten hinterlegen.
- Tables: kann man auf „all tables“ lassen
- Actions: es empfiehlt sich, erstmal einen „Dry Run“ zu machen. Somit simuliert das Script den Vorgang, ohne wirklich die Datenbank anzupacken. Dann kann man sehen ob das Script wirklich Strings ersetzt oder nicht. Ist der Dry-Run erfolgreich, sprich er spuckt keine Fehler aus, kann man den live run machen. Hier wird die Datenbank dann verändert.
6. Nach erfolgreicher Anpassung kannst du nun deine WordPress Seite aufrufen und dich einloggen. Es ist vor dem Testen nämlich wichtig, die Permalinks ein mal neu abzuspeichern. Gehe danach deine Seite durch und schaue, ob alles funktioniert hat.
7. Lösche das Script von deinem Server. Entweder per FTP oder mit der „delete me“ Funktion. Da dieses Script nämlich automatisch die SQL Zugänge ausliest, sind diese zu dem Zeitpunkt in dem das Script öffentlich auf deinem Server liegt für jeden einsehbar!
Kurzes Beispiel
Dieses Script ist beispielsweise perfekt um seine Seite datenbanktechnisch auf SSL umzustellen. So haben wir pixelbar.be auf https:// gestellt. Nach https://www.pixelbar.be gesucht und durch https://www.pixelbar.be ersetzt. Danach ein zweites mal gesucht um auch eventuelle http://www.pixelbar.be mit zu ersetzen und fertig.
Das Tool ist auch perfekt um beispielsweise die komplette URL deines WordPress Blogs zu ändern. So kannst du sehr schnell deine URL von altedomain.be zu neuedomain.be umstellen.