高效的分类交集

时间:2012-04-25 作者:Tom J Nowell

我有很多用途,但我想知道最有效的方法是什么,这将是一个昂贵的操作。

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

给定值:

产品品牌分类法和产品组分类法是上述分类法的产品帖子类型存档模板,但仅显示适用于该组帖子的术语,最有效、最高效的方法是什么。

例如,如果我在“womens”产品组中,它会在左侧显示品牌,但仅显示为“womens”产品组中的产品指定的品牌。E、 g.“Fancy womens Clothings Inc”品牌会出现,但不会出现“Manly mens Manly ltd”。

我需要一个通用的答案,虽然我很高兴使用服装产品的例子,我知道如何用暴力的贪婪算法来做到这一点,但这是非常浪费的,我对一个解决方案不感兴趣,这个解决方案会将每个页面的加载量增加几秒钟,并在这个过程中从DB中完全加载所有帖子

编辑:示例2:

皮卡丘是一种黄色的口袋妖怪,在黄色标签中,但皮卡丘也是一种电动口袋妖怪,所以它在类型分类的电动标签中。在黄色标签档案中,我如何只显示黄色的口袋妖怪类型?e、 g.所有草精灵都是绿色的,这意味着在黄色的拱形中不会有草菜单项,但在绿色中会有草菜单项(是的,我知道有草精灵不是绿色的)

1 个回复
最合适的回答,由SO网友:Rarst 整理而成

要概括这一点,需要检索具有特定分类法术语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\' ) );

结束

相关推荐