1 回答
TA贡献1829条经验 获得超6个赞
因此,一般来说,这并不是一件大事,但我们应该避免对数据库进行不必要的调用,而 WordPress 本质上并不为我们提供这样的功能。因此,出于性能原因,我创建了自己的自定义 SQL 查询。看:
function get_related_list_categories ($term_taxonomy_id, $related_taxonomy)
{
global $wpdb;
$sql = "SELECT DISTINCT(term_taxonomy_id)
FROM {$wpdb->prefix}term_relationships
WHERE object_id IN (
SELECT DISTINCT(p.ID)
FROM {$wpdb->prefix}posts AS p LEFT JOIN {$wpdb->prefix}term_relationships AS tr ON (p.ID = tr.object_id)
WHERE tr.term_taxonomy_id IN ({$term_taxonomy_id}) AND p.post_type = '{$post_type}' AND (p.post_status = 'publish')
) AND term_taxonomy_id IN (
SELECT term_id FROM {$wpdb->prefix}term_taxonomy WHERE taxonomy = '{$related_taxonomy}'
)";
if (empty($term_ids = $wpdb->get_col($sql))) {
return FALSE;
}
return $wp_list_categories(['include' => $term_ids, 'taxonomy' => $related_taxonomy, 'echo' => false, 'title_li' => '',]);
}
get_related_list_categories($product_category_id, 'product-manufacturer');
再次,我选择product_category_id作为第一个参数(而不是 slug),因为我认为您很可能会拥有它,并且不需要进行数据库调用来获取 slug。无论哪种方式,您都可以根据自己的喜好自定义功能。我确信您会有自己的调整,就像我在找不到条件时返回 false 一样,但您可能想用另一种方式来做。如果这对您有用,或者您有任何疑问,请告诉我。
更新:如果调试需要进一步解释。
sql 查询由两个子查询组成。
SELECT DISTINCT(p.ID)
FROM {$wpdb->prefix}_posts as p
LEFT JOIN {$wpdb->prefix}_term_relationships as tr ON (p.ID = tr.object_id)
WHERE tr.term_taxonomy_id IN ({$term_taxonomy_id})
AND p.post_type = '{$post_type}'
AND (p.post_status = 'publish')
这会找到与当前相关术语相关的所有帖子。它应该与该存档页面的帖子 ID 匹配。单独运行此查询来测试是否返回正确的帖子 ID。WHERE如果您想针对多个术语或按段等执行此操作,则可以调整该子句。
SELECT term_id
FROM {$wpdb->prefix}_term_taxonomy
WHERE taxonomy = 'related_experience'
第二个子查询获取“相关体验”分类法(或您想要的任何辅助分类法)的所有术语。您应该运行此命令并验证“lated_experience”的所有术语 ID 均已返回
然后,父 sql 查询连接第一个分类中的帖子 ID,并获取第二个分类中的所有术语,这些术语也显示在具有第一个分类的帖子中。
- 1 回答
- 0 关注
- 86 浏览
添加回答
举报