高效分类学交叉口


9

我对此有很多用途,但我想知道执行最昂贵的操作的最高效方法。

例如,我将使用一家商店。

鉴于:

  • 产品品牌分类
  • 产品组分类法
  • 产品发布类型
  • 存档上述分类法的模板

最有效,最有效的方法是在产品类型档案中显示品牌菜单,在品牌档案中显示产品类型,但是仅显示适用于该组帖子的术语。

因此,例如,如果我属于“女士”产品组,它将在左侧显示品牌,但仅显示为“女士”产品组中的产品指定的品牌。例如,将显示品牌“ Fancy womens clothes Inc”,但不会显示“ Manly mens Manly ltd”。

我需要一个通用的答案,尽管我很高兴使用服装示例,而且我知道如何通过蛮力用贪婪的算法来做到这一点,但这非常浪费,而且我对解决方案不感兴趣将使每个页面的加载增加几秒钟,并在此过程中从数据库完全加载所有帖子

编辑:示例2:

皮卡丘(Pikachu)是黄色的宠物小精灵,并且在黄色标签中,但是皮卡丘(Pikachu)也是电动小精灵,因此它属于分类法的电子标签。在黄色标签档案中时,我如何只显示黄色的口袋妖怪类型?例如所有的草口袋妖都是绿色的,意味着在黄色档案里不会有草菜单项,而在绿色的话(是的,我知道有些草口袋妖不是绿色的)。

Answers:


13

概括地说,这是检索具有特定分类法术语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' ) );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.