问题描述
我有很多用途,但我想知道最有效的做法是做一个昂贵的操作。
作为一个例子,我会用一个商店。
鉴于:
-
产品品牌分类
-
产品组分类法
-
产品类型
-
上述分类法的归档模板
在产品类型归档中显示品牌菜单的最有效率,最有效的方法是什么,品牌档案中显示产品类型,但仅显示适用于该组中的帖子的条款。
例如,如果我在产品组’womens’,它会显示左侧的品牌,但只显示在’womens’ 产品组中的产品指定的品牌。例如。品牌 「花式妇女服装公司」 将展示,但不是 「曼利男士曼利有限公司」 。
我需要一个通用的答案,虽然我很高兴使用服装产品的例子,我知道如何用蛮力的贪婪算法来做到这一点,但这是非常浪费的,我对这个解决方案不感兴趣将每个页面的加载增加几秒钟,并将 DB 中的所有帖子全部加载到该进程中
编辑:示例 2:
皮卡丘是一个黄色的小宠物,黄色的标签,但皮卡丘也是电动小宠物,所以它是类型分类学的电子标签。在黄色标签档案中,我将如何显示黄色的小宠物类型?例如所有的草小宠物都是绿色的,意味着在黄色的档案中不会有一个草菜单项,但会有绿色的 (是的,我知道有没有绿色的草小宠物)
最佳解决方案
为了概括这一点,检索具有特定分类学术语 B 的职位的所有分类术语 A 的问题。
虽然这不是不可能在几个步骤和大量的循环通过职位 (这将确实是低效率),我认为通过 SQL 是有道理的效率。
我粗暴的接受它是:
/**
* Get all terms of $tax_to taxonomy that posts in $term_from of $tax_from have.
*
* @param string $tax_from taxonomy name
* @param string $term_from term slug
* @param string $tax_to taxonomy name
*
* @return array|WP_Error
*/
function get_intersected_terms( $tax_from, $term_from, $tax_to ) {
global $wpdb;
$term_from = get_term_by( 'slug', $term_from, $tax_from );
$query = "
SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = '{$tax_to}' AND term_taxonomy_id IN (
SELECT term_taxonomy_id FROM {$wpdb->term_relationships} WHERE object_id IN (
SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id = {$term_from->term_taxonomy_id}
)
)
";
$term_ids = $wpdb->get_col( $query );
if( empty( $term_ids) )
return array();
return get_terms( $tax_to, array( 'include' => $term_ids ) );
}
// example
var_dump( get_intersected_terms( 'category', 'cat-a', 'post_tag' ) );
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。