2013年8月15日星期四

Wordpress顶级category转换为tag(为特定category及其子孙category中的文章统一添加特定tag)

wp_terms存储的是term的基本信息,包括term_id、name、slug等。
wp_term_taxonomy存储的是term_taxonomy的信息,即和posts直接发生关系的具体的category、tag、menu等,term_taxonomy_id和term_id是多对一的关系,比如有一个category和一个tag有同样的name和slug,那么它们会有不同的term_taxonomy_id,和相同的term_id。taxonomy是其具体所属的类别,包括category、nav_menu、post_tag等。
wp_term_relationships存储的则是广义上的posts和term_taxonomy之间的关系,object_id和term_taxonomy_id是一对多的关系,即一篇文章可以属于多个分类,拥有多个tag。

想将某顶级category转为tag,实质就是将其所有子孙category中的文章加上一个特定tag,处理完成后删除此category。思路是检查每篇文章所属的category是否为顶级category,若否,则找出其上级category,直到是顶级为止。若为预期的转换对象,则为此篇文章添加目标tag。

具体而言,就是检查wp_term_relationships,得到每个object_id对应的term_taxonomy_id;
去wp_term_taxonomy检查此term_taxonomy_id的parent是否为0,若非,则检查其parent的parent,直到为0;得到此时原term_taxonomy_id现在对应的祖先term_taxonomy_id,找出其所对应的term_id;
对照wp_terms,看此term_id对应的name是否为预期的转换对象;
若是,则在wp_term_relationships添加一条记录,内容为此object_id和预期的目标tag的term_taxonomy_id。

之后计数项(wp_term_taxonomy中的count)不会自动刷新,随便找篇文章对预期目标tag的状态进行修改,保存即可。