最近项目有个需求,一次性获取wordpress所有分类的最新文章,网上几乎所有的办法就是先用get_categories()函数获取所有的分类id,再使用get_posts()进行循环获取每个分类的最新文章。这种方法,如果分类很多的时候,会把你的数据库卡爆。

分析了wordpress的数据库,wp_term_relationships中有3个字段,object_id其实就是文章的id,term_taxonomy_id是分类id,每篇文章对应一个分类id,因为wordpress文章id是自增的,所以一般情况下,每个分类的最新文章就是这个分类下文章的最大id。于是:

使用以下两条mysql语句都可以达到目的。

select a.term_taxonomy_id,a.object_id from wp_term_relationships a inner join (select term_taxonomy_id,max(object_id)object_id from wp_term_relationships group by term_taxonomy_id) b on a.term_taxonomy_id=b.term_taxonomy_id and a.object_id=b.object_id order by a.object_id DESC

select object_id, term_taxonomy_id from (select * from wp_term_relationships order by object_id desc) b group by term_taxonomy_id ORDER BY object_id DESC

然后再使用get_results(),可以分别输出文章id和分类id,这样查询数据库次数大大减少,效率高了很多。
2022.9.22新增一条查询最新查询所有分类最新文章的mysql语句。

select max(object_id),term_taxonomy_id from wp_term_relationships group by term_taxonomy_id order by object_id desc

Last modification:September 22nd, 2020 at 09:22 pm
如果觉得我的文章对你有用,请随意赞赏