WordPress Taxonomy 分类系统:register_taxonomy 的层级与查询机制
大家好,今天我们来深入探讨 WordPress taxonomy 分类系统,重点聚焦 register_taxonomy 函数的层级结构以及 taxonomy 的查询机制。taxonomy 是 WordPress 内容组织的核心组成部分,理解其工作原理对于开发自定义主题、插件,以及优化网站内容结构至关重要。
1. Taxonomy 的基本概念
在 WordPress 中,Taxonomy 是对内容进行分组和分类的方法。它允许你将文章、页面和其他自定义文章类型按照不同的维度进行组织。WordPress 默认提供了两种 Taxonomy:
- Category (分类): 用于对文章进行广泛的分类,具有层级结构。
- Tag (标签): 用于对文章进行更具体的标记,不具有层级结构。
除了这两种默认的 Taxonomy,你还可以通过 register_taxonomy 函数创建自定义的 Taxonomy,以满足特定的内容组织需求。
2. register_taxonomy 函数详解
register_taxonomy 函数是定义和注册自定义 Taxonomy 的核心函数。它的基本语法如下:
register_taxonomy(
string $taxonomy,
string|string[] $object_type,
array $args = array()
);
$taxonomy(string, required): Taxonomy 的名称。这个名称必须是唯一的,并且只能包含小写字母、数字和下划线。长度不超过 32 个字符。$object_type(string|string[], required): 与 Taxonomy 关联的文章类型。可以是单个文章类型名称的字符串,也可以是文章类型名称的数组。例如,'post'、'page'、['post', 'page']。$args(array, optional): 一个包含 Taxonomy 配置选项的数组。这个数组允许你自定义 Taxonomy 的各种属性,例如标签、是否具有层级结构、是否显示在管理界面等等。
$args 数组的主要参数:
| 参数名 | 类型 | 描述 | 默认值 | |
|---|---|---|---|---|
labels |
array | 用于自定义 Taxonomy 的标签,例如 name (Taxonomy 的复数名称), singular_name (Taxonomy 的单数名称), edit_item (编辑项目), update_item (更新项目) 等。 |
基于 Taxonomy 名称和是否具有层级结构自动生成 | |
hierarchical |
bool | 指示 Taxonomy 是否具有层级结构。如果设置为 true,则 Taxonomy 类似于 Category,具有父子关系。如果设置为 false,则 Taxonomy 类似于 Tag,没有层级关系。 |
false |
|
public |
bool | 指示 Taxonomy 是否对公众可见。如果设置为 true,则 Taxonomy 将显示在前端和管理界面中。 |
true |
|
show_ui |
bool | 指示是否在 WordPress 管理界面中显示 Taxonomy 编辑界面。 | true |
|
show_admin_column |
bool | 指示是否在文章列表页面显示 Taxonomy 的列。 | false |
|
query_var |
string | 用于在 URL 中传递 Taxonomy 数据的查询变量名称。 | Taxonomy 名称 | |
rewrite |
array | bool | 控制 Taxonomy 的 URL 重写规则。可以是一个数组,包含 slug (URL 中的 Taxonomy 名称), with_front (是否包含首页 URL 前缀), hierarchical (是否包含层级结构) 等选项。也可以是一个布尔值true或false,为true时wordpress自动生成slug。为false时禁用rewrite |
true |
show_in_rest |
bool | 指示是否在 REST API 中公开 Taxonomy。 | false |
一个自定义 Taxonomy 的示例:
假设我们要创建一个名为 "book_genre" 的自定义 Taxonomy,用于对书籍进行分类。这个 Taxonomy 具有层级结构,并且与 "book" 自定义文章类型关联。
function register_book_genre_taxonomy() {
$labels = array(
'name' => _x( 'Book Genres', 'taxonomy general name' ),
'singular_name' => _x( 'Book Genre', 'taxonomy singular name' ),
'search_items' => __( 'Search Book Genres' ),
'all_items' => __( 'All Book Genres' ),
'parent_item' => __( 'Parent Book Genre' ),
'parent_item_colon' => __( 'Parent Book Genre:' ),
'edit_item' => __( 'Edit Book Genre' ),
'update_item' => __( 'Update Book Genre' ),
'add_new_item' => __( 'Add New Book Genre' ),
'new_item_name' => __( 'New Book Genre Name' ),
'menu_name' => __( 'Book Genre' ),
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'book-genre' ),
'show_in_rest' => true,
);
register_taxonomy( 'book_genre', 'book', $args );
}
add_action( 'init', 'register_book_genre_taxonomy', 0 );
在这个示例中,我们首先定义了一个 $labels 数组,用于自定义 Taxonomy 的标签。然后,我们定义了一个 $args 数组,设置了 Taxonomy 的属性,例如 hierarchical (设置为 true 表示具有层级结构), public (设置为 true 表示对公众可见), show_ui (设置为 true 表示在管理界面中显示编辑界面), rewrite (设置 URL 重写规则)。最后,我们调用 register_taxonomy 函数来注册 Taxonomy,并将 Taxonomy 名称、文章类型和参数数组传递给它。
3. Taxonomy 的层级结构
hierarchical 参数决定了 Taxonomy 是否具有层级结构。
hierarchical=>true: Taxonomy 具有层级结构,类似于 Category。这意味着 Taxonomy 可以有父级 Term,并且 Term 之间可以形成父子关系。例如,一个 Book Genre 可以有子 Book Genre,例如 "Fiction" 可以有 "Science Fiction" 和 "Fantasy" 作为子 Book Genre。hierarchical=>false: Taxonomy 没有层级结构,类似于 Tag。这意味着 Taxonomy 不能有父级 Term,所有 Term 都是同级的。例如,一个 Book Tag 不可能有父 Book Tag。
层级 Taxonomy 的数据存储:
层级 Taxonomy 的 Term 之间的父子关系存储在 wp_term_taxonomy 表中的 parent 字段中。parent 字段存储的是父级 Term 的 ID。
4. Taxonomy 的查询机制
WordPress 提供了多种方法来查询 Taxonomy 中的 Term。
4.1. 获取与文章关联的 Term:wp_get_post_terms()
wp_get_post_terms() 函数用于获取与指定文章关联的 Term。它的基本语法如下:
wp_get_post_terms(
int $post_id,
string $taxonomy,
array $args = array()
);
$post_id(int, required): 文章的 ID。$taxonomy(string, required): Taxonomy 的名称。$args(array, optional): 一个包含查询选项的数组。
$args 数组的主要参数:
| 参数名 | 类型 | 描述
// 假设文章 ID 为 10
$post_id = 10;
$taxonomy = 'book_genre';
$terms = wp_get_post_terms( $post_id, $taxonomy );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
echo "<ul>";
foreach ( $terms as $term ) {
echo '<li><a href="' . esc_url( get_term_link( $term ) ) . '">' . $term->name . '</a></li>';
}
echo "</ul>";
} else {
echo "No " . $taxonomy . " found for this post.";
}
这段代码会获取 ID 为 10 的文章关联的所有 "book_genre" Term,并以链接的形式显示在无序列表中。
4.2. 获取 Taxonomy 的所有 Term:get_terms()
get_terms() 函数用于获取指定 Taxonomy 的所有 Term。它的基本语法如下:
get_terms(
array|string $taxonomy,
array $args = array()
);
$taxonomy(array|string, required): Taxonomy 的名称。可以是单个 Taxonomy 名称的字符串,也可以是 Taxonomy 名称的数组。$args(array, optional): 一个包含查询选项的数组。
$args 数组的主要参数:
| 参数名 | 类型 | 描述