在WooCommerce中设置折扣率最高的有货变体为默认项
修改WooCommerce可变产品默认选中变体为折扣率最高的有货变体
基于你提到的原代码,以下是修改后的代码,可实现将WooCommerce可变产品的默认选中变体设置为库存中折扣率最高的有货变体:
add_filter( 'woocommerce_dropdown_variation_attribute_options_args', 'custom_wc_dropdown_variation_args', 10, 1 ); function custom_wc_dropdown_variation_args( $args ) { // 仅针对可变产品 if ( ! is_product() || ! $args['product']->is_type('variable') ) { return $args; } $product = $args['product']; $highest_discount_variation = null; $max_discount_rate = 0; // 遍历所有变体 foreach ( $product->get_available_variations() as $variation ) { $variation_obj = wc_get_product( $variation['variation_id'] ); // 跳过无库存的变体 if ( ! $variation_obj->is_in_stock() ) { continue; } // 获取常规价格和销售价格 $regular_price = (float) $variation_obj->get_regular_price(); $sale_price = (float) $variation_obj->get_sale_price(); // 仅计算有折扣的变体(销售价格 < 常规价格) if ( $sale_price > 0 && $sale_price < $regular_price ) { // 计算折扣率:(原价-现价)/原价 * 100 $discount_rate = ( ( $regular_price - $sale_price ) / $regular_price ) * 100; // 更新最高折扣率对应的变体 if ( $discount_rate > $max_discount_rate ) { $max_discount_rate = $discount_rate; $highest_discount_variation = $variation; } } } // 如果找到折扣率最高的变体,设置为默认选中 if ( $highest_discount_variation ) { foreach ( $args['attributes'] as $attribute => $value ) { if ( isset( $highest_discount_variation['attributes'][ 'attribute_' . $attribute ] ) ) { $args['selected'] = $highest_discount_variation['attributes'][ 'attribute_' . $attribute ]; } } } else { // 如果没有找到有折扣的变体,自动选择第一个有库存的变体 foreach ( $product->get_available_variations() as $variation ) { $variation_obj = wc_get_product( $variation['variation_id'] ); if ( $variation_obj->is_in_stock() ) { foreach ( $args['attributes'] as $attribute => $value ) { if ( isset( $variation['attributes'][ 'attribute_' . $attribute ] ) ) { $args['selected'] = $variation['attributes'][ 'attribute_' . $attribute ]; } } break; } } } return $args; }
代码说明:
- 先筛选出当前可变产品下所有有库存的变体
- 对每个带折扣的变体(销售价格低于常规价格)计算折扣率,锁定折扣率最高的变体
- 若存在符合条件的变体,将其属性设置为默认选中项
- 若没有找到带折扣的有货变体,自动选择第一个有库存的变体(这部分逻辑可根据自身需求调整)
内容的提问来源于stack exchange,提问作者Lupani
相关产品推荐
相关产品推荐

