如何通过自定义字段动态批量更新 WooCommerce 商品价格

千晨君_9245

千晨君_9245

2026-08-05

261人浏览

原创

如何通过自定义字段动态批量更新 WooCommerce 商品价格

本文介绍一种基于商品重量与全局单价字段自动计算并批量更新 woocommerce 商品售价的实用方案,适用于按克/千克计价的标准化商品(如贵金属、香料、茶叶等),确保价格随基础单价实时联动。

本文介绍一种基于商品重量与全局单价字段自动计算并批量更新 woocommerce 商品售价的实用方案,适用于按克/千克计价的标准化商品(如贵金属、香料、茶叶等),确保价格随基础单价实时联动。

在 WooCommerce 中实现“按重量动态定价”(如每克/每千克统一单价),关键在于解耦价格逻辑与商品数据:将基础单价(如 ¥2000/克)存入自定义字段,再根据每个商品的实际重量(_weight)实时计算最终售价,并批量写入 _regular_price 和 _sale_price 元数据。

以下是一个经过优化、安全可用的完整实现方案:

✅ 推荐实现方式(支持简单产品 & 变体产品)

// 将此代码添加到主题 functions.php 或专用插件中
add_action('admin_init', 'sync_product_prices_from_weight_unit_price');
function sync_product_prices_from_weight_unit_price() {
    // 仅在手动触发时执行(避免每次 admin_init 都运行)
    if (!isset($_GET['sync_wc_prices']) || !current_user_can('manage_woocommerce')) {
        return;
    }

    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'fields'         => 'ids'
    );
    $product_ids = get_posts($args);

    foreach ($product_ids as $product_id) {
        $product = wc_get_product($product_id);
        if (!$product) continue;

        // 获取单位价格(建议使用统一 meta key,如 '_unit_price_per_gram')
        $unit_price = (float) get_post_meta($product_id, '_unit_price_per_gram', true);
        if (!$unit_price || $unit_price get_weight();
        $weight_g  = $weight_kg ? $weight_kg * 1000 : 0; // 转为克

        // 计算最终价格(四舍五入保留2位小数)
        $calculated_price = round($weight_g * $unit_price, 2);

        // 同步 regular_price 和 sale_price(可选)
        update_post_meta($product_id, '_regular_price', $calculated_price);
        update_post_meta($product_id, '_price', $calculated_price); // 确保前台显示一致
        // 若需同步促销价,可设为 same 或留空:update_post_meta($product_id, '_sale_price', $calculated_price);
    }

    // 完成后跳转并提示
    wp_redirect(add_query_arg(array('prices_synced' => 'true'), wp_get_referer()));
    exit;
}

// 添加后台一键同步按钮(位于 WooCommerce > 仪表盘)
add_action('admin_menu', 'add_price_sync_admin_page');
function add_price_sync_admin_page() {
    add_management_page(
        '同步商品价格',
        '同步价格',
        'manage_woocommerce',
        'sync-wc-prices',
        'render_sync_page'
    );
}
function render_sync_page() {
    if (isset($_GET['prices_synced']) && $_GET['prices_synced'] === 'true') {
        echo '<div class="notice notice-success"><p>✅ 所有已发布商品价格已根据单位价格和重量重新计算并更新!</p></div>';
    }
    ?>
    <div class="wrap">
        <h1>批量同步商品价格</h1>
        <p><strong>说明:</strong>本工具将读取每个商品的「重量」与自定义字段 <code>_unit_price_per_gram</code>,自动计算 <code>重量(g) × 单价</code> 并更新售价。</p>
        <a href="<?php%20echo%20wp_nonce_url(admin_url('admin.php?page=sync-wc-prices&sync_wc_prices=true'),%20'sync_prices');%20?>" class="button button-primary" onclick="return confirm('⚠️ 此操作将覆盖所有商品当前价格,确定要执行吗?');">
            ? 立即同步全部商品价格
        </a>
    </div>
    <?php }

// 【重要】设置单位价格字段(推荐使用 ACF 或原生 meta box)
// 示例:在商品编辑页添加「每克单价」输入框
add_action('woocommerce_product_options_general_product_data', 'add_unit_price_field');
function add_unit_price_field() {
    woocommerce_wp_text_input([
        'id'          => '_unit_price_per_gram',
        'label'       => __('每克单价(¥)', 'woocommerce'),
        'description' => __('用于自动计算售价:重量(g) × 此值', 'woocommerce'),
        'type'        => 'number',
        'custom_attributes' => ['step' => '0.01', 'min' => '0']
    ]);
}
add_action('woocommerce_process_product_meta', 'save_unit_price_field');
function save_unit_price_field($post_id) {
    $value = isset($_POST['_unit_price_per_gram']) ? floatval($_POST['_unit_price_per_gram']) : '';
    update_post_meta($post_id, '_unit_price_per_gram', $value);
}

⚠️ 关键注意事项

  • 重量单位一致性:WooCommerce 默认 get_weight() 返回 千克(kg),务必乘以 1000 转换为克(g),否则价格将严重偏低(如 2g 当作 2kg 计算 → 差1000倍)。
  • 字段命名规范:避免使用模糊字段名(如 'afc-field')。推荐统一使用语义化 key:_unit_price_per_gram。
  • 变体产品处理:上述脚本默认同步父级简单产品价格。若需同步变体(如不同克重规格),需遍历 product_variation 并获取其独立重量($variation->get_weight()),逻辑更复杂,建议单独扩展。
  • 性能与安全:批量操作前务必备份数据库;生产环境建议增加 wp_nonce 验证及执行限制(如分批处理 + AJAX 分页)。
  • 缓存兼容性:更新价格后,清除对象缓存(如 Redis)及页面缓存(如 WP Rocket),确保前台实时生效。

✅ 最佳实践:将该机制作为「价格基线控制」手段,配合定期手动触发同步(而非实时钩子),兼顾稳定性与可控性。后续还可扩展为「按时间段生效」或「多币种单价」等高级场景。

通过本方案,您只需修改一次 _unit_price_per_gram 字段,即可全局联动所有商品售价——真正实现轻量、可靠、可维护的价格管理体系。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

11984

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6861

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2195

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4368

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

5074

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3991

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5777

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4522

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12382

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习