WordPress数据库系列:理解和使用WordPress中的数据系列七(分类法和分类法项)

480 阅读5分钟

这是我参与更文挑战的第17天,活动详情查看: 更文挑战

本篇翻译参考自Understanding and Working with Taxonomies and Terms in WordPress 它是理解和使用WordPress中的数据系列的第七篇

在WordPress中Terms几乎特指分类法的项目,即某个分类法中的一项或分类法下的项目,为了便于理解,所有term术语翻译为分类法项,

理解和使用WordPress中的分类法和分类法项

分类法是使WordPress超越简单的博客平台并进入CMS领域的原因。

但是,它们在数据库中是如何存储的呢?

分类法和分类法项是WordPress的一项强大功能,可以为网站增加更多的灵活性。它们与其他两种内容类型相关:posts和links。数据库结构意味着这是一对多关系,一个post可以跨多个分类法具有多个分类法项,并且一个分类法项可以分配给多个posts或links。

我将首先从定义它们开始,就像WordPress中的许多东西一样,这些术语也很令人困惑!

定义

分类法——Taxonomies

分类法是对事物进行分类或归类的系统,通常是分层的。最著名的分类法是用于对生物进行归类的林奈氏分类法(Linnean Taxonomy)

林奈氏分类法是现代生物分类法发展的开端,是卡尔·林奈(Carolus Linnaeus)提出的关于对自然界中的生物进行分类的系统。

在WordPress中,分类法用于对数据进行归类并将其分组到集合和子集中。

WordPress内置了三种分类法:

  • 分类目录——category
  • 标签——tag
  • 链接分类——link category

分类目录和标签有点像文章和页面,因为它们是相同类型的内容(分类法),但是默认表现不同,因为分类目录是分层的,而标签则不是。

链接分类工作方式和标签类似,并且理论上可以用于任何对象类型。但是默认它不会显示在post编辑屏幕中,如果启用了链接,则将显示在链接编辑屏幕上。

你还可以使用自定义分类法添加任意数量的额外分类法。并且它们的行为类似于分类目录和标签,并带有(分类法)项。每个分类法都具有与任何内置分类法相同的状态。这在某种程度上类似于文章和自定义post类型之间的比较。

分类法项——Terms

每个分类法都有用来分类数据的项目。一个分类目录只是分类目录分类法下的一个项目;一个标签是标签分类法下的一个项目。当创建分类法后,你可以通过WordPress仪表盘或使用wp_insert_term()函数为你的分类法创建项目。

分类法项结合自定义查询时可以非常强大:你可以在主题或插件中创建自定义模板过滤,用以显示多种条件的posts,比如带有多个分类法项、按分类法项排序、跨分类法确认分类法项等等。

WordPress如何存储分类法和分类法项

如在数据之间的关系教程中介绍的,WordPress使用多对多的关系。使用三个表创建这个关系:

  • wp_term_relationships
  • wp_term_taxonomy
  • wp_terms

这些表以及它们链接到的表wp_postswp_links如下所示:

让我们看一下每个表及其如何工作。

wp_terms表

wp_terms表存储分类目录、标签、链接分类和自定义分类法的所有单个项。只有四个字段:

  • term_id是分类法项的唯一ID
  • name
  • slug
  • term_group是WordPress当前不使用的字段,因此您可以放心地忽略它。

wp_term_taxonomy表

wp_term_taxonomy表存储有关分类法项及其所属分类法的更多数据。它包含六个字段:

  • term_taxonomy_id存储表中该记录的ID
  • term_id代表分类法项的ID,链接到wp_terms表中的该条记录
  • taxonomy是这个分类法项所属分类法的名称
  • description
  • parent表示该分类法项的父分类法项,如果该分类法是分层的并且该项有父分类法项
  • count是该分类法项下posts的数目

在WordPress安装中,wp_terms表中的每个分类法项在wp_term_taxonomy表中都会有一条记录。

terms共享拆分,或拆分共享

从WP4.2版本开始,shared taxonomy terms——those items in the wp_terms table that are shared between multiple taxonomies——will be split into separate terms when one of the shared terms is updated。

即共享分类法项会被拆分。本身一个分类法项被多个分类法共享就很奇怪。不会存在一个分类法项关联多个wp_term_taxonomy表记录的情况。

具体参见Taxonomy term splitting in 4.2: a developer guide

wp_termswp_term_taxonomy表之间为一对一的关系。

wp_term_relationships表

wp_term_relationships表对于在objects和terms之间创建多对多的关系是至关重要的:

  • object_id是链接到wp_posts表中的post_idwp_links表中的link_id。因为link_id几乎已经不存在。可以认为object_id即为wp_posts中的post_id
  • term_taxonomy_id链接到wp_term_taxonomy表相同的字段
  • term_order是添加到object的分类法项的顺序。仅在注册分类法时将sort参数指定为true才会用到——默认值为false。此字段的默认值为0。

因为每个对象都可以与wp_term_relationships表中的多个记录相关,并且每个分类法项也是如此,所以这将创建多对多的关系。

概要

对象(即posts和links)与分类法项之间的关系非常强大,部分原因是它是WordPress使用的唯一的多对多关系。

了解这种关系如何工作以及关键数据的存储位置将帮助您了解分类法和分类法项的工作方式,并使用与它们关联的函数