1.简单介绍
shopify中,原价现价可以设置,但是很多时候产品都有折扣可以使用,那么需要展示的原价其实是产品的现价,现价是去掉折扣价格之后的价格,这shopify就不支持了
而且在实际情况的时候日常的折扣,活动的折扣与日常折扣肯定是有差异的,不同国家的折扣也是不同的,甚至显示的折扣描述,与实际的折扣金额都不同,这就导致价格计算很麻烦
2.代码适用范围
多种活动折扣,百分比折扣,多国家,虚拟的折扣描述与实际折扣金额不符的价格计算
3.前置条件,元字段,元对象设置
3.1 创建一个元对象
我是直接使用拼音简写了,怎么方便怎么来,你可以按照自己的命名规则来,我会将字段进行拆解
拆解:
- coupon_code_rczk_us,coupon_code折扣码,rczk折扣类型,us国家信息
- coupon_code_description_rczk_us,coupon_code_description折扣描述,rczk折扣类型,us国家信息
- coupon_code_description_price_rczk_us,coupon_code_description_price实际折扣,rczk折扣类型,us国家信息
3.2 将元对象配置给元字段
给产品增加一个元字段,并选择刚才创建的元对象
拆解:
- zkxx,折扣信息,可以修改,代码中将
assign zkxx = product.metafields.custom.zkxx.value
# 改为
assign zkxx = product.metafields.custom.你的命名.value
3.3 模板设置
- 找到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"
},
- 在模板设置中就可以找到刚才设置的折扣类型,一键切换折扣的信息
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,日常折扣会作为兜底,如果其他折扣类型没有设置,那么会使用日常折扣作为兜底的折扣类型