liquid折扣计算,多国家,多折扣类型一键切换,虚拟的折扣描述与实际折扣金额不符

14 阅读4分钟

1.简单介绍

shopify中,原价现价可以设置,但是很多时候产品都有折扣可以使用,那么需要展示的原价其实是产品的现价,现价是去掉折扣价格之后的价格,这shopify就不支持了

而且在实际情况的时候日常的折扣,活动的折扣与日常折扣肯定是有差异的,不同国家的折扣也是不同的,甚至显示的折扣描述,与实际的折扣金额都不同,这就导致价格计算很麻烦

2.代码适用范围

多种活动折扣,百分比折扣,多国家,虚拟的折扣描述与实际折扣金额不符的价格计算

3.前置条件,元字段,元对象设置

3.1 创建一个元对象

我是直接使用拼音简写了,怎么方便怎么来,你可以按照自己的命名规则来,我会将字段进行拆解

image.png

拆解:

  1. coupon_code_rczk_us,coupon_code折扣码,rczk折扣类型,us国家信息
  2. coupon_code_description_rczk_us,coupon_code_description折扣描述,rczk折扣类型,us国家信息
  3. coupon_code_description_price_rczk_us,coupon_code_description_price实际折扣,rczk折扣类型,us国家信息

3.2 将元对象配置给元字段

给产品增加一个元字段,并选择刚才创建的元对象

image.png

拆解:

  1. zkxx,折扣信息,可以修改,代码中将
assign zkxx = product.metafields.custom.zkxx.value  
# 改为
assign zkxx = product.metafields.custom.你的命名.value

3.3 模板设置

  1. 找到settings_schema.json,找个位置增加
{
        "type": "radio",
        "id": "activity_coupons_flag",
        "label": "活动折扣类型",
        "options": [
          {
            "value": "rczk",
            "label": "日常折扣"
          },
          {
            "value": "rzk",
            "label": "弱折扣"
          },
          {
            "value": "qzk",
            "label": "强折扣"
          },
          {
            "value": "ddzk",
            "label": "大底折扣"
          }
        ],
        "default": "rczk"
      },
  1. 在模板设置中就可以找到刚才设置的折扣类型,一键切换折扣的信息

4.代码

{% liquid
    assign hidden_state = 'hidden'
    assign code_value = ''
    assign description_value = ''
    assign description_price_value = ''
    assign variant = product.selected_or_first_available_variant
    assign price = variant.price | default: 1999
    assign new_price = price
    assign available = variant.available | default: false
    # 折扣类型:rczk / rzk / qzk / ddzk
    assign zk_type = settings.activity_coupons_flag | default: '' | downcase

    # 国家
    assign country_code = localization.country.iso_code | downcase

    # metaobject
    assign zkxx = product.metafields.custom.zkxx.value

    # ✅ 拼接 key
    assign code_key = 'coupon_code_' | append: zk_type | append: '_' | append: country_code
    assign description_key = 'coupon_code_description_' | append: zk_type | append: '_' | append: country_code
    assign description_price_key = 'coupon_code_description_price_' | append: zk_type | append: '_' | append: country_code

    # ✅ 从 metaobject 取值(方括号)
    assign code_val = zkxx[code_key]
    assign desc_val = zkxx[description_key]
    assign desc_price_val = zkxx[description_price_key]

    if code_val and code_val != blank
      assign code_value = code_val
    endif

    if desc_val and desc_val != blank
      assign description_value = desc_val
    endif

    if desc_price_val and desc_price_val != blank
      assign description_price_value = desc_price_val
    endif

    assign has_discount_config = false
    if code_value != blank or description_value != blank or description_price_value != blank
      assign has_discount_config = true
    endif
    unless zk_type == 'rczk' or has_discount_config
      assign fallback_type = 'rczk'
      assign fallback_code_key = 'coupon_code_' | append: fallback_type | append: '_' | append: country_code
      assign fallback_description_key = 'coupon_code_description_' | append: fallback_type | append: '_' | append: country_code
      assign fallback_description_price_key = 'coupon_code_description_price_' | append: fallback_type | append: '_' | append: country_code
    
      assign fallback_code_val = zkxx[fallback_code_key]
      assign fallback_desc_val = zkxx[fallback_description_key]
      assign fallback_desc_price_val = zkxx[fallback_description_price_key]
    
      if fallback_code_val != blank or fallback_desc_val != blank or fallback_desc_price_val != blank
        assign code_value = fallback_code_val
        assign description_value = fallback_desc_val
        assign description_price_value = fallback_desc_price_val
        assign has_discount_config = true
        assign zk_type = fallback_type
      endif
    endunless
    if has_discount_config
      unless code_value == blank and description_value == blank
        assign hidden_state = ''
      endunless
      # 处理折扣描述
      assign discount_text = description_value | strip
      assign discount_price_text = description_price_value | strip

      # 处理货币格式(去除千位分隔符 & 处理小数点)
      assign discount_text_clean = discount_text | replace: '€', '' | replace: 'C$', '' | replace: 'CA$', ''| replace: '$', '' | replace: '£', '' | replace: '%', ''

      assign discount_price_text_clean = discount_price_text | replace: '€', '' | replace: 'C$', '' | replace: 'CA$', ''| replace: '$', '' | replace: '£', ''

      assign has_dot = discount_text_clean | split: '.' | size
      assign has_comma = discount_text_clean | split: ',' | size

      if has_dot > 1 and has_comma > 1
        assign discount_text_clean = discount_text_clean | replace: ',', ''
      elsif has_dot == 1 and has_comma > 1
        assign discount_text_clean = discount_text_clean | replace: '.', '' | replace: ',', '.'
      endif

      assign has_dot_price = discount_price_text_clean | split: '.' | size
      assign has_comma_price = discount_price_text_clean | split: ',' | size

      if has_dot_price > 1 and has_comma_price > 1
        assign discount_price_text_clean = discount_price_text_clean | replace: ',', ''
      elsif has_dot_price == 1 and has_comma_price > 1
        assign discount_price_text_clean = discount_price_text_clean | replace: '.', '' | replace: ',', '.'
      endif

      assign discount_value_str = discount_text_clean | strip | split: ' ' | first
      assign discount_price_value_str = discount_price_text_clean | strip | split: ' ' | first

      assign discount_amount = 0
      if discount_price_value_str != blank
        assign discount_amount = discount_price_value_str | times: 100.0 | floor
      elsif discount_text contains '%'
        assign discount_percent = discount_value_str | times: 1.0
        assign discount_amount = price | times: discount_percent | divided_by: 100.0 | floor
      else
        assign discount_amount = discount_value_str | times: 100.0 | floor
      endif

      assign new_price = price | minus: discount_amount
      if new_price < 0
        assign new_price = 0
      endif

      # 格式化新价格
      assign money_price = new_price | money
      if settings.show_currency_code
        assign money_price = new_price | money_with_currency
      endif

      assign original_money_price = price | money
      if settings.show_currency_code
        assign original_money_price = price | money_with_currency
      endif

    else
      # 格式化新价格
      assign money_price = new_price | money
      if settings.show_currency_code
        assign money_price = new_price | money_with_currency
      endif

      assign original_money_price = price | money
      if settings.show_currency_code
        assign original_money_price = price | money_with_currency
      endif
    endif
  %}

5.代码注意事项

  • hidden_state,为是否有折扣,有折扣为空,无折扣为 “hidden”
  • 如果有coupon_code_description_price实际折扣的话,优先使用coupon_code_description_price进行价格计算 coupon_code_description_price的格式:$120,€120...
  • new_price为计算完成之后的现价,original_money_price是产品之前的现价
  • coupon_code_description的模式,支持 | replace: '€', '' | replace: 'C$', '' | replace: 'CA$', ''| replace: '$', '' | replace: '£', '' 其他的金钱符号可以自己添加,可以这么写比如:C$100 off,10% off
  • rczk,日常折扣会作为兜底,如果其他折扣类型没有设置,那么会使用日常折扣作为兜底的折扣类型