问题描述

我有很多用途,但我想知道最有效的做法是做一个昂贵的操作。

作为一个例子,我会用一个商店。

鉴于:

  • 产品品牌分类

  • 产品组分类法

  • 产品类型

  • 上述分类法的归档模板

在产品类型归档中显示品牌菜单的最有效率,最有效的方法是什么,品牌档案中显示产品类型,但仅显示适用于该组中的帖子的条款。

例如,如果我在产品组’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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。