WooCommerce如何通过自定义字段按重量批量更新全店产品价格
WooCommerce 按全局重量单价自动同步所有产品/变体价格实现方案
实现逻辑说明
- 后台全局新增1个统一管控的重量单价设置项,支持直接修改数值
- 所有产品(含可变产品的每个变体)单独存储自身的重量规格值,单位和全局单价的计价单位保持一致(比如全局按每克计价就存克数,按每千克计价就存千克数)
- 价格计算规则固定为:
产品最终售价 = 全局重量单价 × 产品自身重量值 - 默认采用动态实时计算模式,修改全局单价后所有价格立即生效,不需要批量更新数据库;如果对接ERP等需要读取数据库内价格的场景,可以额外加批量更新逻辑,修改单价时自动同步写入所有产品的价格字段
具体代码实现
将以下代码加入当前主题的functions.php文件,或者自定义功能插件中即可生效。
1. 在WooCommerce常规设置页新增全局单价配置项
// WooCommerce常规设置新增全局重量单价字段 add_filter('woocommerce_general_settings', 'add_global_weight_price_setting'); function add_global_weight_price_setting($settings) { $new_settings = array( array( 'title' => '全局重量计价参数', 'type' => 'title', 'id' => 'global_weight_price_section', ), array( 'title' => '每单位重量单价', 'desc' => '设置每克/每千克的统一售价,单位需和产品侧填写的重量单位保持一致', 'id' => 'global_unit_weight_price', 'type' => 'number', 'custom_attributes' => array( 'step' => 'any', 'min' => '0' ), 'default' => 0, ), array( 'type' => 'sectionend', 'id' => 'global_weight_price_section', ), ); array_splice($settings, count($settings)-1, 0, $new_settings); return $settings; }
2. 给所有产品/变体新增重量规格录入字段
// 简单产品后台新增重量规格字段 add_action('woocommerce_product_options_general_product_data', 'add_product_weight_spec_field'); function add_product_weight_spec_field() { woocommerce_wp_text_input(array( 'id' => '_product_weight_spec', 'label' => '产品重量规格', 'desc_tip' => true, 'description' => '填写当前产品的重量数值,单位和全局单价的计价单位一致', 'type' => 'number', 'custom_attributes' => array( 'step' => 'any', 'min' => '0' ) )); } // 保存简单产品的重量规格值 add_action('woocommerce_process_product_meta', 'save_product_weight_spec_field'); function save_product_weight_spec_field($post_id) { $weight_spec = isset($_POST['_product_weight_spec']) ? sanitize_text_field($_POST['_product_weight_spec']) : ''; update_post_meta($post_id, '_product_weight_spec', $weight_spec); } // 可变产品变体新增重量规格字段 add_action('woocommerce_variation_options_pricing', 'add_variation_weight_spec_field', 10, 3); function add_variation_weight_spec_field($loop, $variation_data, $variation) { woocommerce_wp_text_input(array( 'id' => '_product_weight_spec[' . $variation->ID . ']', 'label' => '当前变体重量规格', 'desc_tip' => true, 'description' => '填写当前变体的重量数值,单位和全局单价的计价单位一致', 'value' => get_post_meta($variation->ID, '_product_weight_spec', true), 'type' => 'number', 'custom_attributes' => array( 'step' => 'any', 'min' => '0' ) )); } // 保存变体的重量规格值 add_action('woocommerce_save_product_variation', 'save_variation_weight_spec_field', 10, 2); function save_variation_weight_spec_field($variation_id, $i) { $weight_spec = isset($_POST['_product_weight_spec'][$variation_id]) ? sanitize_text_field($_POST['_product_weight_spec'][$variation_id]) : ''; update_post_meta($variation_id, '_product_weight_spec', $weight_spec); }
3. 动态计算全场景价格
// 覆盖产品列表、详情、购物车、结算页的价格计算逻辑 add_filter('woocommerce_product_get_price', 'auto_calculate_price_by_weight', 99, 2); add_filter('woocommerce_product_variation_get_price', 'auto_calculate_price_by_weight', 99, 2); function auto_calculate_price_by_weight($price, $product) { $global_unit_price = get_option('global_unit_weight_price', 0); $product_weight = get_post_meta($product->get_id(), '_product_weight_spec', true); // 未填写重量或全局单价为0时,返回原固定价格避免报错 if (empty($global_unit_price) || empty($product_weight)) { return $price; } return floatval($global_unit_price) * floatval($product_weight); }
如果需要把计算后的价格同步写入数据库(对接ERP、导出报表等场景),可以额外添加全局单价保存时的批量更新逻辑,产品量级较大时注意做分批处理,避免后台请求超时。
注意事项
- 计价单位必须全局统一,比如全局设置每克单价2000,对应2克的产品/变体重量字段填2即可,不要填0.002千克,否则计算结果会出错
- 不需要按重量计价的产品,只要不填对应重量规格字段,就会沿用原来设置的固定价格,不会被规则覆盖
- 可变产品的每个规格变体都要单独填写对应重量值,比如1克、2克、5克的变体分别填1、2、5,修改全局单价后会自动算出对应变体的价格
内容的提问来源于stack exchange,提问作者maaz ahmad
相关产品推荐
相关产品推荐

