WooCommerce产品如何按分组名称单独展示各属性列表
WooCommerce可变产品属性重复问题解决方案
问题根因
你在遍历每个可变产品变体时,将每个变体的属性值直接追加到数组中,没有做去重校验:比如三个不同颜色的变体都对应大号尺寸时,遍历3个变体就会往尺寸数组插入3次large,最终出现重复值。
推荐解决方案
分两种场景处理:
场景1:不需要根据库存过滤属性(性能最优)
可变产品在产品级本身存储了全量的可选属性值,无需遍历变体即可直接获取去重后的分组属性,代码如下:
// 获取可变产品对象 $product = wc_get_product( $target_product_id ); if ( $product->is_type( 'variable' ) ) { // 直接获取去重后的所有变体属性,返回结构为[属性名=>[属性值数组]] $grouped_attributes = $product->get_variation_attributes(); // 遍历输出即可 foreach ( $grouped_attributes as $attr_slug => $attr_values ) { // 输出属性显示名 echo wc_attribute_label( $attr_slug ) . ':'; // 分类属性需要转名称,自定义属性直接输出值 if ( taxonomy_exists( $attr_slug ) ) { $formatted_values = []; foreach ( $attr_values as $value_slug ) { $term = get_term_by( 'slug', $value_slug, $attr_slug ); $formatted_values[] = $term ? $term->name : $value_slug; } echo implode( '、', $formatted_values ); } else { echo implode( '、', $attr_values ); } echo '<br>'; } }
场景2:需要根据可用变体过滤无库存对应的属性
如果需要仅展示当前有库存的变体对应的属性值,遍历变体时新增去重逻辑即可:
$product = wc_get_product( $target_product_id ); if ( $product->is_type( 'variable' ) ) { $available_variations = $product->get_available_variations(); $filtered_grouped_attrs = []; foreach ( $available_variations as $variation ) { $variation_obj = wc_get_product( $variation['variation_id'] ); $variation_attrs = $variation_obj->get_attributes(); foreach ( $variation_attrs as $attr_slug => $attr_value ) { // 分类属性转名称 if ( taxonomy_exists( $attr_slug ) ) { $term = get_term_by( 'slug', $attr_value, $attr_slug ); $formatted_value = $term ? $term->name : $attr_value; } else { $formatted_value = $attr_value; } // 去重逻辑:当前属性分组不存在该值才插入 if ( !isset( $filtered_grouped_attrs[$attr_slug] ) || !in_array( $formatted_value, $filtered_grouped_attrs[$attr_slug] ) ) { $filtered_grouped_attrs[$attr_slug][] = $formatted_value; } } } // 输出逻辑同场景1 }
内容的提问来源于stack exchange,提问作者Web Design
相关产品推荐
相关产品推荐

