阐述 WordPress `register_taxonomy()` 函数的源码:如何注册自定义分类法。

咳咳,各位观众老爷们,晚上好!我是今晚的主讲人,咱们今天的主题是 WordPress 的 register_taxonomy() 函数,简单来说,就是教你如何在 WordPress 里创造属于你自己的“分类方式”。

这玩意儿就像是你家里的储物柜,WordPress 默认给你提供了“分类目录”和“标签”两个柜子,但如果你想把衣服按照颜色、季节、材质分类,或者把书按照作者、题材、出版社分类,那就需要自己定制储物柜,也就是用 register_taxonomy() 注册自定义分类法。

准备好了吗?咱们这就开始拆解这个函数,看看它到底是怎么运作的!

一、register_taxonomy() 函数概览

首先,咱们先来认识一下 register_taxonomy() 函数的庐山真面目:

register_taxonomy(
    string   $taxonomy,
    string|string[] $object_type,
    array|string  $args = array()
);

别被这一堆参数吓到,其实它很简单:

  • $taxonomy (string): 这是你自定义分类法的名字,就像给你的储物柜贴个标签,告诉别人这叫什么,比如 ‘color’(颜色)、’season’(季节)或者 ‘author’(作者)。 必须是小写字母,不能包含空格,只能使用字母、数字和下划线。 建议使用前缀,避免与其他插件或主题冲突,例如 ‘myplugin_color’。

  • $object_type (string|string[]): 这是指定你的分类法是用于哪个类型的文章的,也就是你的储物柜是用来放衣服还是放书的。可以是文章类型 (post types) 的名称,比如 ‘post’(文章)、’page’(页面)或者自定义文章类型。 可以是一个字符串,也可以是一个字符串数组,表示多个文章类型。

  • $args (array|string): 这个参数就厉害了,它包含了各种各样的设置,决定了你的分类法长什么样,怎么运作,就像是储物柜的材质、大小、隔板数量等等。 我们后面会详细讲解这个参数。 如果传入的是字符串,WordPress会把这个字符串当做 labels 数组里的 name 的值。 不建议这么做,可读性太差。

二、$args 参数详解:打造独一无二的分类法

$args 参数是 register_taxonomy() 函数的核心,它决定了你的分类法的所有行为和外观。它是一个数组,里面包含了很多键值对,每个键对应一个设置选项。

咱们来逐个击破这些选项,看看它们都控制着什么:

参数名称 数据类型 默认值 说明
labels array 自动生成,但建议自定义 定义分类法在 WordPress 后台界面显示的各种文字标签,例如分类法的名称、添加新分类法的提示语等等。
public bool true 控制分类法是否对公众可见。true 表示可见,false 表示不可见。 如果设置为 false,则分类法不会出现在前台,也不会出现在后台的编辑页面。 通常用于内部使用的分类法。
show_ui bool true 控制是否在 WordPress 后台界面显示分类法的管理界面。true 表示显示,false 表示不显示。 如果设置为 false,则无法在后台添加、编辑或删除分类法。 通常与 public 结合使用,如果 publicfalse,则 show_ui 也会自动设置为 false
show_in_menu bool show_ui 相同 控制是否在后台菜单中显示分类法。 true 表示显示,false 表示不显示。 只有当 show_uitrue 时,这个参数才有效。 可以用来将分类法放在特定的菜单位置。
show_in_nav_menus bool true 控制是否允许在导航菜单中使用分类法。true 表示允许,false 表示不允许。 如果设置为 false,则无法在导航菜单中添加分类法。
show_tagcloud bool true 控制是否允许在标签云中使用分类法。true 表示允许,false 表示不允许。 如果设置为 false,则无法在标签云中显示分类法。
show_in_quick_edit bool true (since 5.2) 控制是否在快速编辑页面中显示分类法。true 表示显示,false 表示不显示。 如果设置为 false,则无法在快速编辑页面中修改文章的分类法。
show_admin_column bool false (since 3.5) 控制是否在文章列表页面中显示分类法的列。true 表示显示,false 表示不显示。 如果设置为 true,则可以在文章列表页面中直接查看和编辑文章的分类法。 可以方便地批量管理文章的分类法。
hierarchical bool false 控制分类法是否具有层级关系,类似于“分类目录”。true 表示具有层级关系,false 表示没有层级关系,类似于“标签”。 如果设置为 true,则可以创建父分类和子分类。 例如,“颜色”分类法可以设置为非层级关系,而“图书分类”分类法可以设置为层级关系。
rewrite array true (默认会根据分类法名称生成 URL) 控制分类法的 URL 重写规则。 可以自定义分类法的 URL 结构。 rewrite 参数是一个数组,包含以下选项:slug (string): 自定义 URL 的 slug(别名)。 with_front (bool): 是否在 URL 中包含 WordPress 的前缀。 hierarchical (bool): 是否使用层级结构的 URL。 ep_mask (const): 定义 endpoint mask。
query_var string true (默认使用分类法名称) 控制是否允许通过 URL 查询分类法。 如果设置为 false,则无法通过 URL 查询分类法。 可以设置为一个字符串,作为查询变量的名称。
update_count_callback string '' 更新分类法计数的回调函数。 在添加、编辑或删除文章时,会自动调用这个函数来更新分类法的计数。 通常不需要修改这个参数。
capabilities array 自动生成,但建议自定义 定义管理分类法所需的权限。 可以自定义用户角色对分类法的访问权限。 capabilities 参数是一个数组,包含以下选项:manage_terms (string): 管理分类法的权限。 edit_terms (string): 编辑分类法的权限。 delete_terms (string): 删除分类法的权限。 assign_terms (string): 分配分类法的权限。
meta_box_cb callable null (默认使用标准的 meta box) 自定义 meta box 的回调函数。 可以自定义在文章编辑页面显示的 meta box。 如果设置为 false,则不显示 meta box。
show_admin_column bool false (since 3.5) 是否在文章列表页面显示此分类法的列。
rest_base string 分类法名称 REST API 的基础路由。
rest_controller_class string WP_REST_Terms_Controller REST API 控制器类。
default_term array 默认术语配置。 可以设置 nameslug 属性。
sort bool null 是否应该按字母顺序对关联的术语进行排序。

2.1 labels 参数:为你的分类法穿上漂亮的衣服

labels 参数是一个数组,用于定义分类法在 WordPress 后台界面显示的各种文字标签。 就像给你的储物柜贴上各种标签,告诉别人这个储物柜是用来干嘛的,怎么使用。

$labels = array(
    'name'                       => _x( 'Colors', 'taxonomy general name' ),
    'singular_name'              => _x( 'Color', 'taxonomy singular name' ),
    'search_items'               => __( 'Search Colors' ),
    'popular_items'              => __( 'Popular Colors' ),
    'all_items'                  => __( 'All Colors' ),
    'parent_item'                => __( 'Parent Color' ),
    'parent_item_colon'          => __( 'Parent Color:' ),
    'edit_item'                  => __( 'Edit Color' ),
    'update_item'                => __( 'Update Color' ),
    'add_new_item'               => __( 'Add New Color' ),
    'new_item_name'             => __( 'New Color Name' ),
    'separate_items_with_commas' => __( 'Separate colors with commas' ),
    'add_or_remove_items'        => __( 'Add or remove colors' ),
    'choose_from_most_used'      => __( 'Choose from the most used colors' ),
    'not_found'                  => __( 'No colors found.' ),
    'menu_name'                  => __( 'Colors' ),
);

这些标签分别控制着分类法在后台的不同位置显示的文字,例如:

  • name: 分类法的复数名称,显示在后台菜单中,例如 "Colors"。
  • singular_name: 分类法的单数名称,例如 "Color"。
  • search_items: 搜索分类法时的提示语,例如 "Search Colors"。
  • all_items: 显示所有分类法时的标题,例如 "All Colors"。
  • edit_item: 编辑分类法时的标题,例如 "Edit Color"。
  • add_new_item: 添加新分类法时的标题,例如 "Add New Color"。

等等等等,总之就是各种各样的文字提示,让用户更容易理解和使用你的分类法。

2.2 public 参数:决定你的分类法是否抛头露面

public 参数控制分类法是否对公众可见。 如果设置为 true,则分类法会出现在前台,并且可以通过 URL 访问。 如果设置为 false,则分类法只在后台可见,通常用于内部使用的分类法。

2.3 hierarchical 参数:打造树状结构的分类法

hierarchical 参数控制分类法是否具有层级关系,类似于“分类目录”。 如果设置为 true,则可以创建父分类和子分类,形成一个树状结构。 如果设置为 false,则没有层级关系,类似于“标签”。

例如,“图书分类”分类法可以设置为层级关系,可以有“小说”、“科幻”、“历史”等父分类,每个父分类下还可以有更细的子分类。 而“颜色”分类法通常设置为非层级关系,因为颜色之间没有明显的父子关系。

2.4 rewrite 参数:定制你的分类法 URL

rewrite 参数控制分类法的 URL 重写规则。 可以自定义分类法的 URL 结构,让它更符合你的需求和 SEO 优化。

'rewrite' => array(
    'slug'         => 'book-category', // 自定义 URL 的 slug
    'with_front'   => false, // 是否在 URL 中包含 WordPress 的前缀(例如 /blog/)
    'hierarchical' => true, // 是否使用层级结构的 URL
),
  • slug: 自定义 URL 的 slug(别名),例如 ‘book-category’,则分类法的 URL 可能是 http://example.com/book-category/fiction/
  • with_front: 是否在 URL 中包含 WordPress 的前缀,例如 /blog/
  • hierarchical: 是否使用层级结构的 URL,如果设置为 true,则子分类的 URL 会包含父分类的 slug。

三、实战演练:注册一个自定义分类法

理论知识讲了一大堆,咱们来点实际的,创建一个自定义分类法“颜色”,用于文章类型“post”。

add_action( 'init', 'register_color_taxonomy' );

function register_color_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Colors', 'taxonomy general name' ),
        'singular_name'              => _x( 'Color', 'taxonomy singular name' ),
        'search_items'               => __( 'Search Colors' ),
        'popular_items'              => __( 'Popular Colors' ),
        'all_items'                  => __( 'All Colors' ),
        'parent_item'                => __( 'Parent Color' ),
        'parent_item_colon'          => __( 'Parent Color:' ),
        'edit_item'                  => __( 'Edit Color' ),
        'update_item'                => __( 'Update Color' ),
        'add_new_item'               => __( 'Add New Color' ),
        'new_item_name'             => __( 'New Color Name' ),
        'separate_items_with_commas' => __( 'Separate colors with commas' ),
        'add_or_remove_items'        => __( 'Add or remove colors' ),
        'choose_from_most_used'      => __( 'Choose from the most used colors' ),
        'not_found'                  => __( 'No colors found.' ),
        'menu_name'                  => __( 'Colors' ),
    );

    $args = array(
        'hierarchical'          => false, // 类似于标签,没有层级关系
        'labels'                => $labels,
        'show_ui'               => true, // 在后台显示管理界面
        'show_admin_column'     => true, // 在文章列表页面显示颜色列
        'update_count_callback' => '_update_post_term_count',
        'query_var'             => true,
        'rewrite'               => array( 'slug' => 'color' ), // URL slug 为 'color'
    );

    register_taxonomy( 'color', 'post', $args );

}

这段代码做了以下几件事:

  1. 使用 add_action( 'init', 'register_color_taxonomy' );register_color_taxonomy 函数绑定到 init 钩子上,确保在 WordPress 初始化完成后执行。
  2. register_color_taxonomy 函数中,定义了 $labels 数组,设置了分类法的各种文字标签。
  3. 定义了 $args 数组,设置了分类法的各种参数,例如 hierarchicalshow_uirewrite 等。
  4. 调用 register_taxonomy( 'color', 'post', $args ); 函数,注册了名为 ‘color’ 的自定义分类法,用于文章类型 ‘post’,并使用 $args 数组中的参数进行配置。

将这段代码添加到你的主题的 functions.php 文件中,或者添加到你的自定义插件中,然后刷新你的 WordPress 后台,你就会在文章编辑页面看到一个新的 meta box,用于选择文章的颜色。同时,你也会在文章列表页面看到一个新的“颜色”列,显示文章所属的颜色。

四、进阶技巧:REST API 支持

从 WordPress 4.7 开始,自定义分类法也支持 REST API。 这意味着你可以通过 REST API 来创建、读取、更新和删除分类法。

要启用 REST API 支持,需要在 $args 数组中设置 show_in_resttrue

$args = array(
    // ... 其他参数 ...
    'show_in_rest' => true, // 启用 REST API 支持
    'rest_base'    => 'colors', // REST API 的基础路由
    'rest_controller_class' => 'WP_REST_Terms_Controller', // REST API 控制器类
);
  • show_in_rest: 设置为 true 以启用 REST API 支持。
  • rest_base: REST API 的基础路由,例如 ‘colors’,则可以通过 http://example.com/wp-json/wp/v2/colors 访问分类法。
  • rest_controller_class: REST API 控制器类,通常使用默认的 WP_REST_Terms_Controller

五、注意事项:避免踩坑

  • 分类法名称必须是小写字母,不能包含空格,只能使用字母、数字和下划线。
  • 建议使用前缀,避免与其他插件或主题冲突。
  • 在注册分类法之前,确保文章类型已经注册。
  • 修改分类法参数后,需要刷新 WordPress 的 rewrite rules,才能使 URL 重写规则生效。 可以在后台的“设置” -> “固定链接”页面,点击“保存更改”按钮来刷新 rewrite rules。

六、总结:掌握自定义分类法的力量

register_taxonomy() 函数是 WordPress 中一个非常强大的工具,可以让你创建各种各样的自定义分类法,扩展 WordPress 的功能,更好地组织和管理你的内容。 掌握了这个函数,你就可以像搭积木一样,自由地定制你的 WordPress 网站。

好了,今天的讲座就到这里,希望大家能够学有所获,早日成为 WordPress 大神! 下次再见!

发表回复

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