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