Aller au contenu
Exemples de Scripts

Migrating a Shopify Help Center script template

Every example script Shopify published shared one skeleton: a settings constant the merchant edited, a banner comment, then class code nobody was meant to touch. If your file opens with a row of equals signs, this is the dialect you have.

Reconstruit
Ce que faisait le Script

It read the merchant-edited constant at the top of the file and applied that discount to every matching line.

Les marchands ont écrit ceci de 2 façons différentes, et elles ne veulent pas toutes dire la même chose. Chaque variante figure ci-dessous avec son propre panier et ses propres chiffres.

Essayez-le sur votre propre boutique

Collez-le dans Sauvetage des Scripts et regardez ce qu'il reconstruit

  1. Copiez le Ruby avec le bouton placé à côté de chaque Script de cette page.
  2. Dans votre interface Shopify, ouvrez Stackable, puis Outils, puis Sauvetage des Scripts.
  3. Collez-le, lisez ce que l'outil annonce qu'il va construire et comparez-le aux réglages de cette page.

Sauvetage des Scripts fait partie du forfait Pro. Rien n'est publié tant que vous n'avez pas indiqué la remise de votre ancien Script et que les deux chiffres ne correspondent pas au centime près.

Official dialect, tiered spend

Reconstruit
Le Ruby d'origine

# ================================ Customizable Settings ================================
# ================================================================
# Tiered Discount by Spend
#
#   If the cart total is greater than (or equal to) an entered
#   threshold, the associated discount is applied to each item.
# ================================================================
SPENDING_THRESHOLDS = [
  {
    threshold: 30,
    discount_type: :percent,
    discount_amount: 10,
    discount_message: '10% off for spending over $30',
  },
  {
    threshold: 60,
    discount_type: :percent,
    discount_amount: 15,
    discount_message: '15% off for spending over $60',
  },
]

# ================================ Script Code (do not edit) ================================
class DiscountApplicator
  def initialize(discount_type, discount_amount, discount_message)
    @discount_type = discount_type
    @discount_message = discount_message

    @discount_amount = if discount_type == :percent
      1 - (discount_amount * 0.01)
    else
      Money.new(cents: 100) * discount_amount
    end
  end

  def apply(line_item)
    new_line_price = if @discount_type == :percent
      line_item.line_price * @discount_amount
    else
      [line_item.line_price - (@discount_amount * line_item.quantity), Money.zero].max
    end

    line_item.change_line_price(new_line_price, message: @discount_message)
  end
end

class TieredDiscountBySpendCampaign
  def initialize(campaigns)
    @campaigns = campaigns
  end

  def run(cart)
    applicable_campaign = nil

    @campaigns.each do |campaign|
      threshold = Money.new(cents: 100) * campaign[:threshold]
      applicable_campaign = campaign if cart.subtotal_price >= threshold
    end

    return if applicable_campaign.nil?

    discount_applicator = DiscountApplicator.new(
      applicable_campaign[:discount_type],
      applicable_campaign[:discount_amount],
      applicable_campaign[:discount_message],
    )

    cart.line_items.each do |line_item|
      discount_applicator.apply(line_item)
    end
  end
end

CAMPAIGNS = [
  TieredDiscountBySpendCampaign.new(SPENDING_THRESHOLDS),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart)
end

Output.cart = Input.cart
Ce que cela devient

Reconnu comme Spend threshold discount et reconstruit en offre de type spend_goal. Voici les vraies clés de configuration avec lesquelles l'offre est enregistrée, pour que vous puissiez comparer votre propre reconstruction champ par champ.

Chaque réglage, en détail
RéglageValeurClé de configuration
Offer typespend_goaltype
Countingper_cartcounting
Recurrenceoncerecurrence
Tier 1min spend $30.00 -> 10% offtiers[0]
Tier 2min spend $60.00 -> 15% offtiers[1]
Target scopealltarget.scope
MethodautomaticdiscountMethod
Allocationstandardstacking.allocation
Combines with other discountsnostacking
Il vous sera demandé de confirmer
  • Confirm which products this applies to. We could not read product targeting from the script.
Le panier qui le prouve

Construit sur notre boutique de démonstration publique, Meridian Goods, pour que chaque prix ici puisse être reproduit plutôt que cru sur parole. La remise ci-dessous est ce que le moteur qui tourne au paiement calcule pour ce panier précis.

Le panier qui déclenche cette offre, et ce qu'elle coûte
ArticleQtéPrix unitaire
Softcover Notebook Set1$18.00
Braided USB-C Cable1$14.00
Sous-total$32.00
Remise-$3.20
Total$28.80

Déconnecté, ou connecté en tant que client sans tag.

Le chiffre auquel l'outil vous compare

Avant la publication, l'outil demande ce que votre ancien Script faisait à un panier que vous avez déjà. Réglez-le sur 2 de Softcover Notebook Set à $18.00 et la réponse est fixée.

La remise est de $3.60. Le total payé par l'acheteur est de $32.40.

La comparaison est exacte, jusqu'à la plus petite unité de votre devise. Un centime d'écart et la publication reste bloquée, ce qui est tout l'intérêt de l'étape.

Le panier qui ne doit rien produire
  • swap the cart for a single Braided USB-C Cable
Le panier qui ne doit pas déclencher cette offre
ArticleQtéPrix unitaire
Braided USB-C Cable1$14.00
Sous-total$14.00
Total$14.00

Déconnecté, ou connecté en tant que client sans tag.

Official dialect, lineitem applicator (D16)

Reconstruit

Paire à risque D16. Ce fichier et son jumeau se ressemblent presque à l'identique et se comportent différemment, alors lisez les deux avant de décider lequel vous avez.

Le Ruby d'origine

# ================================ Customizable Settings ================================
DISCOUNT_TYPE = :percent
DISCOUNT_AMOUNT = 10
DISCOUNT_MESSAGE = '10% off everything'

# ================================ Script Code (do not edit) ================================
class DiscountApplicator
  def initialize(discount_type, discount_amount, discount_message)
    @discount_type = discount_type
    @discount_message = discount_message

    @discount_amount = if discount_type == :percent
      1 - (discount_amount * 0.01)
    else
      Money.new(cents: 100) * discount_amount
    end
  end

  def apply(line_item)
    new_line_price = if @discount_type == :percent
      line_item.line_price * @discount_amount
    else
      [line_item.line_price - (@discount_amount * line_item.quantity), Money.zero].max
    end

    line_item.change_line_price(new_line_price, message: @discount_message)
  end
end

class ProductDiscountCampaign
  def initialize(discount_applicator)
    @discount_applicator = discount_applicator
  end

  def run(cart)
    cart.line_items.each do |line_item|
      @discount_applicator.apply(line_item)
    end
  end
end

CAMPAIGNS = [
  ProductDiscountCampaign.new(
    DiscountApplicator.new(DISCOUNT_TYPE, DISCOUNT_AMOUNT, DISCOUNT_MESSAGE),
  ),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart)
end

Output.cart = Input.cart
Ce que cela devient

Reconnu comme Percentage off et reconstruit en offre de type volume. Voici les vraies clés de configuration avec lesquelles l'offre est enregistrée, pour que vous puissiez comparer votre propre reconstruction champ par champ.

Chaque réglage, en détail
RéglageValeurClé de configuration
Offer typevolumetype
Countingper_productcounting
Recurrenceoncerecurrence
Tier 1min qty 1 -> 10% offtiers[0]
Target scopealltarget.scope
MethodautomaticdiscountMethod
Allocationstandardstacking.allocation
Combines with other discountsnostacking
Il vous sera demandé de confirmer
  • Confirm which products this applies to. We could not read product targeting from the script.
Le panier qui le prouve

Construit sur notre boutique de démonstration publique, Meridian Goods, pour que chaque prix ici puisse être reproduit plutôt que cru sur parole. La remise ci-dessous est ce que le moteur qui tourne au paiement calcule pour ce panier précis.

Le panier qui déclenche cette offre, et ce qu'elle coûte
ArticleQtéPrix unitaire
Braided USB-C Cable1$14.00
Sous-total$14.00
Remise-$1.40
Total$12.60

Déconnecté, ou connecté en tant que client sans tag.

Le chiffre auquel l'outil vous compare

Avant la publication, l'outil demande ce que votre ancien Script faisait à un panier que vous avez déjà. Réglez-le sur 1 de Braided USB-C Cable à $14.00 et la réponse est fixée.

La remise est de $1.40. Le total payé par l'acheteur est de $12.60.

La comparaison est exacte, jusqu'à la plus petite unité de votre devise. Un centime d'écart et la publication reste bloquée, ce qui est tout l'intérêt de l'étape.

Le panier qui ne doit rien produire

This rule carries no condition at all, so it fires on any cart holding anything and there is no quiet cart to build. The negative check is an empty cart, which the app runs for you. That is correct behaviour, not a failure.

Deux fichiers qui se ressemblent

Chaque paire ci-dessous est une même forme de Script écrite de deux façons. Une ou deux lignes les séparent et elles ne font pas la même chose, alors lisez les deux avant de décider laquelle vous avez.

Paire piégeuse D16

Official dialect, lineitem applicator (D16)

Reconstruit

Reconstruit en offre volume.

Remise sur son propre panier : $1.40

Les lignes qui changent
DISCOUNT_MESSAGE = '10% off everything'
      1 - (discount_amount * 0.01)
  def apply(line_item)
    new_line_price = if @discount_type == :percent
      line_item.line_price * @discount_amount
      [line_item.line_price - (@discount_amount * line_item.quantity), Money.zero].max

Et 8 autres lignes différentes, sur sa propre page.

Lire Help Center script template

Official dialect, shipping applicator (D16)

Reconstruit

Reconstruit en offre free_shipping.

Économie de livraison sur son propre panier : $0.69

Les lignes qui changent
DISCOUNT_MESSAGE = '10% off shipping'
      discount_amount * 0.01
  def apply(shipping_rate)
    discount_amount = if @discount_type == :percent
      shipping_rate.price * @discount_amount
      @discount_amount > shipping_rate.price ? shipping_rate.price : @discount_amount

Et 8 autres lignes différentes, sur sa propre page.

Lire Percentage off shipping

Questions fréquentes

Will Stackable rebuild this script?
Yes. Every spelling on this page is rebuilt today as a spend_goal offer, and the cart above is the one that proves it.
What cart proves it works?
1 x Softcover Notebook Set at $18.00 plus 1 x Braided USB-C Cable at $14.00. The engine takes $3.20 off, and checkout charges $28.80.
What will I have to check before publishing?
Confirm which products this applies to. We could not read product targeting from the script.

Formes de Script apparentées

Percentage off shipping

A share taken off every delivery rate at checkout.

Script Creator output

Generator output, with a CAMPAIGNS array at the bottom that states the merchant’s intent as data.

Collez votre Script et voyez sa reconstruction

La reconstruction est comparée au montant que facturait votre ancien Script avant que vous puissiez la publier.

Nous utilisons des cookies essentiels pour faire fonctionner ce site et, uniquement avec votre autorisation, des cookies d'analyse pour comprendre le trafic. Consultez notre Politique de cookies.