WooCommerce与Measurement Price Calc:隐藏价格区间,显示“从€x.xx起”
适配Measurement Price Calculator的可变产品价格显示修改
看起来你已经搞定了普通可变产品的价格区间隐藏,但碰到MPC插件的定价表就掉链子了——这很常见,因为MPC有自己的价格渲染逻辑,默认的可变产品价格钩子覆盖不到它。
先回顾下你可能用的基础代码(如果和你的不一样,直接替换成你的核心逻辑就行):
// 原普通可变产品价格修改 add_filter('woocommerce_variable_price_html', 'custom_variable_price', 10, 2); function custom_variable_price($price, $product) { $min_price = $product->get_variation_price('min', true); return sprintf(__('从 %s 起', 'woocommerce'), wc_price($min_price)); }
问题出在:这段代码只拦截了WooCommerce默认的可变产品价格输出,但MPC插件渲染定价表时,用了专属的钩子woocommerce_measurement_price_calculator_price_html,所以你的修改在定价表里不生效。
下面是适配MPC的完整解决方案,同时兼顾普通可变产品和MPC定价表的显示:
// 同时处理普通可变产品和MPC插件的价格显示 add_filter('woocommerce_variable_price_html', 'custom_variable_price_mpc_compatible', 20, 2); add_filter('woocommerce_measurement_price_calculator_price_html', 'custom_variable_price_mpc_compatible', 20, 2); function custom_variable_price_mpc_compatible($price, $product) { // 只针对可变产品处理 if (!$product->is_type('variable')) { return $price; } // 获取产品最低可变价格 $min_price = $product->get_variation_price('min', true); // 检查是否启用了MPC插件且当前产品配置了测量定价 if (class_exists('WC_Measurement_Price_Calculator') && $product->get_meta('_measurement_price_calculator_enabled')) { // 获取MPC的单位价格和单位(比如"元/米") $unit_price = $product->get_meta('_measurement_price_calculator_unit_price'); $price_unit = $product->get_meta('_measurement_price_calculator_unit'); // 如果有单位价格,显示带单位的"从X起"格式 if ($unit_price && $price_unit) { $price = sprintf(__('从 %s/%s 起', 'woocommerce'), wc_price($unit_price), $price_unit); } else { // 回退到普通最低价格显示 $price = sprintf(__('从 %s 起', 'woocommerce'), wc_price($min_price)); } } else { // 普通可变产品的处理逻辑 $price = sprintf(__('从 %s 起', 'woocommerce'), wc_price($min_price)); } return $price; }
关键说明:
- 双钩子覆盖:同时挂钩默认可变价格钩子和MPC专属钩子,优先级设为20(高于默认优先级,确保你的修改能覆盖插件和主题的默认输出)
- MPC专属判断:通过检查MPC类是否存在、产品是否启用测量定价,来区分处理逻辑——如果是MPC产品,优先显示带单位的起始价格
- 兼容性:保留了普通可变产品的原有逻辑,不会影响未使用MPC的产品
注意事项:
- 把这段代码加到子主题的functions.php里,别直接改父主题,避免主题更新丢失修改
- 测试不同场景:带MPC的可变产品、普通可变产品,确保价格显示符合预期
- 清除WooCommerce缓存(WooCommerce → 状态 → 工具 → 清除缓存)和浏览器缓存,确保修改生效
内容的提问来源于stack exchange,提问作者ConM
相关产品推荐
相关产品推荐

