在 wordpress 中,文章的分类和标签都没有直接记录在post表中,需要通过查其他表才能获得。通常认为,term_relationships 就是一张记录文章和其类别 category(或标签tags)的关系表。先来看看表结构:

term_relationships - 里面只有三列:

object_id :文章id
term_taxonomy_id :文章分类id
term_order :顺序

注意表中的 term_taxonomy_id 字段,这个字段是 wordpress 中定义的一种分类方法(taxonomy)的id,这里的分类方法它既包括了类别(category),也包括了标签(tag),将来说不定还可能包含其他的分类因子(例如多媒体索引等)。这个分类方法具有统一的id定义,不能把它仅当作分类(category)或仅当作标签(tag)来使用。

wordpress 中有一张维护这分类方法(taxonomy )的表,表名叫:term_taxonomy,结构如下:

term_taxonomy 里面的字段为:

term_taxonomy_id :分类方法id
term_id :类别id
taxonomy :分类方法名称( category,post_tags )
description :描述
parent :父类别
count :引用数

这个表可以看成是个分类方法字典。里面的 term_taxonomy_id 和 term_relationships 表里的同名字段相对应。特别需要指出的是,这个表里面有一个 term_id 字段,这个字段才是文章的真正类别(category)id 。这个字段和另外一个 parent 字段结合起来,存储了整个类别(category)树的信息。很多时候,term_taxonomy_id 和 term_id 具有同样的值,但这并不是必然的,他们完全可能具有不同的值。所以,当我们需要按类别(category)来操作文章的时候,一定要用这个 term_id 作为检索关键字。

举个例子:假如我们知道某一分类的id值,怎样通过代码来调用这一分类(category)中的最新10篇文章?

假设知道的分类id为10 ,很多人会使用下面的sql语句来实现:

第一个sql:

select posts.*
from $wpdb->posts posts,$wpdb->term_relationships rel
where posts.id=rel.object_id
and rel.term_taxonomy_id=10
order by posts.post_date desc limit 10;

这个语句的问题是直接把 term_taxonomy_id 当作 term_id 来使用。很多时候可能会得出正确的结果,但如果碰到 term_taxonomy_id 和 term_id 的值不一样的时候,结果就错了。正确的写法如下:

第二个sql:

SELECT posts.*
FROM $wpdb->posts posts,$wpdb->term_relationships rel,$wpdb->term_taxonomy tax
WHERE posts.id=rel.object_id 
AND rel.term_taxonomy_id = tax.term_taxonomy_id
AND tax.term_id = 10
ORDER BY posts.post_date DESC LIMIT 10;

第二个sql多链接了一张表:term_taxonomy,用这张表中的 term_id 作为分类(category)id 的依据。这样得出的结果才是正确的。