最近项目有个需求,一次性获取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
因为有需求,用博主的这个去执行之后发现mysql的@@global.sql_mode需要修改,所以优化了一下sql语句如下
SELECT MAX( object_id ) , MAX(term_taxonomy_id ) FROM ( SELECT * FROM wp_term_relationships ORDER BY object_id DESC ) AS term_rel GROUP BY term_taxonomy_id
大神,还在研究WP,这是准备自己做主题了吗
只是小白一个。O(∩_∩)O~
最近发现以前做的主题,有很大优化的空间。
就把有些逻辑给修改一下。