Vai al contenuto
Esempi di Script

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.

Ricostruito
Cosa faceva lo Script

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

I merchant lo hanno scritto in 3 modi diversi, e non significano tutti la stessa cosa. Ogni variante è riportata sotto con il proprio carrello e i propri numeri.

Provalo sul tuo negozio

Incollalo in Recupero Script e guarda cosa ricostruisce

  1. Copia il Ruby con il pulsante accanto a ogni Script di questa pagina.
  2. Nell'admin di Shopify apri Stackable, poi Strumenti, poi Recupero Script.
  3. Incollalo lì, leggi cosa dichiara di costruire lo strumento e confrontalo con le impostazioni di questa pagina.

Recupero Script è nel piano Pro. Non viene pubblicato nulla finché non dichiari quanto scontava il vecchio Script e le due cifre non coincidono al centesimo.

Official dialect, product selector include (D13)

Ricostruito

Coppia rischiosa D13. Questo file e il suo gemello sembrano quasi identici e si comportano in modo diverso, quindi leggili entrambi prima di decidere quale hai.

Il Ruby originale

# ================================ 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
In cosa si trasforma

Riconosciuto come Percentage off e ricostruito come offerta di tipo volume. Queste sono le vere chiavi di configurazione con cui l'offerta viene salvata, così puoi confrontare la tua ricostruzione campo per campo.

Ogni impostazione, nel dettaglio
ImpostazioneValoreChiave di configurazione
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
Ti verrà chiesta una conferma
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Il carrello che lo dimostra

Creato sul nostro negozio demo pubblico, Meridian Goods, così ogni prezzo qui si può riprodurre invece di doverci credere sulla parola. Lo sconto qui sotto è quello che lo stesso motore che gira al checkout calcola per questo esatto carrello.

Il carrello che attiva questa offerta, e quanto costa
ArticoloQtàPrezzo unit.
Ceramic Travel Mug1$22.00
Subtotale$22.00
Sconto-$4.40
Totale$17.60

Nessun accesso, oppure accesso come cliente senza tag.

La cifra con cui lo strumento ti confronta

Prima della pubblicazione, lo strumento chiede cosa faceva il tuo vecchio Script a un carrello che hai già. Impostalo su 1 di Ceramic Travel Mug a $22.00 e la risposta è fissata.

Lo sconto è $4.40. Il totale pagato dal cliente è $17.60.

Il confronto è esatto, fino alla più piccola unità della tua valuta. Un centesimo di scarto e la pubblicazione resta bloccata, che è tutto il senso di questo passaggio.

Il carrello che non deve produrre nulla
  • swap the cart for a single Braided USB-C Cable
Il carrello che non deve attivare questa offerta
ArticoloQtàPrezzo unit.
Braided USB-C Cable1$14.00
Subtotale$14.00
Totale$14.00

Nessun accesso, oppure accesso come cliente senza tag.

Official dialect, product selector exclude (D13)

Ricostruito

Coppia rischiosa D13. Questo file e il suo gemello sembrano quasi identici e si comportano in modo diverso, quindi leggili entrambi prima di decidere quale hai.

Il Ruby originale

# ================================ 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
In cosa si trasforma

Riconosciuto come Percentage off e ricostruito come offerta di tipo volume. Queste sono le vere chiavi di configurazione con cui l'offerta viene salvata, così puoi confrontare la tua ricostruzione campo per campo.

Ogni impostazione, nel dettaglio
ImpostazioneValoreChiave di configurazione
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
Ti verrà chiesta una conferma
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Il carrello che lo dimostra

Creato sul nostro negozio demo pubblico, Meridian Goods, così ogni prezzo qui si può riprodurre invece di doverci credere sulla parola. Lo sconto qui sotto è quello che lo stesso motore che gira al checkout calcola per questo esatto carrello.

  • 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.
Il carrello che attiva questa offerta, e quanto costa
ArticoloQtàPrezzo unit.
Braided USB-C Cable1$14.00
Subtotale$14.00
Sconto-$2.80
Totale$11.20

Nessun accesso, oppure accesso come cliente senza tag.

La cifra con cui lo strumento ti confronta

Prima della pubblicazione, lo strumento chiede cosa faceva il tuo vecchio Script a un carrello che hai già. Impostalo su 1 di Braided USB-C Cable a $14.00 e la risposta è fissata.

Lo sconto è $2.80. Il totale pagato dal cliente è $11.20.

Il confronto è esatto, fino alla più piccola unità della tua valuta. Un centesimo di scarto e la pubblicazione resta bloccata, che è tutto il senso di questo passaggio.

Il carrello che non deve produrre nulla
  • swap the cart for a single Ceramic Travel Mug
Il carrello che non deve attivare questa offerta
ArticoloQtàPrezzo unit.
Ceramic Travel Mug1$22.00
Subtotale$22.00
Totale$22.00

Nessun accesso, oppure accesso come cliente senza tag.

Scope targeting family tag (D9)

Ricostruito

Coppia rischiosa D9. Questo file e il suo gemello sembrano quasi identici e si comportano in modo diverso, quindi leggili entrambi prima di decidere quale hai.

Il Ruby originale

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
In cosa si trasforma

Riconosciuto come Percentage off e ricostruito come offerta di tipo volume. Queste sono le vere chiavi di configurazione con cui l'offerta viene salvata, così puoi confrontare la tua ricostruzione campo per campo.

Ogni impostazione, nel dettaglio
ImpostazioneValoreChiave di configurazione
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
Ti verrà chiesta una conferma
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Il carrello che lo dimostra

Creato sul nostro negozio demo pubblico, Meridian Goods, così ogni prezzo qui si può riprodurre invece di doverci credere sulla parola. Lo sconto qui sotto è quello che lo stesso motore che gira al checkout calcola per questo esatto carrello.

Il carrello che attiva questa offerta, e quanto costa
ArticoloQtàPrezzo unit.
Ceramic Travel Mug1$22.00
Subtotale$22.00
Sconto-$4.40
Totale$17.60

Nessun accesso, oppure accesso come cliente senza tag.

La cifra con cui lo strumento ti confronta

Prima della pubblicazione, lo strumento chiede cosa faceva il tuo vecchio Script a un carrello che hai già. Impostalo su 1 di Ceramic Travel Mug a $22.00 e la risposta è fissata.

Lo sconto è $4.40. Il totale pagato dal cliente è $17.60.

Il confronto è esatto, fino alla più piccola unità della tua valuta. Un centesimo di scarto e la pubblicazione resta bloccata, che è tutto il senso di questo passaggio.

Il carrello che non deve produrre nulla
  • swap the cart for a single Braided USB-C Cable
Il carrello che non deve attivare questa offerta
ArticoloQtàPrezzo unit.
Braided USB-C Cable1$14.00
Subtotale$14.00
Totale$14.00

Nessun accesso, oppure accesso come cliente senza tag.

Due file che sembrano uguali

Ogni coppia qui sotto è la stessa forma di Script scritta in due modi. Cambiano una o due righe e fanno cose diverse, quindi leggile entrambe prima di decidere quale hai.

Coppia insidiosa D9

Scope targeting family tag (D9)

Ricostruito

Ricostruito come offerta volume.

Sconto sul suo carrello: $4.40

Righe che cambiano
  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")
Leggi Scoped to a tag or vendor

Flat percentage off all (D9)

Ricostruito

Ricostruito come offerta volume.

Sconto sul suo carrello: $2.80

Righe che cambiano
  li.change_line_price(li.original_line_price * (1.0 - (20 / 100.0)), message: "20% off everything")
Leggi Sitewide percentage off

Coppia insidiosa D13

Official dialect, product selector include (D13)

Ricostruito

Ricostruito come offerta volume.

Sconto sul suo carrello: $4.40

Righe che cambiano
    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

E altre 10 righe diverse, sulla sua pagina.

Leggi Scoped to a tag or vendor

Official dialect, product selector exclude (D13)

Ricostruito

Ricostruito come offerta volume.

Sconto sul suo carrello: $2.80

Righe che cambiano
    product_selector_match_type: :exclude,
    discount_message: "20% off full-price items",
Leggi Scoped to a tag or vendor

Domande frequenti

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.

Forme di Script correlate

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.

Incolla il tuo Script e guardalo ricostruito

La ricostruzione viene confrontata con l'importo che il tuo vecchio Script applicava, prima che tu possa pubblicarla.

Utilizziamo cookie essenziali per il funzionamento del sito e, solo con il Suo consenso, cookie di analisi per comprendere il traffico. Legga la nostra Informativa sui Cookie.