如何获取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
相关产品推荐
相关产品推荐

