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

Shopify:add.js提交的自定义价格表单数据显示异常求助

Shopify自定义购物车价格显示异常问题

我在Shopify中通过add.js将properties[price]字段提交至购物车,预期在购物车页面显示自定义价格£110.79,但实际显示为£1.11,无法定位问题原因。当前代码实现如下:

前端提交代码

function modifyCartBtn(price) {
  document.getElementById('AddToCart-product-template').addEventListener('click', function() {
    var modifiedPrice = Number(price);
    var formData = new FormData();
    formData.append('id', {{ product.variants.first.id }});
    formData.append('quantity', 1);
    formData.append('properties[price]', price.toString());

    fetch('/cart/add.js', {
      method: 'POST',
      body: new URLSearchParams(formData),
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
      },
    })
    .then(response => response.json())
    .then(data => {
      console.log(data);
    })
    .catch(error => {
      console.error('Error:', error);
    });
  });
}

购物车页面渲染代码

{% for item in cart.items %}
  <p>Product: {{ item.product.title }}</p>
  <p>Price: {{ item.price | money }}</p>
  <p>Modified Price: {{ item.properties.price | money }}</p>
{% endfor %}

问题原因

Shopify的money过滤器默认将输入值视为以分为单位的整数。你提交的price是字符串形式的"110.79",过滤器会把它当作110.79分计算,也就是£1.11(1英镑=100分),这就是显示异常的核心原因。

解决方案

方案1:提交时转换为整数分(推荐)

在前端提交价格时,将金额转换为以分为单位的整数,匹配money过滤器的预期逻辑:

function modifyCartBtn(price) {
  document.getElementById('AddToCart-product-template').addEventListener('click', function() {
    // 将价格转换为分(四舍五入避免浮点精度问题)
    var priceInCents = Math.round(Number(price) * 100);
    var formData = new FormData();
    formData.append('id', {{ product.variants.first.id }});
    formData.append('quantity', 1);
    // 提交分的整数形式
    formData.append('properties[price]', priceInCents.toString());

    fetch('/cart/add.js', {
      method: 'POST',
      body: new URLSearchParams(formData),
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
      },
    })
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
  });
}

购物车渲染代码保持不变即可,money过滤器会自动将分转换为正确的英镑格式。

方案2:渲染时手动转换为英镑

如果不想修改提交逻辑,可在渲染时先将字符串转换为数值,再格式化显示:

{% for item in cart.items %}
  <p>Product: {{ item.product.title }}</p>
  <p>Price: {{ item.price | money }}</p>
  {% assign customPrice = item.properties.price | times: 1 %}
  <p>Modified Price: £{{ customPrice | round: 2 }}</p>
{% endfor %}

注意:此方式需要确保item.properties.price是有效的数值字符串,否则可能出现显示错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:51