- 作者: Terrance
- 译者:Sheneyan(子乌)
- 时间:2010.2.6
- 英文原文:13 Useful WordPress SQL Queries You Wish You Knew Earlier
子乌注:嗯,这篇文章算是蛮实用的一篇WordPress的底层操作手册,可以让你迅速找到你想做的事情而不是在WordPress的复杂语境里迷路,随手翻译之,并存档备用。
WordPress的用户应该都了解,WordPress是基于MySQL数据库。然而,如果你只是刚刚从我们这里知道这一点,下面这些是你应该了解的。MySQL是一个免费的关系型数据库管理系统 ,绝大多数web服务器都支持它。所有的WordPress数据,如posts、评论、设置,都存储于MySQL数据库中。如果你希望对MySQL了解更多,你可以去WordPress的数据库描述看看。
举个例子,如果你需要改WordPress中的一些全局的信息,那你得在每条记录里穿梭,耗费你大量的时间并且得面对发生人工错误的可能。而直接在你的WordPress数据库中简单地运行一条SQL语句,你可以让上面所说的工作变得轻松而有效率。
而下面就是一些能够在你使用WordPress时提供帮助的SQL语句。
备份你的WordPress数据库
在你对你的数据库做任何操作之前(除非你对自己的SQL执行结果很有信心),请务必备份你的数据库。在你做出任何重大的改变之前备份一下数据库是一个良好的习惯。这保证了无论数据库发生了何种错误,你总是能够将它恢复。
你可以下载WP-DB-Backup或WP-DBManager插件,它们能够让你在你的WordPress面板中备份你的数据库。或者,你也可以通过phpMyAdmin来手动备份。
嗯,如果你决定手动备份你的WordPress数据库,跟着我做底下这些步骤:
- 登录你的phpMyAdmin;
- 选择WordPress数据库;
- 单击顶部导航栏里的Export(导出);
- 选择你想备份的表,或者选择所有的表来备份整个数据库;
- 导出选项选择SQL,导出为.sql后缀的文件;
- 勾选复选框“Save as file(另存为文件)” ;
- 选择compression type(压缩格式),选择gzipped,这样备份文件会小一些;
- 最后点一下Go(确定?OK?执行?),会跳一个下载窗口出来提示你保存你的备份数据库文件。
针对WordPress的13条SQL语句
运行下面提供的SQL语句的简单方法当然就是使用phpMyAdmin(一般来说,有装WordPress的服务器应该都有phpMyAdmin吧?)。phpMyAdmin是一个最常用的MySQL数据库查询与编辑工具。绝大多数web服务器的控制面板都有提供这个选项。这里也有一个名为WordPress SQL Executioner的WordPress插件允许你执行你的SQL语句。
依照以下的步骤来使用phpMyAdmin:
- 登录phpMyAdmin面板并选择你的WordPress数据库。
- 单击SQL栏,进入一个带有SQL查询框的页面。
你可以在如下图所示的这个SQL查询框中输入你的SQL语句。

注:所有的语句都是单纯的SQL查询,并且假定你使用的是标准的表前缀“wp_”。 如果你使用不同的表前缀,请自行修改相应的语句。
修改站点链接(Siteurl)和首页链接(Homeurl)
WordPress将站点链接与首页链接的绝对路径存储于数据库中。因此,如果你将你的WordPress站点从本地主机复制到服务器上,你的站点将无法正确运行。这是因为绝对路径依然是指向你的本地主机。你需要将站点链接与首页链接修改以使站点跑起来。
解决:
UPDATE wp_options SET option_value = replace(option_value, 'http://www.旧的地址.com', 'http://www.新的地址.com') WHERE option_name = 'home' OR option_name = 'siteurl';
修改GUID
当你将你的blog从本地主机移植到你的服务器或者从其他域名转移到新的域名,你需要修改表wp_posts中字段GUID的网址。如果填写错误将会造成严重错误,因为GUID用于将你的post或者页面解析为正确的链接地址。
解决:
UPDATE wp_posts SET guid = REPLACE (guid, 'http://www.oldsiteurl.com', 'http://www.newsiteurl.com');
修正内容中的URL
当存储数据库的时候,WordPress将使用URL链接的绝对地址而非相对链接。因此你需要修正所有将指向新域名地址的链接。
解决:
UPDATE wp_posts SET post_content = REPLACE (post_content, 'http://www.oldsiteurl.com', 'http://www.newsiteurl.com');
只修改图片路径
如果你决定使用Amazon CloudFront作为你的内容分发网络(CDN)以减少你服务器上图片的分发量。当你创建完成你的CNAME记录,你能够使用下面的SQL语句来修改WordPress中所有图片地址,让你的图片从Amazon CloudFront中加载。
解决:
UPDATE wp_posts SET post_content = REPLACE(post_content, 'src="http://www.oldsiteurl.com', 'src="http://yourcdn.newsiteurl.com');
同时你也需要使用以下SQL更新图片附件的GUID:
UPDATE wp_posts SET guid = REPLACE (guid, 'http://www.oldsiteurl.com', 'http://yourcdn.newsiteurl.com') WHERE post_type = 'attachment';
更新post meta
更新post meta的做法与更新post内容中的链接几乎是一样的写法。如果你在每个post中储存了额外的链接数据,你可以使用以下的语句来批量修改。
解决:
UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'http://www.oldsiteurl.com','http://www.newsiteurl.com');
改变默认的”Admin”用户名
默认的WordPress安装将会使用默认的“Admin”用户名创建一个帐户。使用WordPress的用户都知道这个。问题在于这有可能成为一个安全漏洞,因为黑客能够暴力破解你进入你的WordPress管理面板(子乌注:登录时启用防spam的随机验证会好一些)。如果你能够修改你默认的“Admin”用户名,你可以让你的WordPress管理面板安全一些。
解决:
UPDATE wp_users SET user_login = '新的用户名' WHERE user_login = 'Admin';
重置密码
你是不是曾经试过重置你的WordPress密码,但是无论怎样都无法实现这个目标?
解决:
UPDATE wp_users SET user_pass = MD5( '新密码' ) WHERE user_login = '你的用户名';
将作者甲的所有文章分配给作者乙
如果你试着将作者甲的所有文章合并到作者乙的名下,如果你一篇文章一篇文章地修改将会是一个漫长的工作。使用下面的SQL语句(为啥我看到这句话就觉得好像卖膏药的?),你可以轻易地进行上述操作。
你首先需要在你的WordPress管理面板中访问作者与用户页面取得这两个作者的ID。单击用户名查看他们的描述。在浏览器的地址栏,找到”user_id“。这就是我们需要的作者ID信息
解决:
UPDATE wp_posts SET post_author = '新作者id' WHERE post_author = '旧作者id';
删除修订
当你在WordPress中编辑文章的时候,WordPress会保存你编辑文章的许多修订版。这是对资源的浪费,因为过多的修订记录会增加数据库的负担。时间一长,当你拥有成千上万条记录的时候,你的数据库将成倍增长。这将增加循环次数、数据列举,并将延长页面加载时间。
解决:
DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'
源代码来自于: Lester chan
注: 请记住,所有post的修订都将会被删除,包括post meta。
删除post meta
对WordPress来说,安装或删除插件是一个非常常用的任务。一些插件会使用post meta来储存与插件有关的数据。当你删除插件的时候,这些数据将依然存在于post_meta表(即使再也不需要)。运行下列语句来清空无用的post meta值。这会有助于数据库的提速并减肥。
解决:
DELETE FROM wp_postmeta WHERE meta_key = '你的meta key';
导出所有未重复的评论电子邮件
在一段时间里,你的blog将会收到很多评论。这些评论都包含有评论者的电子邮件地址。你可以将这些电子邮件地址不重复地加入你的电子邮件列表。
解决:
SELECT DISTINCT comment_author_email FROM wp_comments;
你得到查询结果之后,可以在phpMyAdmin的标签Query results operations(查询结果操作)下,选择“导出”来导出所有的电子邮件地址。
删除所有Pingback
热门文章会收到大量pingback。这会增加你的数据库大小。为了给你的数据库减肥,你可以试着删除所有的pingback。
解决:
DELETE FROM wp_comments WHERE comment_type = 'pingback';
删除所有垃圾评论
如果你有相当多的垃圾评论,去每个页面删除垃圾信息很乏味并让人沮丧(子乌注:那你为啥不去管理面板的评论页中直接删除垃圾评论??)使用下面的SQL语句,即使面对超过500条的垃圾评论,也可以轻而易举地删除它们(子乌注:只要服用了我们独家出产的大力丸,你就可以力举五牛,夜御十女,oyeah~~)
解决:
DELETE FROM wp_comments WHERE comment_approved = 'spam';
- 0 = 等待审核的评论
- 1 = 通过审核的评论
- spam = 标记为垃圾(spam)的评论
标识未使用的标签(tag)
在WordPress数据库中,如果你使用SQL手动删除旧post,旧的标签依然会显示在你的标签云/列表中。这可以让你标识这些未使用的标签,并删除它们。
解决:
SELECT * FROM wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id INNER JOIN wp_term_relationships wtr ON wtr.term_taxonomy_id=wtt.term_taxonomy_id LEFT JOIN wp_posts wp ON wp.ID=wtr.object_id WHERE taxonomy='post_tag' AND ID IS null AND NOT EXISTS(SELECT * From wp_terms wt2 INNER JOIN wp_term_taxonomy wtt2 ON wt2.term_id=wtt2.term_id WHERE wtt2.parent=wt.term_id) ORDER BY name;
源代码来自于:Snipplr
Start Querying!
如果你需要进行一些性能优化、数据清理或者进行跨域的WordPress迁移,上述SQL语句将会很有用并让你事半功倍。如果你有任何针对WordPress的实用的SQL语句欢迎与我们分享(去他们的网站留言)。



比较有用的语句,收藏了!
[回复]
学习了
[回复]
童鞋你好,提醒你本页面页面有错误哦!
头部那
Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 58 in /var/www/html/sheneyan/sheneyan.com/blog/wp-content/plugins/wp-postviews-plus/postviews_plus.php on line 106
[回复]
子乌 回复:
三月 11th, 2011 at 11:31
呃……之前在调试另一个地方的问题时把php的错误提示打开了,谢谢提醒
[回复]
[...] 译者:Sheneyan(子乌) [...]