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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:31:12