Links in Posts von WordPress ersetzen in der Datenbank mit MySQL-Anweisung

Achtung! Dieser Beitrag ist ursprünglich vom Januar 2009 und damit schon sehr alt. Die hier veröffentlichten Informationen zum Umziehen berücksichtigen keine URLs, die serialisiert abgelegt werden. Bei serialisierten Daten können nicht einfach die URLs ersetzt werden, da hier die Zeichenlänge mit abgespeichert wird. Eine sicherere Variante gibt es hier: https://interconnectit.com/products/search-and-replace-for-wordpress-databases/ (in Englisch)

Der ursprüngliche Artikel:

Gerade ein akuter Fall bei mir gewesen: ich hatte zwecks Domainumzug (nicht bei mir, ich bleib hier! 🙂 ) das Problem, dass ich Artikel eines anderen Blogs in den neuen Blog importiert hatte, in denen Bilder verlinkt waren, welche jedoch noch zur alten Domain verlinkten. Via FTP hab ich das upload-Verzeichnis direkt in den neuen Blog übertragen können und somit alle hochgeladenen Bilder des alten Blogs bereits auf dem neuen Blog gehabt, jedoch nur physisch und nicht verlinkt. Nun wollte ich aber nicht die über 100 Artikel bearbeiten und die Bild-URLs aktualisieren, sondern suchte nach einer anderen Lösung. Ich wollte in der Datenbank in der Tabelle

wp_posts

in der Spalte

post_content

alle URLs mit der neuen Domain ersetzen. Auf der Suche nach einer Lösung suchte ich als erstes in der MySQL-Doku nach der

REPLACE()

-Funktion, diese jedoch liefert keine allzu guten Beispiele :-(. Glücklicherweise traf ich auf den Blog des Pfannenwenders, welcher in seinem Artikel „Suchen und Ersetzen in MySQL-Tabellen“ mir die Lösung auf dem Teller präsentierte.

 

Der entscheidende Befehl, welcher auf der MySQL-Datenbank auszuführen ist, lautet also:

 

UPDATE `wp_posts` SET `post_content` = REPLACE (
`post_content`,
'www.altedomain.de',
'www.neuedomain.de'
)

 

Dieser Befehl ersetzt alle vorkommenden www.altedomain.de mit www.neuedomain.de, beispielsweise: Im Artikel steht noch der alte Link:

<img src="http://www.altedomain.de/wp-content/uploads/bild.jpg" alt="" />

. Nach dem Ausführen des Update-Befehls steht dann statt dem alten Link dort:

<img src="http://www.neuedomain.de/wp-content/uploads/bild.jpg" alt="" />

. Und genauso wollte ich es haben! 🙂

Zu beachten sind die Backticks ( ` ) und die einfachen Anführungszeichen ( ). Die Tabelle und die Spalte der Tabelle müssen in Backticks geschrieben werden, die Suchstrings in einfachen Anführungszeichen. Falsch gesetzt wirft die Datenbank einen Fehler und führt den Update-Prozess nicht durch. Und, wie schon in Pfannenwenders Artikel: BACKUP der Datenbank vorher machen! Denn sonst ist alles schlimmstenfalls verpfuscht und nicht wiederherstellbar!

So, nun hoff ich mal, dass das jemandem hilft :-). Mir hats sehr geholfen und mindestens 600 Klicks erspart und ca. 2,5 Stunden Arbeit!

Welcher Hit war an deinem Geburtstag Nummer 1? Aufgriff eines Stöckchens

 

Ricarda mit ihrer Blogblume ist schuld. Das muss ich jetzt einfach vorneweg mal sagen. Sie hat ein Stöckchen von Gillys Blog aufgegriffen. Fragestellung: Welcher Hit war an deinem Geburtstag Nummer 1? Nun hab ich mich auch mal auf die Suche gemacht und auch hier gefunden, was bei mir gerade so im Radio lief: http://www.youtube.com/watch?v=pmQVWH9u8Xo. Begeistert bin ich nicht, ist nun so gar nicht mein Musikgeschmack :-(. Aber mir gehts damit noch lang nicht so schlecht wie wahrscheinlich meinem lieben Clemens! Denn als er geboren wurde, war Modern Talking mit „Atlantis Is Calling (S.O.S For Love)“ gerade die Nummer 1 der Media Control Charts!

Noch schlechter hats allerdings lifecheater mit „Schnuffel“ getroffen, wobei ich mich wunder, dass er nicht mal 6 Monate nach seiner Geburts bereits bloggen und schreiben konnte, wie dieser Kommentar zu beweisen scheint. 😛

strstr() / stristr() – „Bug“: Wrong parameter count for stristr() – mögliche Lösung?

Problem: Ich habe einen String, welchen ich auseinandernehmen will. Der String beinhaltet ein Sonderzeichen als Trenner. Ich möchte alle Zeichen, welche VOR diesem Trenner stehen als Teilstring bekommen. Die Funktion strstr() bzw. stristr() (Groß- und Kleinschreibung ist mir egal) liefert mir jedoch nur den Teilstring NACH dem gefundenen Sonderzeichen. Sie verfügt jedoch über den Zusatzparameter "before_needle". Wenn ich den auf TRUE setze, sollte die Funktion den Teilstring vor dem gefundenen Sonderzeichen (Suchstring "needle") zurückgeben, stattdessen passierte mir folgendes:

Gerade beim Auseinandernehmen von Strings und dem Versuch, den Teilstring eines Strings vor dem gefundenen Suchstring zu bekommen mittels der PHP-Funktion strstr() oder stristr(), kam folgender Fehler zustande: "Wrong parameter count for stristr()". Leider gibts die Funktion erst ab PHP Version 5.3, die ist aber noch nicht veröffentlicht. Wer einen Teilstring haben möchte, der VOR dem gefundenen Parameter steht, kann stattdessen mb_stristr() benutzen. Das funktioniert, wobei ich nicht weiß, ob diese Funktion, da Multibyte-String-Funktion, speicherintensiver ist. Da ich nur einen ganz kleinen String auseinandernehmen musste, stört mich dies jedoch nicht ;-). Vielleicht hilfts ja noch jemandem weiter!

Ach ja: Frohes neues Jahr allen Lesern und denen, die auf diesen Artikel stoßen! 🙂