如何在 WordPress 中创建专属的自定义分类法

已发表: 2022-03-11

WordPress 是最强大的开源博客和内容管理系统之一,它被用于为大部分互联网提供动力。 多达四分之一的网站运行 WordPress,并且对 WordPress 开发服务的需求并不缺乏。

与许多其他 CMS 不同,WordPress 因其灵活性和可定制性而受到许多人的喜爱。 分类法是 WordPress 的核心功能之一,可让您按照需要的方式组织内容。 尽管它内置了一些默认分类法,但 WordPress 允许您添加任意数量的自定义分类法。

但是,让分类法完全按照您希望的方式运行可能需要您摆弄一些未记录的方法。

各种 WordPress 分类选项的图形表示

在本文中,您将了解如何在 WordPress 中定义专有的自定义分类法,这些分类法的行为更像类别而不是标签,允许您对帖子进行比开箱即用的更严格的分类。

什么是分类法?

根据 WordPress 法典:

分类法是将事物组合在一起的一种方式。

例如,可以根据不同的特征将一堆不同类型的水果分组在一起,然后可以为这些组分配名称。

在 WordPress 中,分类法用于对不同组下的帖子、页面甚至自定义帖子类型进行分组。

分类中不同分组的名称称为术语。 以水果为例,以及如何根据颜色对它们进行分组。 在这种情况下,不同颜色的名称将成为术语。

默认情况下,WordPress 内置了四种分类法:类别标签链接类别帖子格式。 您可以在此处了解有关这些默认分类法的更多信息。

在这些内置分类法中,类别和标签非常相似,但有一个重要区别:类别是专有分类法(即,对于每个帖子,您最多可以选择一个类别),而每个帖子可以分配多个标签。

此外,类别通常是预定义的,而标签可以随时定义。

定义自定义分类法

您可以使用register_taxonomy()函数定义自定义分类。 您可以在此处了解有关该功能的更多信息。

要了解此功能的工作原理,让我们为带有风景照片的帖子定义一个自定义分类。

 function view_init() { register_taxonomy( 'view', 'post', array( 'label' => __( 'View' ), 'capabilities' => array( 'assign_terms' => 'edit_guides', 'edit_terms' => 'publish_guides' ) ) ); } add_action( 'init', 'view_init' );

在上面的代码片段中,我们为帖子定义了一个名为view的新分类法。

您可以认为此分类法用于根据照片中存在的视图的种类或性质(例如,山、湖或森林)对照片进行分类。

与往常一样,属于该类别特定术语的帖子将出现在/view/{view_name}下。

上面代码片段中的功能行是可选的。 没有它,WordPress 将默认功能与帖子相同的用户。 如上所示,这将允许任何具有自定义“edit_guides”功能的用户将分类分配给帖子,并允许任何具有自定义“publish_guides”功能的用户创建新的分类项目。

根据官方文档,可以定义四种能力:

分类功能包括assigntermsedittermsmanageterms (在管理导航中显示分类)和deleteterms

如何使用分类法

在您的代码中,您可以使用wp_set_object_terms()函数将术语添加到使用分类法的对象中。 您可以使用the_terms()函数列出现有术语。 此外,您可以使用wp_tag_cloud()函数为您的自定义分类生成一组术语。 您可以在此处了解有关这些功能的更多信息。

在 UI 方面,WordPress 在每个分类的帖子上创建一个新的元框。 元框类似于标签元框,可让您将一个或多个术语链接到您的帖子。 这是 WordPress 默认所做的,这也是我们可以通过使分类排他性来改变的:使自定义分类的行为类似于类别分类。

强制分类法的排他性

当我们使用register_taxonomy()方法创建自定义分类时,WordPress 会在帖子编辑页面中添加一个包含多项选择的元框:

使用此元框,用户可以选择任意数量的现有(已使用)术语,也可以使用文本框添加新术语。

要创建类似类别的分类法,其中每个帖子最多属于一组预定义类别中的一个类别,您可以通过稍微调整 WordPress 来做到这一点:

  • 隐藏 WordPress 创建的默认元框。
  • 在帖子编辑页面上创建一个自定义元框,它将为单个项目选择提供控件。
  • 保存帖子时保存分类值。

让我们来看看每个步骤。

隐藏由 WordPress 创建的默认元框

为此,我们需要在调用register_taxonomy时将show_in_quick_editmeta_box_cb选项设置为false

自定义分类元框的屏幕截图,您可以在其中将项目添加到可用术语集中

第一个选项在快速/批量编辑面板中隐藏分类,第二个选项在帖子编辑页面中隐藏它:

 register_taxonomy( 'custom_taxonomy', 'post', array( 'labels' => array( 'name' => 'Custom Exclusive Taxonomy' ), 'show_in_quick_edit' => false, 'meta_box_cb' => false ));

当默认元框隐藏时,可以通过分类管理页面将项目添加到分类的可用术语集中:

带有多个单选按钮的名为 Custom Exclusive Taxonomy 的元框的屏幕截图

在帖子编辑页面上创建自定义元框

要创建自定义元框,我们可以使用add_meta_boxes WordPress 挂钩。 您可以在此处了解有关钩子的更多信息。

 add_action('add_meta_boxes', 'add_custom_meta_box'); function add_custom_meta_box(){ add_meta_box( 'taxonomy_box', __('Custom Exclusive Taxonomy'), 'fill_custom_meta_box_content', 'post' ,'side'); }

我们使用以下参数调用add_meta_box方法:

  • taxonomy_box – 元框的 ID
  • __('Custom Exclusive Taxonomy') – 元框的标题
  • fill_custom_meta_box_content – 用于填充元框内容的函数
  • post - 这表示元框应该出现在帖子编辑页面上。
  • side - 这表示应该插入元框的位置。

请注意我们如何将taxonomy_box指定为 ID。 然而,正是第三个参数中的函数让我们定义将要放入盒子的内容。

我们现在将实现fill_custom_meta_box_content函数:

 <?php function fill_custom_meta_box_content( $post ) { $terms = get_terms( array( 'taxonomy' => 'custom_taxonomy', 'hide_empty' => false // Retrieve all terms )); // We assume that there is a single category $currentTaxonomyValue = get_the_terms($post->ID, 'custom_taxonomy')[0]; ?> <p>Choose taxonomy value</p> <p> <?php foreach($terms as $term): ?> <input type="radio" name="custom_taxonomy" value="<?php echo $term->term_id;?>"<?php if($term->term_id==$currentTaxonomyValue->term_id) echo "checked"; ?>> <label for="taxonomy_term_<?php echo $term->term_id;?>"><?php echo $term->name; ?></label> </input><br/> <?php endforeach; ?> </p> <?php }

在这里,我们首先检索分类的所有术语(即现有值)。 我们将使用这些来显示单选按钮控件的列表。

接下来,我们使用get_the_terms()函数检索当前选择的分类术语——我们需要它来选择相应的单选按钮。

请注意,此函数返回一个数组。 这是因为,默认情况下,帖子可以有任意数量的与之关联的术语。 根据我们的假设,帖子最多有一个术语,所以我们访问第一个数组元素。 (如果数组为空也没关系;我们将获取null作为当前值,并且不会选择单选按钮。)

发出 HTML 的代码使用custom_taxonomy作为单选按钮的名称,并使用相应的术语 ID 作为它们的值; 单选按钮 ID 属性仅用于连接到标签标签。 结果,我们得到以下自定义元框:

Custom Exclusive Taxonomy 的“添加新标签”功能的屏幕截图现在可在 WordPress 仪表板侧边栏上使用

保存帖子时保存分类值

最后,我们需要在保存帖子时保留分类值。 为此,我们可以使用save_post钩子:

 add_action('save_post', 'save_custom_taxonomy'); function save_custom_taxonomy($post_id){ if ( isset( $_REQUEST['custom_taxonomy'] ) ) wp_set_object_terms($post_id, (int)sanitize_text_field( $_POST['custom_taxonomy'] ), 'custom_taxonomy'); }

就是这样! 我们完了。

您现在知道如何定义一个行为类似于内置类别分类的自定义分类。

注意:WordPress 已接受一项功能请求,以便更轻松地切换自定义分类法的排他性。 但是,该票已经有一段时间没有看到太多的活动了。

包起来

分类法是 WordPress 中一个非常强大且有用的功能。 开箱即用,它们缺乏对帖子进行严格分类的能力,但与 WordPress 中的几乎所有东西一样,分类法和相关功能是高度可定制的。 这使我们可以通过几个步骤来添加这个经常需要的能力。

此处介绍的方法还可用于在帖子编辑页面上为分类术语选择创建更多自定义 UI。

我希望您发现这个关于定义专有自定义分类法的快速教程很有用!