如何(以及为什么)将WordPress标签从“扁平”转换为“分层”

Avatar of Thomas McGee
Thomas McGee

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200美元免费积分!

以下是来自 Writely Designed 的 Thomas McGee (@ThomasEMcGee) 的客座文章。Thomas 发现能够在 WordPress 中使用父子标签非常有用。但是,如果您想这样做,则需要做一些工作,因为 WordPress 默认情况下不提供此功能。

WordPress 标签是平台组织方法的关键。一些网站仅使用分类即可,但对于大多数网站而言,分类和标签就像面包和黄油一样——一个不可分割的团队,有助于使内容易于管理、整洁,并方便读者查找。

无论您是 WordPress 新手还是经验丰富的专业人士,您都可能体验过这两个 WordPress 组织工具之间的区别。分类是“分层”的,这意味着它们能够保存父项和子项。此外,分类会维护一个所有先前创建和使用过的分类的正在运行的复选框“列表”。

另一方面,标签是“扁平”的,不包含任何父项或子项——可以说,所有内容都在同一“级别”。标签没有提供给分类的“清单”格式,而是显示一个简单的文本框,您可以在其中输入逗号分隔的项目。与分类类似,您可以在“标签云”格式中查看“最常用的标签”。如果您有兴趣对标签的组织进行微调控制,那么问题在于,这可能在一眨眼之间变得杂乱无章。

分类通常用于广泛或通用主题,而标签则更具体一些。如果我们以新闻网站为例,它可能会使用“技术”类别和“苹果”之类的标签。

除了解释之外,在这篇文章中,我将探讨如何(以及为什么)将标准的“扁平”WordPress标签转换为类似分类的分层格式。

为什么要使用“分层”标签?

“我已经有像分类一样工作的分类了,为什么还要让我的标签也像分类一样工作?”

如果我自己没有在一个我正在构建的 WordPress 主题中尝试过,我可能会问同样的问题。但是,在我尝试这个概念的过程中,我发现只有优点。也就是说,如果组织和可维护性对您的(或您的用户)WordPress 结构很重要,那么它就是优点。

标签的一个有用特性是,它们是独立于分类组织内容的一种方式。正如我在上面提到的,分类非常适合最通用的内容,标签则非常适合特定的内容。

虽然标签非常适合快速列出与文章相关的主题,但标签很容易变得杂乱、混乱和不一致。如果您有各种各样的贡献者能够自己添加标签,则将其乘以十或一百。

解决此问题的一个方法是将标签转换为分层格式。方法保持不变;也就是说,分类坚持通用主题,标签坚持特定主题,但额外的好处是为标签的维护提供了更多结构。

“但是我喜欢能够连续输入标签。”

虽然分层标签元框不允许您使用正常的逗号分隔输入方法,但您仍然能够连续输入标题。这是可能的,因为 WordPress 足够聪明,可以知道某个分类(或标签,在我们的例子中)是否已经存在,并将检查该项目而不是创建重复项。结果是您或您的用户能够连续输入标签或单击复选框以将相关标签分配给帖子。

键入以添加新的父标签

但是,这种方法有一个警告。为了让项目在您输入时“选中”,它们必须是父标签,而不是子标签。如果您输入子标签名称,它将简单地将其创建为新的父标签。

“我的 WordPress 网站上已经有大量的标签了,这不会破坏永久链接吗?”

如果此方法正确实现,则不会。这个概念的好处之一是,您可以尝试一段时间,然后切换回旧式的标签样式,而不会丢失任何以前的标签结构。如果您决定来回切换几次,则可能会丢失一些分层数据,但这是一种不太可能的情况。

正确实现的分层标签保持永久链接结构。

如前所述,分层标签的最大好处是在管理后台内增加了组织控制。在前端用户导航和使用带标签的文章方面,不会有明显的区别。

但是,在后端,您可以开始构建一个易于理解、可读和易于管理的标签库。它对您自己非常有用,如果您正在运行一个接受客座贡献者的网站,则更有用。此结构化系统极大地帮助防止了冗余标签。如果您曾经决定滚动浏览您的活动标签并看到“响应式”、“响应式设计”、“RWD”、“响应式网页设计”等条目,您就知道我的意思了。使用分层标签方法,您可以创建一个带有“响应式网页设计”子标签的“技术”父标签,并且作者在撰写有关该特定主题的文章时始终知道在哪里查找。

如果您熟悉 Evernote 的标签组织方法,您可能会注意到分层标签的方法在很大程度上遵循相同的思路。

Evernote 使用分层方法处理标签

这为 Evernote 用户带来的好处是能够构建一个遵循逻辑模式的无限主题库。这有助于在扫描或浏览时更容易找到项目,同时保留搜索特定标签的功能。

如何将 WordPress 内置的扁平标签转换为等效的分层标签

如果您认同分层标签的想法,或者只是想尝试一下,则进行更改的方法涉及使用您自己的改编版本覆盖 WordPress 的内置标签。

第一步是维护分类法的重写,以防止永久链接被打乱

// Maintain the built-in rewrite functionality of WordPress tags

global $wp_rewrite;

$rewrite =  array(
  'hierarchical'              => false, // Maintains tag permalink structure
  'slug'                      => get_option('tag_base') ? get_option('tag_base') : 'tag',
  'with_front'                => ! get_option('tag_base') || $wp_rewrite->using_index_permalinks(),
  'ep_mask'                   => EP_TAGS,
);

接下来,我们需要指定显示的分类法标签。在本例中,我们保留了标签的原始名称

// Redefine tag labels (or leave them the same)

$labels = array(
  'name'                       => _x( 'Tags', 'Taxonomy General Name', 'hierarchical_tags' ),
  'singular_name'              => _x( 'Tag', 'Taxonomy Singular Name', 'hierarchical_tags' ),
  'menu_name'                  => __( 'Taxonomy', 'hierarchical_tags' ),
  'all_items'                  => __( 'All Tags', 'hierarchical_tags' ),
  'parent_item'                => __( 'Parent Tag', 'hierarchical_tags' ),
  'parent_item_colon'          => __( 'Parent Tag:', 'hierarchical_tags' ),
  'new_item_name'              => __( 'New Tag Name', 'hierarchical_tags' ),
  'add_new_item'               => __( 'Add New Tag', 'hierarchical_tags' ),
  'edit_item'                  => __( 'Edit Tag', 'hierarchical_tags' ),
  'update_item'                => __( 'Update Tag', 'hierarchical_tags' ),
  'view_item'                  => __( 'View Tag', 'hierarchical_tags' ),
  'separate_items_with_commas' => __( 'Separate tags with commas', 'hierarchical_tags' ),
  'add_or_remove_items'        => __( 'Add or remove tags', 'hierarchical_tags' ),
  'choose_from_most_used'      => __( 'Choose from the most used', 'hierarchical_tags' ),
  'popular_items'              => __( 'Popular Tags', 'hierarchical_tags' ),
  'search_items'               => __( 'Search Tags', 'hierarchical_tags' ),
  'not_found'                  => __( 'Not Found', 'hierarchical_tags' ),
);

现在我们已经努力维护标签的基本结构,我们可以将分类法结构从扁平更改为分层

// Override structure of built-in WordPress tags

register_taxonomy( 'post_tag', 'post', array(
  'hierarchical'              => true, // Was false, now set to true
  'query_var'                 => 'tag',
  'labels'                    => $labels,
  'rewrite'                   => $rewrite,
  'public'                    => true,
  'show_ui'                   => true,
  'show_admin_column'         => true,
  '_builtin'                  => true,
) );

如果您想将 WordPress 的内置标签名称更改为其他名称,则可以通过修改$labels数组中的所有内容来执行此操作,而不会干扰永久链接。

// Let's change Tags to Topics

$labels = array(
  'name'                  => _x( 'Topics', 'taxonomy general name' ),
  'singular_name'         => _x( 'Topic', 'taxonomy singular name' ),
  'search_items'          => __( 'Search Topics' ),
  'all_items'             => __( 'All Topics' ),
  'parent_item'           => __( 'Parent Topic' ),
  'parent_item_colon'     => __( 'Parent Topic:' ),
  'edit_item'             => __( 'Edit Topic' ),
  'update_item'           => __( 'Update Topic' ),
  'add_new_item'          => __( 'Add New Topic' ),
  'new_item_name'         => __( 'New Topic Name' ),
  'not_found'             => __( 'No topics found.' ),
  'menu_name'             => __( 'Topics' ),
);

将所有内容整合在一起

一旦我们创建了修改标签分类法所需的所有部分,我们就可以使用与init WordPress 操作钩子绑定的函数将所有内容绑定在一起。

如果您正在使用 WordPress 主题(或子主题),您可以简单地将其添加到您的functions.php文件或 功能插件

function wd_hierarchical_tags_register() {

  // Maintain the built-in rewrite functionality of WordPress tags

  global $wp_rewrite;

  $rewrite =  array(
    'hierarchical'              => false, // Maintains tag permalink structure
    'slug'                      => get_option('tag_base') ? get_option('tag_base') : 'tag',
    'with_front'                => ! get_option('tag_base') || $wp_rewrite->using_index_permalinks(),
    'ep_mask'                   => EP_TAGS,
  );

  // Redefine tag labels (or leave them the same)

  $labels = array(
    'name'                       => _x( 'Tags', 'Taxonomy General Name', 'hierarchical_tags' ),
    'singular_name'              => _x( 'Tag', 'Taxonomy Singular Name', 'hierarchical_tags' ),
    'menu_name'                  => __( 'Taxonomy', 'hierarchical_tags' ),
    'all_items'                  => __( 'All Tags', 'hierarchical_tags' ),
    'parent_item'                => __( 'Parent Tag', 'hierarchical_tags' ),
    'parent_item_colon'          => __( 'Parent Tag:', 'hierarchical_tags' ),
    'new_item_name'              => __( 'New Tag Name', 'hierarchical_tags' ),
    'add_new_item'               => __( 'Add New Tag', 'hierarchical_tags' ),
    'edit_item'                  => __( 'Edit Tag', 'hierarchical_tags' ),
    'update_item'                => __( 'Update Tag', 'hierarchical_tags' ),
    'view_item'                  => __( 'View Tag', 'hierarchical_tags' ),
    'separate_items_with_commas' => __( 'Separate tags with commas', 'hierarchical_tags' ),
    'add_or_remove_items'        => __( 'Add or remove tags', 'hierarchical_tags' ),
    'choose_from_most_used'      => __( 'Choose from the most used', 'hierarchical_tags' ),
    'popular_items'              => __( 'Popular Tags', 'hierarchical_tags' ),
    'search_items'               => __( 'Search Tags', 'hierarchical_tags' ),
    'not_found'                  => __( 'Not Found', 'hierarchical_tags' ),
  );

  // Override structure of built-in WordPress tags

  register_taxonomy( 'post_tag', 'post', array(
    'hierarchical'              => true, // Was false, now set to true
    'query_var'                 => 'tag',
    'labels'                    => $labels,
    'rewrite'                   => $rewrite,
    'public'                    => true,
    'show_ui'                   => true,
    'show_admin_column'         => true,
    '_builtin'                  => true,
  ) );

}
add_action('init', 'wd_hierarchical_tags_register');

实现此功能后,您应该会在网站的管理后台看到分层标签结构。

向 WordPress 添加新的分类法

假设您喜欢分层标签显示的整个组织方法。但是,修改内置标签的想法根本不适合您的配置。另一种解决方案是创建一个全新的分类法,并在分类和标签之上使用它。

遵循上面探讨的许多概念,您可以添加一个具有您选择的设置的分层“主题”分类法。

// Register Custom Taxonomy
function wd_topics_taxonomy() {

  $labels = array(
    'name'                       => _x( 'Topics', 'Taxonomy General Name', 'hierarchical_tags' ),
    'singular_name'              => _x( 'Topic', 'Taxonomy Singular Name', 'hierarchical_tags' ),
    'menu_name'                  => __( 'Taxonomy', 'hierarchical_tags' ),
    'all_items'                  => __( 'All Items', 'hierarchical_tags' ),
    'parent_item'                => __( 'Parent Item', 'hierarchical_tags' ),
    'parent_item_colon'          => __( 'Parent Item:', 'hierarchical_tags' ),
    'new_item_name'              => __( 'New Item Name', 'hierarchical_tags' ),
    'add_new_item'               => __( 'Add New Item', 'hierarchical_tags' ),
    'edit_item'                  => __( 'Edit Item', 'hierarchical_tags' ),
    'update_item'                => __( 'Update Item', 'hierarchical_tags' ),
    'view_item'                  => __( 'View Item', 'hierarchical_tags' ),
    'separate_items_with_commas' => __( 'Separate items with commas', 'hierarchical_tags' ),
    'add_or_remove_items'        => __( 'Add or remove items', 'hierarchical_tags' ),
    'choose_from_most_used'      => __( 'Choose from the most used', 'hierarchical_tags' ),
    'popular_items'              => __( 'Popular Items', 'hierarchical_tags' ),
    'search_items'               => __( 'Search Items', 'hierarchical_tags' ),
    'not_found'                  => __( 'Not Found', 'hierarchical_tags' ),
  );
  $args = array(
    'labels'                     => $labels,
    'hierarchical'               => true,
    'public'                     => true,
    'show_ui'                    => true,
    'show_admin_column'          => true,
    'show_in_nav_menus'          => true,
    'show_tagcloud'              => true,
  );
  register_taxonomy( 'topics', array( 'post' ), $args );

}

// Hook into the 'init' action
add_action( 'init', 'wd_topics_taxonomy', 0 );

此方法的主要挑战在于,在创建新的分类法后,您需要将其前端可见性集成到您的主题或子主题中,而大多数主题已经内置了对标签的适应。

其他资源

如果您发现需要将功能扩展到此处显示的示例之外,以下其他资源可能会派上用场。

结论

WordPress 仍然可以说是现存功能最强大、可定制性和可扩展性最强的 CMS。通过本文介绍的所有内容,希望能够激发您一些关于如何优化 WordPress 的组织能力并进一步推动该平台发展的想法。