咳咳,各位观众老爷们,晚上好!我是今晚的主讲人,咱们今天的主题是 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 结合使用,如果 public 为 false ,则 show_ui 也会自动设置为 false 。 |
show_in_menu |
bool | 与 show_ui 相同 |
控制是否在后台菜单中显示分类法。 true 表示显示,false 表示不显示。 只有当 show_ui 为 true 时,这个参数才有效。 可以用来将分类法放在特定的菜单位置。 |
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 | 无 | 默认术语配置。 可以设置 name 和 slug 属性。 |
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 );
}
这段代码做了以下几件事:
- 使用
add_action( 'init', 'register_color_taxonomy' );
将register_color_taxonomy
函数绑定到init
钩子上,确保在 WordPress 初始化完成后执行。 - 在
register_color_taxonomy
函数中,定义了$labels
数组,设置了分类法的各种文字标签。 - 定义了
$args
数组,设置了分类法的各种参数,例如hierarchical
、show_ui
、rewrite
等。 - 调用
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_rest
为 true
:
$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 大神! 下次再见!