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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:36:10