用什么SQL查询做一个简单的查找和替换


19

每当我创建一个新网站时,我都会首先在诸如“ stage.domain-name.com”之类的子域上创建一个临时站点。

一切正常后,我导出数据库,在notepad ++中打开它,并查找/替换“ subdomain.domain-name.com”,然后将其替换为“ domain-name.com” ...最后,我将其导入到新数据库中实时站点的数据库。

我的问题是...如果我只想使用phpmyadmin在整个数据库上执行此简单查找/替换操作,则需要运行什么SQL查询?

-CH


如果您不熟悉查询,请尝试使用Search and Replace插件wordpress.org/extend/plugins/search-and-replace
t31os 2011年

为什么不使用WordPress功能来更新URL? codex.wordpress.org/Moving_WordPress一切细节
亚历较早

有一个插件。如果您愿意,它可以方便地使用后端,还可以替换后内容和其他字段中的URL:wordpress.org/plugins/better-search-replace
simonthesorcerer 2015年

Answers:


13

保存URL的表是wp_options。您应该在使用您网站网址的列上进行更新:

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"

我可能会缺少一些值,但是每当您再次执行此查找/替换过程时,您都会注意到应该更新的值和表并将它们添加到此脚本中。

WordPress Codex提供了有关如何更改网站URL的不错指南,也许对您来说更方便:更改网站URL


1
有没有办法在整个数据库上进行查找/替换?换句话说...例如,我注意到我需要在包括媒体库在内的许多不同位置中替换URL。问题。感谢您的帮助
NetConstructor.com 2011年

查看我在答案上添加的新链接。我认为那是要走的路。
Fernando Briano

1
这不适用于序列化数据。它可能会完全破坏某些主题配置。
Christian Lescuyer

28

最好执行选项,发布,发布内容和发布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');

另请参阅使用phpMyAdmin和MySQL搜索数据| Packt出版。搜索正则表达式是一个很好的WP插件可以搜索,并通过所有的文章和网页使用grep代替。

2015年6月16日更新:使用下句话中链接的工具要好得多,因为在数据库转储中进行上述简单的查找/替换会破坏序列化的数据。请参阅interconnectit.com WordPress序列化的PHP搜索替换工具。这样,您就不会破坏序列化的数据,也不需要在帖子内容上运行RegEx,因为互连脚本会在各处更改URL。我一直在使用该工具将网站迁移到不同的域,或者只是从http到https进行全局更改,以强制不使用插件的SSL,并更改内容中的所有URL以防止不安全的元素错误。


2
永远不要更改GUID-即使转到新域。它用于唯一标识帖子,因为如果将帖子导出/导入到新数据库中,则ID可能会更改。一方面,RSS阅读器将使用GUID来判断是否已阅读特定文章。更改GUID会有效地重新发布您的所有文章。
泰勒·杜威

@taylordewey说:“永远不要改变向导……”垃圾。
markratledge 2012年

1
@songdogtech Care解释为什么是垃圾?
2013年

1
为什么必须更改GUID?
kaiser

1
这不适用于序列化数据。它可能会完全破坏某些主题配置。确实使用诸如互连/ IT之类的工具。
Christian Lescuyer

9

这是我使用的出色的直接脚本,可与WP用于存储选项的序列化数组完美配合。完成操作后,只需确保将其从远程服务器中删除即可,因为它存在巨大的安全风险。

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


2
我不知道为什么我被-1。该脚本比SQL语句好得多。反馈好吗?
lancemonotone 2011年

1
一种不了解sql的人可以使用的工具,使那些用sql编写的人感到沮丧
Jon

4

为此,我使用WP-CLI,因为我发现它最简单,并且可以处理序列化数据。

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

还有一个选项可将您的更改写入SQL文件,而不是操作实际的数据库:

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


迄今为止最强大,最快的解决方案。wp-cli再次挽救了一天
ryanrain '18

3

您不必这样做,可以使用相对路径。

当您链接内容而不是subdomain.soemthing.com/image.jpg时-例如使用/image.jpg

这样,您将不会首先面对问题。

否则,对于mysql更新语句,您可以使用

update TABLE_NAME set FIELD_NAME = replace(FIELD_NAME, find this string’, replace found string with this string’);

谢谢...是的,下次我会做。SQL语句是否在整个数据库(包括所有表)上进行查找替换?
NetConstructor.com 2011年

@ NetConstructor.com上面给您的SQL语句mireille是用于替换特定表中特定字段中的字符串的通用MySQL命令。如果您尝试完全按照编写的方式运行此语句,那么它将无法正常工作。为了使此命令生效,您需要将TABLE_NAME和FIELD_NAME更改为WordPress使用的真实字段和表。
Manzabar 2011年

还要注意,即使您希望使用相对路径,wordpress的许多部分也倾向于自动插入完整路径。要使此插件真正起作用,非常有用,例如:wordpress.org/plugins/root-relative-urls
benz001 2014年

2

要更改我们经常需要的wordpress域,可能是使站点从localhost运行:这是更新查询的完整列表:

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');
  • 如果需要,我们还必须添加其他表,这些表不是WP的默认值。

更新: 搜索替换数据库版本3.1.0是面向开发人员的用户友好的前端工具,使您可以执行数据库范围的搜索/替换操作,而不会损坏PHP序列化的字符串或对象。


2
这不适用于序列化数据。它可能会完全破坏主题配置。
Christian Lescuyer

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.