分析WordPress taxonomy分类系统register_taxonomy的层级与查询机制

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 (是否包含层级结构) 等选项。也可以是一个布尔值truefalse,为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 数组的主要参数:

| 参数名 | 类型 | 描述

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注