Welche SQL-Abfrage, um eine einfache Suche und Ersetzung zu tun

19

Immer wenn ich eine neue Website erstelle, erstelle ich zuerst eine Staging-Site in einer Subdomain wie "stage.domain-name.com".

Nachdem alles korrekt funktioniert, exportiere ich die Datenbank, öffne sie in Notepad ++ und führe ein Suchen / Ersetzen für "subdomain.domain-name.com" durch "domain-name.com" durch ... schließlich importiere ich sie in eine neue Datenbank für die Live-Site.

Meine Frage ist ... welche SQL-Abfrage müsste ich ausführen, wenn ich diese einfache Suche / Ersetzung in der gesamten Datenbank mit phpmyadmin durchführen möchte?

-CH

NetConstructor.com
quelle
Wenn Sie mit Suchanfragen nicht vertraut sind, versuchen Sie das Plugin Suchen und Ersetzen unter wordpress.org/extend/plugins/search-and-replace
t31os am
Warum nicht die WordPress-Funktionalität nutzen, um die URL zu aktualisieren? codex.wordpress.org/Moving_WordPress beschreibt alles
Alex Older
Dafür gibt es ein Plugin. Es ermöglicht die komfortable Nutzung des Backends und ersetzt auch die URL im Post-Content und einigen anderen Feldern, wenn Sie möchten: wordpress.org/plugins/better-search-replace
simonthesorcerer

Antworten:

13

Die Tabelle, in der Ihre URL gespeichert ist, lautet wp_options. Sie sollten ein Update für die Spalten durchführen, die die URL für Ihre Site verwenden:

UPDATE TABLE wp_options SET option_value = "new domain" WHERE option_name = "siteurl"
UPDATE TABLE wp_options SET option_value = "new domain" WHERE option_name = "home"

Möglicherweise fehlt ein Wert, aber wenn Sie diesen Such- / Ersetzungsvorgang erneut ausführen, können Sie die zu aktualisierenden Werte und Tabellen feststellen und zu diesem Skript hinzufügen.

WordPress Codex hat eine nette Anleitung zum Ändern einer Site-URL. Vielleicht ist das sogar noch einfacher für Sie: Ändern der Site-URL

Fernando Briano
quelle
1
Gibt es keine Möglichkeit, eine Suche / Ersetzung für die gesamte Datenbank durchzuführen? Mit anderen Worten ... Mir ist zum Beispiel aufgefallen, dass ich die URLs an einer Reihe von verschiedenen Stellen ersetzen muss, einschließlich der Medienbibliothek. Wenn es für die gesamte Datenbank im Wesentlichen für jedes Feld ein Suchen / Ersetzen geben würde, wäre dies eine Lösung das Problem. Vielen Dank für Ihre Hilfe
NetConstructor.com
Schauen Sie sich den neuen Link an, den ich zur Antwort hinzugefügt habe. Ich denke, das wäre der richtige Weg.
Fernando Briano
1
Dies funktioniert nicht für serialisierte Daten. Es könnte einige Themenkonfigurationen komplett beschädigen.
Christian Lescuyer
28

Am besten Optionen, Posts, Post-Content und Post-Meta:

UPDATE wp_options SET option_value = replace(option_value, 'http://olddomain.com', 'http://newdomain.com') WHERE option_name = 'home' OR option_name = 'siteurl';

UPDATE wp_posts SET guid = replace(guid, 'http://olddomain.com','http://newdomain.com');

UPDATE wp_posts SET post_content = replace(post_content, 'http://olddomain.com', 'http://newdomain.com');

UPDATE wp_postmeta SET meta_value = replace(meta_value, 'http://olddomain.com', 'http://newdomain.com');

Siehe auch Durchsuchen von Daten mit phpMyAdmin und MySQL | Packt Publishing. Und Search RegEx ist ein gutes WP-Plugin, um mit Grep alle Posts und Seiten durchsuchen und ersetzen zu können.

Update 16.06.2015: Die Verwendung des im nächsten Satz verlinkten Tools ist viel besser, da ein einfaches Suchen / Ersetzen wie oben in einem Datenbank-Dump serialisierte Daten zerstört. Siehe interconnectit.com WordPress Serialized PHP Search Replace Tool. Auf diese Weise brechen Sie keine serialisierten Daten und müssen RegEx nicht für Post-Inhalte ausführen, da das Interconnect-Skript die URLs überall ändert. Ich benutze dieses Tool die ganze Zeit, um Websites in andere Domänen zu migrieren oder einfach eine globale Änderung von http zu https vorzunehmen, um SSL ohne Plugins zu erzwingen und alle URLs im Inhalt zu ändern, um unsichere Elementfehler zu vermeiden.

markratledge
quelle
2
Ändern Sie niemals die Guid - auch nicht, wenn Sie zu einer neuen Domain wechseln. Es wird verwendet, um den Beitrag eindeutig zu identifizieren, da sich die ID ändern kann, wenn die Beiträge in eine neue Datenbank exportiert / importiert werden. Zum einen verwenden RSS-Reader die GUID, um festzustellen, ob ein bestimmter Artikel gelesen wurde oder nicht. Durch Ändern der Anleitung werden alle Ihre Artikel erneut veröffentlicht.
Taylor Dewey
@ Taylordewey sagte: "Ändern Sie nie die guid ..." Müll.
markratledge
1
@songdogtech Pflege zu erklären, warum es Müll ist?
Shea
1
Warum sollte man hat die GUID ändern?
Kaiser
1
Dies funktioniert nicht für serialisierte Daten. Es könnte einige Themenkonfigurationen komplett beschädigen. Verwenden Sie in der Tat ein Tool wie Interconnect / IT.
Christian Lescuyer
9

Dies ist ein großartiges Drop-In-Skript, das ich verwende, und es funktioniert hervorragend mit den serialisierten Arrays, die WP zum Speichern von Optionen verwendet. Stellen Sie einfach sicher, dass Sie es von Ihrem Remote-Server löschen, wenn Sie fertig sind, da dies ein RIESIGES Sicherheitsrisiko darstellt.

https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

lancemonotone
quelle
2
Ich weiß nicht, warum ich -1 war. Dieses Skript ist viel besser als eine SQL-Anweisung. Rückmeldung bitte?
lancemonotone
1
Ein Tool, das Leute, die SQL nicht kennen, verwenden können, ist ärgerlich für diejenigen, die SQL schreiben
Jon
4

Dafür benutze ich WP-CLI, weil ich es am einfachsten finde und es sich um serialisierte Daten kümmert.

wp search-replace 'http://example.dev' 'http://example.com' --skip-columns=guid

Es gibt auch eine Option, die Ihre Änderungen in eine SQL-Datei schreibt, anstatt die eigentliche Datenbank zu manipulieren:

wp search-replace foo bar --export=database.sql

Jan Beck
quelle
mit Abstand die robusteste und schnellste Lösung. wp-cli rettet den Tag noch einmal
Ryanrain
3

Sie müssen dies nicht tun, Sie können relative Pfade verwenden.

Wenn Sie etwas verlinken, anstatt subdomain.soemthing.com/image.jpg - verwenden Sie zum Beispiel /image.jpg

Auf diese Weise werden Sie dem Problem nicht in erster Linie gegenüberstehen.

Andernfalls können Sie für eine mysql update-Anweisung verwenden

update TABLE_NAME set FIELD_NAME = replace(FIELD_NAME, find this string’, replace found string with this string’);
Mireille Raad
quelle
Danke ... ja, das werde ich das nächste Mal tun. Findet die SQL-Anweisung einen Ersatz für die gesamte Datenbank (einschließlich aller Tabellen)?
NetConstructor.com
@ NetConstructor.com Die SQL-Anweisung, die mireille Ihnen oben gegeben hat, ist der generische MySQL-Befehl zum Ersetzen einer Zeichenfolge in einem bestimmten Feld in einer bestimmten Tabelle. Wenn Sie versuchen würden, diese Anweisung genau so auszuführen, wie sie geschrieben wurde, würde sie nicht funktionieren. Damit dieser Befehl funktioniert, müssen Sie TABLE_NAME & FIELD_NAME in ein reales Feld und eine Tabelle ändern, die von WordPress verwendet werden.
Manzabar
Beachten Sie auch, dass viele Teile von WordPress dazu neigen, vollständige Pfade automatisch einzufügen, selbst wenn Sie relative Pfade verwenden möchten. Um dies wirklich zum
Laufen
2

Um die häufig benötigte WordPress-Domain zu ändern, muss die Site möglicherweise über localhost live geschaltet werden: Dies ist eine vollständige Liste der Aktualisierungsabfragen:

UPDATE wp_posts SET guid = replace(guid, 'http://olddomain.com','http://newdomain.com');
UPDATE wp_posts SET post_content = replace(post_content, 'http://olddomain.com', 'http://newdomain.com');
UPDATE wp_links SET link_url = replace(link_url, 'http://olddomain.com', 'http://newdomain.com');
UPDATE wp_links SET link_image = replace(link_image, 'http://olddomain.com', 'http://newdomain.com');
UPDATE wp_postmeta SET meta_value = replace(meta_value, 'http://olddomain.com', 'http://newdomain.com');
UPDATE wp_usermeta SET meta_value = replace(meta_value, 'http://olddomain.com', 'http://newdomain.com');

/*UPDATE wp_options SET option_value = replace(option_value, 'http://olddomain.com', 'http://newdomain.com') WHERE option_name = 'home' OR option_name = 'siteurl' OR option_name = 'widget_text' OR option_name = 'dashboard_widget_options';*/
UPDATE wp_options SET option_value = replace(option_value, 'http://olddomain.com', 'http://newdomain.com');
  • Falls erforderlich, müssen wir auch andere Tabellen hinzufügen, die bei WP nicht standardmäßig sind.

UPDATE: Search Replace DB Version 3.1.0 ist ein benutzerfreundliches Front-End-Tool für Entwickler, mit dem Sie datenbankweite Such- / Ersetzungsaktionen ausführen können, die PHP-serialisierte Zeichenfolgen oder Objekte nicht beschädigen.

Reza Mamun
quelle
2
Dies funktioniert nicht für serialisierte Daten. Möglicherweise wird die Themenkonfiguration vollständig unterbrochen.
Christian Lescuyer
-1

Tatsächlich müssen Sie keine SQL-Abfrage verwenden, sondern nur einige Anpassungen in der Datei wp_config und functions.php in Ihrem Design. Sehen Sie sich dieses Thema im Wordpress-Codex an: https://codex.wordpress.org/Changing_The_Site_URL

MEDZ
quelle
1
Das stimmt nicht. WordPress speichert leider einige URLs in der Datenbank als Text.
s_ha_dum