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

WooCommerce切换变量产品变体时动态获取对应价格实现方法

问题原因

你现有代码无法实现需求的核心问题有三个:

  • PHP是服务端执行语言,页面渲染完成后代码就已经运行结束,无法直接响应前端用户选择变体的交互,不可能自动更新变量值。
  • 现有逻辑没有做变体和价格的映射存储,循环遍历变体时只是反复覆盖临时变量,最终给$amount的赋值只是循环最后一轮拿到的变体价格,根本没有建立变体选择和价格的对应关系。
  • 额外注意:你把自定义函数get_product_variation_price写在if条件块里,一旦这段逻辑被重复执行,会直接触发PHP「函数重复定义」的致命错误,属于不规范写法。
实现步骤

WooCommerce本身已经在产品页加载了所有变体的前端交互逻辑,不需要你重复查询数据库获取变体价格,按下面两部分修改即可:

1. PHP端:提前输出变体价格映射到前端

把下面代码放到主题functions.php或者自定义功能插件中,作用是提前整理好所有变体的对应价格,传递给前端JS调用,同时初始化默认价格:

add_action( 'wp_enqueue_scripts', function() {
    global $product;
    if ( ! is_product() || ! $product || ! $product->is_type('variable') ) {
        return;
    }

    $variation_price_map = [];
    $available_variations = $product->get_available_variations();
    foreach ( $available_variations as $variation ) {
        // 按你的需求替换小数点为逗号,如需带价格符号可以改用$variation['price_html']
        $variation_price_map[ $variation['variation_id'] ] = str_replace( '.', ',', $variation['display_price'] );
    }

    // 获取默认选中变体的价格作为初始值
    $default_vid = $product->get_matching_variation( $product->get_default_attributes() );
    $initial_amount = $default_vid ? $variation_price_map[ $default_vid ] : str_replace( '.', ',', $product->get_price() );

    // 把数据注入到前端变体脚本的作用域
    wp_localize_script( 'wc-add-to-cart-variation', 'product_variation_cfg', [
        'price_map' => $variation_price_map,
        'default_amount' => $initial_amount
    ]);
}, 20 );

2. 前端JS:监听变体选择事件自动更新价格

把下面代码放到产品页模板,或者通过wp_add_inline_script挂载到WooCommerce变体脚本后面,监听变体选择事件实时更新amount值:

// 初始化amount变量为默认价格
let amount = product_variation_cfg.default_amount;

// 监听变体选中完成事件
jQuery(document).on('found_variation', 'form.variations_form.cart', function(e, variationData) {
    if ( product_variation_cfg.price_map.hasOwnProperty(variationData.variation_id) ) {
        amount = product_variation_cfg.price_map[variationData.variation_id];
        // 此处写入你拿到更新后amount需要执行的业务逻辑,比如渲染到页面、上报数据等
        console.log('当前选中变体价格:', amount);
    }
});

// 监听变体选择重置事件,恢复默认价格
jQuery(document).on('reset_data', 'form.variations_form.cart', function() {
    amount = product_variation_cfg.default_amount;
    console.log('已重置为默认价格:', amount);
});

如果你需要的是带货币符号的格式化价格,只需要把PHP里存价格的字段从display_price换成price_html即可,不需要自己额外做格式化处理。

内容的提问来源于stack exchange,提问作者Kiv Daor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:18:25