WordPress 通过SQL批量删除指定目录的文章

864
回复
15229
查看
[复制链接]

微信扫一扫 分享朋友圈

该用户从未签到

13

主题

3万

帖子

8980

积分

世外高人

Rank: 12Rank: 12Rank: 12

积分
8980
九七币
0
发表于 2017-9-14 18:36:41 | 显示全部楼层 |阅读模式

本文讲述的是 WordPress 通过SQL批量删除指定目录文章的方法。起因是夜火的一个采集站,因为时间久了,数据量过大,总数据量有4~5W条了,对数据库有奇怪的操作,频繁读写硬盘,拖累整个VPS的速度,影响同VPS其他站点,故忍痛删除数据量最庞大的一个分类文章,约3W条数据。

        但是问题来了,WordPress 后台想删除的话,只能20还是30条的删,删多了就超时失败,而且数据库臃肿,删除20~30条也得等半天,导致删了几个小时也没删掉多少,无奈只能通过phpmyadmin进行 SQL 批量删除。

        进入phpmyadmin之后,找到wp_posts表,发现根本没有分类的字段,我就纳闷了半天,难道WP那么高级,连分类都不用字段标识?那前台怎么进行分类显示的啊?于是就研究了起来,四处翻表,四处查找。最终还是通过搜索查到了一点资料:WordPress直接访问数据库列出指定分类目录下的所有文章,才知道,原来WP的分类都是写在wp_term_relationships这个表里,通过文章ID和分类ID或tag的ID对应来进行分类。

        知道这些,就好办多了。通过引用文章里介绍的sql语句进行查询删除就行了,但是因为那篇文章写的比较早,对应的WP版本,数据库结构可能有所不同,需要进行修改一下,当然,我这里所说的WordPress 通过SQL批量删除指定目录文章的方法也是针对目前的wordpress 3.3.1版本。

引用文章提供的SQL语句:

  1. select ID,post_title,post_date,post_name from wp_posts,wp_term_relationships,wp_term_taxonomy where ID=object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and post_type=’post’ and post_status = ‘publish’ and wp_term_relationships.term_taxonomy_id = $CID and taxonomy = ‘category’ order by ID desc
复制代码

经过我修改之后的语句(这里我要删除的特定目录ID就是26):

  1. select ID,post_title,post_date,post_name from wp_posts,wp_term_relationships,wp_term_taxonomy where ID=object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26
复制代码

稍微精简的语句(只查询出要查找的ID):

  1. select ID from wp_posts,wp_term_relationships,wp_term_taxonomy where ID=wp_term_relationships.object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26
复制代码

中间为了找到删除的方法变形的3个语句(具体的思路经过1天1夜和酒精的摧残已经想不起来了):

  1. select * from wp_posts where wp_posts.id in (select wp_posts.id from wp_posts,wp_term_relationships,wp_term_taxonomy where wp_posts.id=wp_term_relationships.object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26)
  2. select * from wp_posts where wp_posts.id in (select wp_posts.id from wp_posts,wp_term_relationships,wp_term_taxonomy where wp_posts.id=wp_term_relationships.object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26)
  3. delete * from wp_posts where wp_posts.id in (select wp_posts.id from wp_posts,wp_term_relationships,wp_term_taxonomy where wp_posts.id=wp_term_relationships.object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26)
复制代码

中间因为delete语句老是报错,于是搜了下关于mysql delete数据的语法:对MySQL DELETE语法的详细解析,才知道自己写的不对,哪里要那么多的select那么多的括号,查那么多的表,直接delete from ... using ... where ....就行了。下面是最终的,WordPress指定特定目录删除下面所有文章的语句:

游客,如果您要查看本帖隐藏内容请回复

这就是我奋斗到凌晨1点半的结果,希望后来的诸位共勉之,不要像我一样走那么多弯路,神啊,原谅我这个不懂MySql的人吧~

2012.03.10 update:

(1)wp_posts 进行完上面的删除操作之后,需要对表进行一下优化(phpmyadmin后台界面操作),不然还是原来好几百M。

(2)wp_term_relationships 也需要删除对应的文章分类关系,不然记录条数和原来的wp_posts 一样,好几W条。

查询看下是不是:
SELECT * FROM `wp_term_relationships` where term_taxonomy_id=26

删除:
delete FROM `wp_term_relationships` where term_taxonomy_id=26

同样几W条记录消灭掉,最后记得优化下表。

(3)最后把wp_term_taxonomy里的分类文章数量计数的几W count 给归零,这个可以直接通过phpmyadmin直接界面操作
UPDATE `wp_term_taxonomy` SET `count` = '0' WHERE `wp_term_taxonomy`.`term_taxonomy_id` =26 LIMIT 1 ;


回复

使用道具 举报

该用户从未签到

0

主题

1万

帖子

8912

积分

世外高人

Rank: 12Rank: 12Rank: 12

积分
8912
九七币
0
发表于 2017-9-14 18:36:42 | 显示全部楼层
沙发~支持楼主,支持10万社区社区,希望10万社区社区越办越好.
回复

使用道具 举报

该用户从未签到

0

主题

2万

帖子

8949

积分

世外高人

Rank: 12Rank: 12Rank: 12

积分
8949
九七币
0
发表于 2017-9-14 18:36:58 | 显示全部楼层
太棒了,感谢楼主,10万社区是我家维护靠大家.
回复

使用道具 举报

该用户从未签到

10

主题

2万

帖子

8964

积分

世外高人

Rank: 12Rank: 12Rank: 12

积分
8964
九七币
0
发表于 2017-9-14 18:39:34 | 显示全部楼层
好东西一定要看看!
回复

使用道具 举报

该用户从未签到

11

主题

4万

帖子

86

积分

禁止发言

积分
86
九七币
0
发表于 2017-9-14 18:50:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

该用户从未签到

3

主题

2万

帖子

8934

积分

世外高人

Rank: 12Rank: 12Rank: 12

积分
8934
九七币
0
发表于 2017-9-14 18:50:23 | 显示全部楼层
太棒了,感谢楼主,10万社区是我家维护靠大家.
回复

使用道具 举报

该用户从未签到

10

主题

2万

帖子

9069

积分

管理员

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
9069
九七币
0
发表于 2017-9-14 18:50:25 | 显示全部楼层
看帖看完了至少要顶一下,还可以加入到淘帖哦!
回复

使用道具 举报

该用户从未签到

0

主题

2万

帖子

8920

积分

世外高人

Rank: 12Rank: 12Rank: 12

积分
8920
九七币
0
发表于 2017-9-14 18:51:10 | 显示全部楼层
看了LZ的帖子,我只想说一句很好很强大!
回复

使用道具 举报

该用户从未签到

2

主题

2万

帖子

8947

积分

世外高人

Rank: 12Rank: 12Rank: 12

积分
8947
九七币
0
发表于 2017-9-14 18:52:22 | 显示全部楼层
哈哈!楼主大人你太好笑了.10万社区社区最搞笑的人莫过于你啊!
回复

使用道具 举报

该用户从未签到

2

主题

1万

帖子

8923

积分

世外高人

Rank: 12Rank: 12Rank: 12

积分
8923
九七币
0
发表于 2017-9-14 18:53:36 | 显示全部楼层
果断回帖,如果沉了就是我弄沉的很有成就感
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

400-911-6609

周一至周五 9:30-18:00

上海市宝山区景园北街2号02号

  • 关注微信账号

  • 关注微博账号