You need to enable JavaScript to run this app. WooCommerce如何实现展示平米单价、结算按产品变体基础价格收费?
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce如何实现展示平米单价、结算按产品变体基础价格收费?

前端展示每平方米单价、实际结算按基础价格的实现方案

已完成的基础准备

  • 已为产品变体扩展3类价格字段:price(每平米展示价)、sale_price(每平米促销展示价)、base_price(实际结算基础价)
  • 已实现后台变体编辑页的基础价格字段展示、值持久化逻辑,核心代码如下:
// 后台:在变体定价区新增基础价格输入框
add_action( 'woocommerce_variation_options_pricing', 'add_variation_custom_option_pricing', 10, 3 );
function add_variation_custom_option_pricing( $loop, $variation_data, $variation ){
   woocommerce_wp_text_input( array(
        'id'            => '_base_price['.$loop.']',
        'label'         => __("Base Price", "woocommerce") . ' (' . get_woocommerce_currency_symbol() . ')',
        'class' => 'short wc_input_price',
        'data_type'     => 'price',
        'wrapper_class' => 'form-row form-row-first',
        'value'         => wc_format_localized_price( get_post_meta( $variation->ID, '_base_price', true ) )
    ) );
}

// 后台:保存变体的自定义基础价格值
add_action( 'woocommerce_save_product_variation', 'save_variation_custom_option_pricing', 10, 2 );
function save_variation_custom_option_pricing( $variation_id, $i ){
    if( isset($_POST['_base_price'][$i]) ){
        update_post_meta( $variation_id, '_base_price', wc_clean( wp_unslash( str_replace( ',', '.', $_POST['_base_price'][$i]) ) ) );
    }
}

业务需求说明

  • 应用场景:销售砖块时,按100块为单位设置固定结算价格,同时需要向前端访客展示对应每平方米的参考单价
  • 配置示例:某砖块变体设置price为6美元/m²(仅用于前端展示),设置base_price为60美元(100块砖块的实际结算价),客户加购1件商品时,实际收费完全按base_price计算
  • 当前产品详情页价格区通过WooCommerce核心钩子渲染:do_action( 'woocommerce_single_product_summary' );

核心实现代码

结算环节价格替换

拦截WooCommerce购物车总价计算流程,将商品的实际结算价格替换为自定义的_base_price值,覆盖系统默认读取的price字段值:

add_action( 'woocommerce_before_calculate_totals', 'replace_cart_price_with_base_price', 20, 1 );
function replace_cart_price_with_base_price( $cart ) {
    // 跳过后台管理端的计算流程,避免干扰后台操作
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    // 避免重复执行钩子导致的逻辑异常
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;

    foreach ( $cart->get_cart() as $cart_item ) {
        $variation_id = $cart_item['data']->get_id();
        $base_price = get_post_meta( $variation_id, '_base_price', true );
        // 仅当自定义基础价格为有效数字时执行替换
        if ( !empty($base_price) && is_numeric($base_price) ) {
            $cart_item['data']->set_price( floatval($base_price) );
        }
    }
}

前端展示价格优化

在WooCommerce默认展示的价格后追加“/m²”单位标识,明确告知访客当前展示的是每平方米参考价,不改动实际结算逻辑:

add_filter( 'woocommerce_variable_price_html', 'custom_display_price_with_sqm_unit', 10, 2 );
add_filter( 'woocommerce_variation_price_html', 'custom_display_price_with_sqm_unit', 10, 2 );
function custom_display_price_with_sqm_unit( $price_html, $product ) {
    return $price_html . ' / m²';
}

落地注意事项

  • 所有变体的base_price字段需填写有效数值,否则系统会自动回退使用默认的price字段作为结算价
  • 上线前需清除WooCommerce商品缓存、页面缓存,确保自定义字段值能被正确读取
  • 若使用了缓存插件,需将购物车、结算页排除在缓存范围外,避免价格计算逻辑异常

内容的提问来源于stack exchange,提问作者kmb67116

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 01:54:01