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
相关产品推荐
相关产品推荐

