Spring til indhold
Script-eksempler

Migrating a script scoped to a tag, vendor or product type

A dropped filter is the most expensive class of mistake in a migration, because it is silent and it is confident: the percentage is read perfectly and applied to everything you sell. Note that Scripts could not read collections at all.

Genopbygget
Hvad dette Script gjorde

It skipped every line whose product did not carry the listed tag, vendor or type.

Handlende har skrevet det her på 3 forskellige måder, og de betyder ikke alle det samme. Hver variant står nedenfor med sin egen kurv og sine egne tal.

Prøv det i din egen butik

Indsæt det i Scripts-redning, og se hvad der bliver bygget

  1. Kopiér Ruby-koden med knappen ved siden af ethvert Script på siden.
  2. Åbn Stackable i Shopify-administrationen, derefter Værktøjer og så Scripts-redning.
  3. Indsæt det der, læs hvad værktøjet siger, det vil bygge, og hold det op mod indstillingerne på denne side.

Scripts-redning hører til Pro-abonnementet. Intet bliver udgivet, før du oplyser, hvad dit gamle Script gav i rabat, og de to beløb stemmer helt ned på øret.

Official dialect, product selector include (D13)

Genopbygget

Farligt par D13. Denne fil og dens makker ser næsten ens ud og opfører sig forskelligt, så læs dem begge, før du afgør, hvilken du har.

Den oprindelige Ruby-kode

# ================================ Customizable Settings ================================
PRODUCT_DISCOUNTS = [
  {
    product_selector_match_type: :include,
    product_selector_type: :tag,
    product_selectors: ["sale"],
    discount_type: :percent,
    discount_amount: 20,
    discount_message: "20% off sale items",
  },
]

# ================================ Script Code (do not edit) ================================
class ProductSelector
  def initialize(match_type, selector_type, selectors)
    @match_type = match_type
    @comparator = match_type == :include ? 'any?' : 'none?'
    @selector_type = selector_type
    @selectors = selectors
  end

  def match?(line_item)
    if self.respond_to?(@selector_type)
      self.send(@selector_type, line_item)
    else
      raise RuntimeError.new('Invalid product selector type')
    end
  end

  def tag(line_item)
    product_tags = line_item.variant.product.tags.map { |tag| tag.downcase.strip }
    @selectors = @selectors.map { |selector| selector.downcase.strip }
    (@selectors & product_tags).send(@comparator)
  end

  def type(line_item)
    @selectors = @selectors.map { |selector| selector.downcase.strip }
    (@selectors.include?(line_item.variant.product.product_type.downcase.strip)) == (@match_type == :include)
  end

  def vendor(line_item)
    @selectors = @selectors.map { |selector| selector.downcase.strip }
    (@selectors.include?(line_item.variant.product.vendor.downcase.strip)) == (@match_type == :include)
  end

  def product_id(line_item)
    (@selectors.include?(line_item.variant.product.id)) == (@match_type == :include)
  end

  def variant_id(line_item)
    (@selectors.include?(line_item.variant.id)) == (@match_type == :include)
  end

  def all(line_item)
    true
  end
end

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

  def run(cart)
    @campaigns.each do |campaign|
      product_selector = ProductSelector.new(
        campaign[:product_selector_match_type],
        campaign[:product_selector_type],
        campaign[:product_selectors],
      )

      cart.line_items.each do |line_item|
        next unless product_selector.match?(line_item)
        line_item.change_line_price(
          line_item.line_price * (1 - (campaign[:discount_amount] * 0.01)),
          message: campaign[:discount_message],
        )
      end
    end
  end
end

CAMPAIGNS = [
  ProductDiscountCampaign.new(PRODUCT_DISCOUNTS),
]

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

Output.cart = Input.cart
Hvad det bliver til

Genkendt som Percentage off og genopbygget som et tilbud af typen volume. Det her er de rigtige konfigurationsnøgler, som tilbuddet gemmes med, så du kan tjekke din egen genopbygning felt for felt.

Hver indstilling, skrevet ud
IndstillingVærdiKonfigurationsnøgle
Offer typevolumetype
Countingper_productcounting
Recurrenceoncerecurrence
Tier 1min qty 1 -> 20% offtiers[0]
Target scopetagstarget.scope
Target includessaletarget.includeIds
MethodautomaticdiscountMethod
Allocationstandardstacking.allocation
Combines with other discountsnostacking
Du bliver bedt om at bekræfte
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Kurven, der beviser det

Bygget i vores offentlige demobutik, Meridian Goods, så hver pris her kan efterregnes i stedet for at blive taget på tro. Rabatten nedenfor er det, som den samme motor, der kører i kassen, beregner for præcis denne kurv.

Kurven, der udløser dette tilbud, og hvad det koster
VareAntalStykpris
Ceramic Travel Mug1$22.00
Subtotal$22.00
Rabat-$4.40
Total$17.60

Logget ud, eller logget ind som kunde uden tags.

Beløbet, som værktøjet holder dig op mod

Inden du udgiver, spørger værktøjet, hvad dit gamle Script gjorde ved en kurv, du allerede har. Sæt den til 1 af Ceramic Travel Mug à $22.00, så ligger svaret fast.

Rabatten er $4.40. Det beløb, kunden betalte, er $17.60.

Sammenligningen er præcis, helt ned til den mindste enhed i din valuta. En øre ved siden af, og udgivelsen forbliver spærret, hvilket er hele pointen med trinnet.

Kurven, der ikke må give noget
  • swap the cart for a single Braided USB-C Cable
Kurven, der ikke må udløse dette tilbud
VareAntalStykpris
Braided USB-C Cable1$14.00
Subtotal$14.00
Total$14.00

Logget ud, eller logget ind som kunde uden tags.

Official dialect, product selector exclude (D13)

Genopbygget

Farligt par D13. Denne fil og dens makker ser næsten ens ud og opfører sig forskelligt, så læs dem begge, før du afgør, hvilken du har.

Den oprindelige Ruby-kode

# ================================ Customizable Settings ================================
PRODUCT_DISCOUNTS = [
  {
    product_selector_match_type: :exclude,
    product_selector_type: :tag,
    product_selectors: ["sale"],
    discount_type: :percent,
    discount_amount: 20,
    discount_message: "20% off full-price items",
  },
]

# ================================ Script Code (do not edit) ================================
class ProductSelector
  def initialize(match_type, selector_type, selectors)
    @match_type = match_type
    @comparator = match_type == :include ? 'any?' : 'none?'
    @selector_type = selector_type
    @selectors = selectors
  end

  def match?(line_item)
    if self.respond_to?(@selector_type)
      self.send(@selector_type, line_item)
    else
      raise RuntimeError.new('Invalid product selector type')
    end
  end

  def tag(line_item)
    product_tags = line_item.variant.product.tags.map { |tag| tag.downcase.strip }
    @selectors = @selectors.map { |selector| selector.downcase.strip }
    (@selectors & product_tags).send(@comparator)
  end

  def all(line_item)
    true
  end
end

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

  def run(cart)
    @campaigns.each do |campaign|
      product_selector = ProductSelector.new(
        campaign[:product_selector_match_type],
        campaign[:product_selector_type],
        campaign[:product_selectors],
      )

      cart.line_items.each do |line_item|
        next unless product_selector.match?(line_item)
        line_item.change_line_price(
          line_item.line_price * (1 - (campaign[:discount_amount] * 0.01)),
          message: campaign[:discount_message],
        )
      end
    end
  end
end

CAMPAIGNS = [
  ProductDiscountCampaign.new(PRODUCT_DISCOUNTS),
]

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

Output.cart = Input.cart
Hvad det bliver til

Genkendt som Percentage off og genopbygget som et tilbud af typen volume. Det her er de rigtige konfigurationsnøgler, som tilbuddet gemmes med, så du kan tjekke din egen genopbygning felt for felt.

Hver indstilling, skrevet ud
IndstillingVærdiKonfigurationsnøgle
Offer typevolumetype
Countingper_productcounting
Recurrenceoncerecurrence
Tier 1min qty 1 -> 20% offtiers[0]
Target scopealltarget.scope
Target excludessaletarget.excludeIds
MethodautomaticdiscountMethod
Allocationstandardstacking.allocation
Combines with other discountsnostacking
Du bliver bedt om at bekræfte
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Kurven, der beviser det

Bygget i vores offentlige demobutik, Meridian Goods, så hver pris her kan efterregnes i stedet for at blive taget på tro. Rabatten nedenfor er det, som den samme motor, der kører i kassen, beregner for præcis denne kurv.

  • Targeting excludes sale. No Meridian Goods product carries those, so every product stays eligible and the exclusion is proved by the campaign settings, not by the cart.
Kurven, der udløser dette tilbud, og hvad det koster
VareAntalStykpris
Braided USB-C Cable1$14.00
Subtotal$14.00
Rabat-$2.80
Total$11.20

Logget ud, eller logget ind som kunde uden tags.

Beløbet, som værktøjet holder dig op mod

Inden du udgiver, spørger værktøjet, hvad dit gamle Script gjorde ved en kurv, du allerede har. Sæt den til 1 af Braided USB-C Cable à $14.00, så ligger svaret fast.

Rabatten er $2.80. Det beløb, kunden betalte, er $11.20.

Sammenligningen er præcis, helt ned til den mindste enhed i din valuta. En øre ved siden af, og udgivelsen forbliver spærret, hvilket er hele pointen med trinnet.

Kurven, der ikke må give noget
  • swap the cart for a single Ceramic Travel Mug
Kurven, der ikke må udløse dette tilbud
VareAntalStykpris
Ceramic Travel Mug1$22.00
Subtotal$22.00
Total$22.00

Logget ud, eller logget ind som kunde uden tags.

Scope targeting family tag (D9)

Genopbygget

Farligt par D9. Denne fil og dens makker ser næsten ens ud og opfører sig forskelligt, så læs dem begge, før du afgør, hvilken du har.

Den oprindelige Ruby-kode

Input.cart.line_items.each do |li|
  next unless li.variant.product.tags.include?('sale')
  li.change_line_price(li.original_line_price * (1.0 - (20 / 100.0)), message: "20% off sale")
end

Output.cart = Input.cart
Hvad det bliver til

Genkendt som Percentage off og genopbygget som et tilbud af typen volume. Det her er de rigtige konfigurationsnøgler, som tilbuddet gemmes med, så du kan tjekke din egen genopbygning felt for felt.

Hver indstilling, skrevet ud
IndstillingVærdiKonfigurationsnøgle
Offer typevolumetype
Countingper_productcounting
Recurrenceoncerecurrence
Tier 1min qty 1 -> 20% offtiers[0]
Target scopetagstarget.scope
Target includessaletarget.includeIds
MethodautomaticdiscountMethod
Allocationstandardstacking.allocation
Combines with other discountsnostacking
Du bliver bedt om at bekræfte
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Kurven, der beviser det

Bygget i vores offentlige demobutik, Meridian Goods, så hver pris her kan efterregnes i stedet for at blive taget på tro. Rabatten nedenfor er det, som den samme motor, der kører i kassen, beregner for præcis denne kurv.

Kurven, der udløser dette tilbud, og hvad det koster
VareAntalStykpris
Ceramic Travel Mug1$22.00
Subtotal$22.00
Rabat-$4.40
Total$17.60

Logget ud, eller logget ind som kunde uden tags.

Beløbet, som værktøjet holder dig op mod

Inden du udgiver, spørger værktøjet, hvad dit gamle Script gjorde ved en kurv, du allerede har. Sæt den til 1 af Ceramic Travel Mug à $22.00, så ligger svaret fast.

Rabatten er $4.40. Det beløb, kunden betalte, er $17.60.

Sammenligningen er præcis, helt ned til den mindste enhed i din valuta. En øre ved siden af, og udgivelsen forbliver spærret, hvilket er hele pointen med trinnet.

Kurven, der ikke må give noget
  • swap the cart for a single Braided USB-C Cable
Kurven, der ikke må udløse dette tilbud
VareAntalStykpris
Braided USB-C Cable1$14.00
Subtotal$14.00
Total$14.00

Logget ud, eller logget ind som kunde uden tags.

To filer, der ligner hinanden

Hvert par herunder er den samme Script-form skrevet på to måder. De adskiller sig på en eller to linjer og gør noget forskelligt, så læs dem begge, før du afgør, hvilken du har.

Farligt par D9

Scope targeting family tag (D9)

Genopbygget

Bygges om til et volume-tilbud.

Rabat i dens egen kurv: $4.40

Linjer der er forskellige
  next unless li.variant.product.tags.include?('sale')
  li.change_line_price(li.original_line_price * (1.0 - (20 / 100.0)), message: "20% off sale")
Læs Scoped to a tag or vendor

Flat percentage off all (D9)

Genopbygget

Bygges om til et volume-tilbud.

Rabat i dens egen kurv: $2.80

Linjer der er forskellige
  li.change_line_price(li.original_line_price * (1.0 - (20 / 100.0)), message: "20% off everything")
Læs Sitewide percentage off

Farligt par D13

Official dialect, product selector include (D13)

Genopbygget

Bygges om til et volume-tilbud.

Rabat i dens egen kurv: $4.40

Linjer der er forskellige
    product_selector_match_type: :include,
    discount_message: "20% off sale items",
  def type(line_item)
    @selectors = @selectors.map { |selector| selector.downcase.strip }
    (@selectors.include?(line_item.variant.product.product_type.downcase.strip)) == (@match_type == :include)
  end

Og 10 flere forskellige linjer, på dens egen side.

Læs Scoped to a tag or vendor

Official dialect, product selector exclude (D13)

Genopbygget

Bygges om til et volume-tilbud.

Rabat i dens egen kurv: $2.80

Linjer der er forskellige
    product_selector_match_type: :exclude,
    discount_message: "20% off full-price items",
Læs Scoped to a tag or vendor

Ofte stillede spørgsmål

Will Stackable rebuild this script?
Yes. Every spelling on this page is rebuilt today as a volume offer, and the cart above is the one that proves it.
What cart proves it works?
1 x Ceramic Travel Mug at $22.00. The engine takes $4.40 off, and checkout charges $17.60.
What will I have to check before publishing?
Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.

Beslægtede Script-typer

Sitewide percentage off

One percentage off the whole catalogue, with no condition attached.

Exclude sale items

Already-marked-down products protected from a second discount.

Exclude gift cards

Gift cards left out of a discount that would otherwise have hit them.

Indsæt dit Script og se det blive genopbygget

Genopbygningen holdes op mod det beløb, dit gamle Script opkrævede, før du kan udgive den.

Vi bruger essentielle cookies til at drive dette site, og kun med din tilladelse, analysecookies til at forstå trafik. Læs vores Cookiepolitik.