WooCommerce限量商品首单30%折扣设置及购物车价格显示问题修复
问题排查结果
你现有代码存在4个核心问题导致显示异常:
dynamic_sale_price函数中else分支调用未定义变量$regular_price,会触发PHP警告,非活动期促销价返回值异常alter_price_cart逻辑无库存判断:所有购物车商品统一打7折,不符合首份限量折扣的需求,且直接用get_price()乘0.7会导致重复计算折扣- 缺少购物车场景的价格显示钩子适配:迷你购物车、购物车页单品价格走独立过滤钩子,你仅修改了价格计算逻辑未同步覆盖显示规则
dynamic_sale_price_html函数else分支语法错误:将价格后缀直接拼入wc_price()参数中,会导致价格格式错乱
修复后完整代码
// 1. 商品基础原价逻辑 add_filter( 'woocommerce_product_get_regular_price', 'dynamic_regular_price', 10, 2 ); add_filter( 'woocommerce_product_variation_get_regular_price', 'dynamic_regular_price', 10, 2 ); function dynamic_regular_price( $regular_price, $product ) { $stock_qte = $product->get_stock_quantity(); if( empty($regular_price) || $regular_price == 0 ) return $product->get_price(); else return $regular_price; } // 2. 修复商品动态促销价逻辑 add_filter( 'woocommerce_product_get_sale_price', 'dynamic_sale_price', 10, 2 ); add_filter( 'woocommerce_product_variation_get_sale_price', 'dynamic_sale_price', 10, 2 ); function dynamic_sale_price( $sale_price, $product ) { $stock_qte = (int)$product->get_stock_quantity(); // 库存等于15时返回7折价,否则返回空(无促销) if( $stock_qte === 15 ) return $product->get_regular_price() * 0.7; else return ''; } // 3. 修复商品详情页价格显示逻辑 add_filter( 'woocommerce_get_price_html', 'dynamic_sale_price_html', 20, 2 ); function dynamic_sale_price_html( $price_html, $product ) { $stock_qte = (int)$product->get_stock_quantity(); if( $stock_qte === 15 ) { $regular_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); $sale_price = wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() ) ); $price_html = wc_format_sale_price( $regular_price, $sale_price ) . $product->get_price_suffix(); } else { $regular_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); $price_html = wc_price( $regular_price ) . $product->get_price_suffix(); } return $price_html; } // 4. 修复购物车价格计算逻辑 add_action( 'woocommerce_before_calculate_totals', 'alter_price_cart', 9999 ); function alter_price_cart( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { $product = $cart_item['data']; $stock_qte = (int)$product->get_stock_quantity(); $regular_price = $product->get_regular_price(); // 仅库存为15时应用7折,其他场景用原价 if( $stock_qte === 15 ) { $cart_item['data']->set_price( $regular_price * 0.7 ); } else { $cart_item['data']->set_price( $regular_price ); } } } // 5. 新增购物车/迷你购物车单品价格显示适配 add_filter( 'woocommerce_cart_item_price', 'custom_cart_item_price', 10, 3 ); add_filter( 'woocommerce_widget_cart_item_price', 'custom_cart_item_price', 10, 3 ); function custom_cart_item_price( $price, $cart_item, $cart_item_key ) { $product = $cart_item['data']; $stock_qte = (int)$product->get_stock_quantity(); $regular_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); if( $stock_qte === 15 ) { $sale_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() * 0.7 ) ); return wc_format_sale_price( $regular_price, $sale_price ) . $product->get_price_suffix(); } return wc_price( $regular_price ) . $product->get_price_suffix(); }
注意事项
代码替换前请先备份站点,建议在测试环境验证后再上线,后续添加库存校验逻辑时,注意和现有库存判断逻辑保持一致,统一用整数类型比较库存值。
内容的提问来源于stack exchange,提问作者Quentin Wr
相关产品推荐
相关产品推荐

