WordPress提供了一种方法来查找所有没有孩子的类别吗?

时间:2014-08-21 作者:gate_engineer

Background

如中所述Is There a Difference Between Taxonomies and Categories, 分类法是指对对象或数据进行分类和组织的通用系统。如果是WordPress;类别、标记、帖子格式(ting)和链接类别是在分类法中构建的,用于帮助分类和组织帖子、链接和元数据。术语是这些分类法的实例;以WordPress关于计算机软件的博客为例。如果其中一个分类法是一个类别,那么其中一个术语就是编程语言,因为编程语言是计算机软件中的一个主题,可以被视为一个分类法。此外,WordPress开发人员和插件开发人员可以利用register_taxonomy() 函数初始化内置分类法,以及在WordPress中创建新分类法。

Working with WordPress Categories

好的,WordPress在Taxonomy API (没有codex页面,链接到最新的源代码)。如果我正确理解它们,我可以使用以下一些有希望的功能:

  • get_terms(): 这个codex 与源代码注释所说的几乎相同;它检索给定分类法或分类法列表中的术语。我可以提供一组参数来更改返回的术语;例如,为了确保我包含的术语是空的(即,在类别或标记的情况下,任何帖子都不会引用),我可以将hide empty参数设置为0false;
  • get_term_heirarchy(): 以数组形式返回给定术语子级的所有术语ID
  • term_is_ancestor_of(): 言行一致;比较两个术语,术语一是参考术语,术语二是检查祖先的术语

Umm, So What About Descendants

我在这里的目标是找出哪些类别没有任何子类别(更一般地说,是后代术语)。我也不想忽略空类别(有子类别但没有任何引用它们的帖子的类别)。

WordPress有没有一种简单的搜索方法?如果是,我是否应该担心性能问题?

Some Edits: 为了给将来的参考提供一个例子,这里有一些我正在处理的硬数据。。。

WordPress类别管理视图

Categories

WordPress分类表

Table of WordPress Taxonomy

WordPress术语表

Table of WordPress Terms

WordPress Term\\u关系表

Table of WordPress Term_Relationships

在我的测试用例中,我想返回以下内容:

未分类的固件和嵌入式系统操作系统和基于Web和Internet的应用程序硬件都没有子项,尽管其中一些没有子项。

1 个回复
最合适的回答,由SO网友:sakibmoon 整理而成

要做到这一点,没有简单的方法。您必须直接查询才能实现这一点。我假设,您只想要没有子体的父类别,或者即使它们有子体,也不会在任何帖子中使用

global $wpdb;
$categories = $wpdb->query("SELECT $wpdb->terms.* 
                            FROM  $wpdb->terms
                            INNER JOIN $wpdb->term_taxonomy
                              ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
                            WHERE $wpdb->terms.term_id NOT IN(
                              SELECT $wpdb->term_taxonomy.parent
                              FROM $wpdb->term_taxonomy
                            )
                              AND $wpdb->term_taxonomy.taxonomy = \'category\'"
                          );

Original Poster\'s Addon EDIT

此查询如何工作

假设表前缀为main_. 首先,我们需要获得所有类别,以便我们可以开始检查哪些类别没有孩子。这是通过从term\\u taxonomy表中选择所有内容并使用WHERE 子句限制分类法字段等于类别的结果:

SELECT *
FROM main_terms
WHERE main_term_taxonomy.taxonomy = \'category\';
但是,我们还需要存储在术语表中的类别名称,因此我们使用INNER JOIN, 这还确保只包含两列共有的数据行(如opposed to 外部连接)。连接在一起的两个表都需要一个公共列来“缝合”它们。

SELECT *
FROM main_term_taxonomy
INNER JOIN main_terms
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = \'category\';
最后,我们排除了在term\\u分类表中作为另一个类别的父类别出现的类别。为此,我们使用关键字NOT IN, 并在内部构造另一个SQL查询SELECT 术语分类法中父项列中的所有内容。然后,这个嵌套的SQL查询提供了应该从结果中排除哪些术语ID,因为它们在term\\u分类法中有条目。父项,表示他们是另一个类别的父项。

SELECT main_term_taxonomy.* 
FROM  main_term_taxonomy
INNER JOIN main_terms
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = \'category\'
AND main_term_taxonomy.term_id NOT IN(
    SELECT main_term_taxonomy.parent
    FROM main_term_taxonomy
);
有趣的是,这确实返回了正确的行,但不包括类别名称。这是因为我们从错误的表中选择了所有列,即main\\u term\\u taxonomy。因此,我们必须切换表在SQL中的位置,以获得所需的信息。

SELECT main_terms.* 
FROM  main_terms
INNER JOIN main_term_taxonomy
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = \'category\'
AND main_term_taxonomy.term_id NOT IN(
    SELECT main_term_taxonomy.parent
    FROM main_term_taxonomy
);

结束

相关推荐

获取Term_id-Taxonomy元数据插件

我一直在到处找,但找不到任何方法来实现这一目标。我正在使用Taxonomy Metadata plugin 我正在尝试显示创建的自定义元数据。为此,我使用:get_term_meta($term_id, \'my_metadata\', TRUE);. 问题是我找不到获取term\\u id的方法。我在循环中的模板页中。以下是我尝试过的:$term = get_term_by(\'name\', \'name\', \'custom_taxonomy\'); $termid = $term->