分享实用的12个WordPress数据库维护SQL语句

老是折腾Wordpress,对于喜欢鼓捣的朋友那是家常便饭了。虽然通过 WordPress 强大的插件库,我们几乎可以实现任何我们能够实现的功能,但是有时候需要快速修复一些特定的问题的时候,直接操作mysql数据库会显的更加便捷,所以这里就给大家分享一下WordPress 数据库维护时常用到 12 个 SQL 语句。

*注:下面假设 WordPress 数据库的表的前缀都是默认的“wp_”。具体用时可根据自己的数据库后缀名进行相应的字段修改。

密码忘记了是经常的事情,博客密码忘记了进不去,可以直接在数据库里面修改:

  1. UPDATE?wp_users?SET?user_pass?=?MD5('PASSWORD')?WHERE?user_login?=?'admin'

上面采用了 MySQL 的 MD5() 函数讲密码转成 MD5 Hash。

  1. UPDATE?wp_posts?SET?post_author=NEW_AUTHOR_ID?WHERE?post_author=OLD_AUTHOR_ID;

*注:你需要知道两个作者的 user id。

特别是针对多人博客的时候,日志修订功能很重要,但是日志修订功能也在数据库里面添加了很多的数据,假设你的博客只有 100 篇日志,每篇日志有 10 个日志修订,你的 posts 表中就会有超过 1000 条记录,严重的数据冗余:

  1. 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'

*注:上面的 SQL 将删除数据库中所有的日志修订记录和其相关的 meta 信息(自定义字段)。
当然你还可以:做更多有关wordpress优化的设置。

如果你一段时间没有管理你的博客,刚好出去休假,没有办法上网,并且博客也没有装类似 Akismet 这类防垃圾留言插件,那么你回来的时候
你会发现博客后台有成千上万条垃圾留言需要你去审核。
这个时候,其实你只需要审核通过正常的留言,然后执行下面这条 SQL:

  1. DELETE?FROM?wp_comments?WHERE?comment_approved?=?'0';

你可能创建一些 WordPress 标签之后,就没有再使用,你可以通过下面这条 SQL 找到它们,然后安全的删除他们。

  1. SELECT?*?From?wp_terms?wt?INNER?JOIN?wp_term_taxonomy?wtt?ON?wt.term_id=wtt.term_id?WHERE?wtt.taxonomy='post_tag'?AND?wtt.count=0;

对于熟悉 MySQL 数据库的开发者来说,replace() 这个 MySQL 函数都应该很熟悉,它可以让你指定一个字段,然后替换它里面的字符串,一旦执行,所有这个字段里面的字符串都会被替换。对于 WordPress 博客来说,这个 SQL 则非常实用,它可以让你批量修改某些输入错误,或者某个邮件地址等等。

  1. UPDATE?table_name?SET?field_name?=?replace(?field_name,?'string_to_find',?'string_to_replace'?)?;

替换日志内容中字符串:

  1. UPDATE?wp_posts?SET?post_content?=?replace(?post_content,?'string_to_find',?'string_to_replace'?)?;
  2. //将某个留言者地址替换下:
  3. UPDATE?wp_comments?SET?comment_author_url?=?REPLACE(?comment_author_url,?'http://oldurl.com',?'http://newurl.com'?);
  4. //留言者邮箱:
  5. UPDATE?wp_comments?SET?comment_author_email?=?REPLACE(?comment_author_email,?'old-email@address.com',?'new-email@address.com'?);
  6. //还有一个?WordPress?插件?Search?&?Replace?还提供一个后台让你更加容易进行批量替换。

有时候你想做点不是那么好的事情,比如给所有留言者发下邮件,告诉他们你博客做了一些新的功能,或者写了一个很不错的文章,那么你干坏事情之前,首先要获取所有留言者的邮件地址:

  1. SELECT?DISTINCT?comment_author_email?FROM?wp_comments;

*注:上面的 DISTINCT 让你获取的邮件地址是唯一的,即使这个用户发过好几次留言,也不怕。
不过群发邮件这件事情个人建议还是不要这样做好。

网站出现问题了,需要一次把插件全部都先停了之后检测下:

  1. UPDATE?wp_options?SET?option_value?=?''?WHERE?option_name?=?'active_plugins';

没用的标签当然要删除了:

  1. DELETE?a,b,c
  2. FROM
  3. wp_terms?AS?a
  4. LEFT?JOIN?wp_term_taxonomy?AS?c?ON?a.term_id?=?c.term_id
  5. LEFT?JOIN?wp_term_relationships?AS?b?ON?b.term_taxonomy_id?=?c.term_taxonomy_id
  6. WHERE?(
  7. c.taxonomy?=?‘post_tag’?AND
  8. c.count?=?0
  9. );

*注:上面 SQL 除了删除所有没用的标签,还删除了所有标签分类模式信息以及和日志关联的关系。

wp_postmeta 中的数据是由一些插件或者自定义字段生成的,他是对 wp_posts 表的一种无限的扩展,但是可能由于某种原因,日志被删除了,但是它的 meta 信息还存在 wp_postmeta 表中,下面这条 SQL 将这些没有关联日志的 meta 数据列出:

  1. SELECT?*?FROM?wp_postmeta?pm?LEFT?JOIN?wp_posts?wp?ON?wp.ID?=?pm.post_id?WHERE?wp.ID?IS?NULL;

厄,对于一些技术博客或者其他博客来说,一些旧日志的内容可能已经过时了,但是一些读者,还是对一些问题“纠缠不清”或者“喋喋不休”,怎么办,把留言关了就好了:
关闭留言:

  1. UPDATE?wp_posts?SET?comment_status?=?'closed'?WHERE?post_date?<?'2009-01-01'?AND?post_status?=?'publish';

关闭Trackback:

  1. UPDATE?wp_posts?SET?ping_status="closed"?WHERE?post_date?<?'2009-01-01'?AND?post_status?=?'publish';

一些留言者很烦,一次留几十个,其链接都指定到一些卖伟哥,起重机,SEO 的站点,烦人的很,一个一个删,又累,下面这条 SQL 可以来帮忙:

  1. DELETE?from?wp_comments?WHERE?comment_author_url?LIKE?"%viagra%"?;

简单总结
这些 SQL 语句是直接对数据库进行操作的,如果你不是那么懂数据库或者 SQL 语言,建议你不要这么做,如果你还是比较自信 SQL 操作,建议操作之前备份下数据库。