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!

14 Gedanken zu „Links in Posts von WordPress ersetzen in der Datenbank mit MySQL-Anweisung“

  1. Also ich fand die Anleitung jetzt auch richtig klasse. Ein Kumpel hatte das Problem auch, wir haben es mit diesem Befehl versucht und siehe da, es hat super funktioniert. Man muss eben nicht alles wissen, nur wissen, wer es weiß oder wo es steht 😉 Auf jeden Fall danke fürs Posten und die gutverständliche Anleitung.

  2. Ich bin auf der Suche nach ein paar ganz konkreten Infos. Und zwar ist es so, dass ich mir überlegt habe, meinen besten Kumpel zu überraschen. Dieser möchte sich jetzt auch etwas mehr mit dem Internet beschäftigen und hat gedacht, dass er sich einen Blog aufmacht. Ich möchte ihm etwas helfen, denn ich bin Fitter im Umgang damit als er. Aber ich bräuchte jetzt noch ein paar Infos zu WordPress. Da gehen ja die Meinungen so weit auseinander. Was halten Sie denn von WordPress? Würden Sie das einem Anfänger empfehlen?

  3. Schöner Tipp, damit spart man sich ein haufen manuelle Arbeit und es ist auch sichergestellt dass man nichts übersehen hat.
    Noch schöner wär es natürlich wenn WordPress gleich ein Tool für den Domainumzug mitliefern würde, denke sowas kommt schon öfters mal vor.

  4. Da muss ich mich Stefan anschließen, der Tipp ist natürlich richtig klasse, aber ein Plugin, welches das gleich von vornherein übernehmen könnte, wäre sicher einfacher. Ich denke mal, es werden auch viele Laien mit ihrem Blog einfach mal umziehen und von daher versuchen, das eine oder andere zu ändern, aber an solchen Problemen einfach scheitern.

  5. @Carsten:
    Freilich möchte jeder am liebsten „eierlegende Wollmichsäue“ haben, die auf jede Eventualität gerüstet sind und alles sollte per PlugIn funktionieren.
    So, meine Frage nun: Wie soll denn das Plugin funktionieren? Wenn die Domain bereits umgezogen ist und sich alle Daten inklusive Datenbank bereits auf der neuen Domain befinden, kann man den Admin-Bereich nicht aufsuchen, da die Pfade sich noch auf die alte Domain beziehen. Da würde auch ein Plugin nichts nutzen, weil dieses Plugin nicht aufgerufen werden kann.

    Das heißt, die Angelegenheit müsste vor dem Backup der Datenbank, auf der alten Domain vollzogen werden. Dies hätte wiederum zur Folge, dass ich ab dem Zeitpunkt, ab dem ich dieses Plugin starten würde, über den Administrationsbereich kein Datenbankbackup mehr machen könnte, da ich ja nicht mehr auf den Administrationsbereich der alten Domain zugreifen könnte, weil ja die Pfade bereits alle auf die neue Domain angepasst worden sind.

    Ja, hier würde sich die Katze in den Schwanz beißen. Manche Dinge müssen eben noch manuell erledigt werden und das ist auch gut so.

  6. So wird auch alles geändert:

    UPDATE wp_options SET option_value = replace(option_value, ‚http://www.alte-domain.de‘, ‚http://www.neue-domain.de‘) WHERE option_name = ‚home‘ OR option_name = ’siteurl‘;

  7. Feine Sache die …
    ist gibt aber auch ein plugin, mit dem man ziemlich easy in der Datenbank suchen und ersetzen kann:
    http://wordpress.org/extend/plugins/search-and-replace/

    Ich benutze das nach jedem Umzug von lokal auf extern … und das ist im Grunde unverzichtbar, denn es gibt viele Plugins, deren Pfade auch in die Datenbank geschrieben werden bzw. die Pfade (von Medien zum Beispiel) in die Datenbank schreiben. Da ist so ein Plugin deutlich fixer und verlässlicher, als nach betroffenen Tabellen zu suchen und dann per SQL-Befehl zu ersetzen.

    Es wäre allerdings genial, wenn man mit einem Befehl alle Pfade in der gesamten Datenbank ändern könnte. Keine Ahnung ob sowas geht.

    Besonderheit:
    Es gibt allerdings auch Plugins, die Pfade auf eine Weise speichern, die scheinbar nicht per Datenbank korrigiert werden kann. cforms ist zum Beispiel so ein Fall. Nach dem Umzug muss ich das Plugin jedes Mal de- und wieder aktivieren, damit die Pfade zu den CSS-Dateien stimmen, da hilft auch kein Suchen und Ersetzen in der DB.

    Auch den Upload-Pfad von WordPress muss ich jedes Mal nach einem Umzug händisch korrigieren.

    Vielleicht hilft die Info jemandem weiter 🙂

    Beste Grüße aus Freiburg!

  8. Danke für den Tipp, aber ich habe ein Problem, und zwar fängt die Zeichenfolge die ich austauschen muss immer gleich an und hört auch gleich auf, aber dazwischen ist eine nicht feste Anzahl von Zeichen, wie mache ich das? Der Anfang und das Ende des auzutauschenden Strings ist eindeutig…

  9. Ich hab genau danach gesucht.
    Leider klappt es bei mir nicht.
    Folgender Fehler erscheint:
    #1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near “wp_posts‘ SET ‚post_content‘ = REPLACE ( ‚post_content‘, ‚www.diamondoftears.beispiel.de‘ at line 1

    1. Hast du die Fehlermeldung da vollständig kopiert? Es fehlt dort die schliessende Klammer am Ende und am Anfang hast du ein “ statt ‚. Überprüfe auch genau, ob du Backticks, einfache oder doppelte Anführungszeichen verwendet hast.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.