You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取WooCommerce中用于产品变体的属性?

WooCommerce筛选已被产品变体使用的属性实现方案

核心实现代码

直接在你现有代码的基础上增加判断逻辑即可,完整可运行代码如下:

// 自定义工具函数:判断指定属性是否被已发布的产品变体使用
function is_attribute_used_in_variations( string $attribute_taxonomy ): bool {
    global $wpdb;

    $variation_meta_key = 'attribute_' . $attribute_taxonomy;
    $used_count = $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(DISTINCT pm.post_id)
        FROM {$wpdb->postmeta} pm
        INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID
        WHERE p.post_type = 'product_variation'
        AND p.post_status = 'publish'
        AND pm.meta_key = %s
        AND pm.meta_value != ''",
        $variation_meta_key
    ) );

    return $used_count > 0;
}

// 你的原有逻辑扩展
$valid_variation_attributes = [];
$allAttributes = wc_get_attribute_taxonomies();
foreach ( $allAttributes as $att ) {
    $wcAttribute = wc_get_attribute( $att->attribute_id );
    $attribute_taxonomy = wc_attribute_taxonomy_name( $att->attribute_name );

    // 可选:先过滤后台未开启「可用于变体」开关的属性,减少不必要查询
    if ( ! $wcAttribute->get_variation() ) {
        continue;
    }

    // 判断属性是否实际被变体使用
    if ( is_attribute_used_in_variations( $attribute_taxonomy ) ) {
        // 获取属性对应可选值
        $attribute_values = get_terms( [
            'taxonomy' => $attribute_taxonomy,
            'hide_empty' => true,
        ] );

        $valid_variation_attributes[] = [
            'attribute_info' => $wcAttribute,
            'available_values' => $attribute_values
        ];
    }
}

逻辑说明

  • 如果你的需求仅为筛选后台开启了「可用于变体」选项的属性,不需要验证是否真的有产品变体在使用,直接删除自定义函数和对应的调用判断,仅保留$wcAttribute->get_variation()的判断即可,性能更高。
  • 数据库查询方案适用于属性、产品量级较大的场景,无需加载全量产品/变体对象,查询效率更高。
  • 查询默认过滤了未发布的变体和空属性值记录,返回结果更符合实际使用场景。

内容的提问来源于stack exchange,提问作者Pepin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:45:04