Aller au contenu
Exemples de Scripts

Migrating a Shopify Script Creator script

Merchants who could not write Ruby used a generator, so the most common paste in the world is not hand-written at all. The 200 lines of class definitions are boilerplate; the array at the bottom is the offer.

Reconstruit
Ce que faisait le Script

It ran each campaign in the CAMPAIGNS array against the cart, in order, using a fixed library of qualifier and discount classes.

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.

Le Script

Reconstruit
Le Ruby d'origine

# GENERATED BY THE SHOPIFY SCRIPT CREATOR APP
# Version 0.12.0

class Campaign
  def initialize(condition, *qualifiers)
    @condition = (condition.to_s + '?').to_sym
    @qualifiers = PostCartAmountQualifier ? [] : [] rescue qualifiers.compact
    @line_item_selector = qualifiers.last unless @line_item_selector
    qualifiers.compact.each do |qualifier|
      is_multi_select = qualifier.instance_variable_get(:@conditions).is_a?(Array)
      if is_multi_select
        qualifier.instance_variable_get(:@conditions).each do |nested_q|
          @post_amount_qualifier = nested_q if nested_q.is_a?(PostCartAmountQualifier)
          @qualifiers << qualifier
        end
      else
        @post_amount_qualifier = qualifier if qualifier.is_a?(PostCartAmountQualifier)
        @qualifiers << qualifier
      end
    end if @qualifiers.empty?
  end

  def qualifies?(cart)
    return true if @qualifiers.empty?
    @qualifiers.send(@condition) do |qualifier|
      is_selector = false
      if qualifier.is_a?(Selector) || qualifier.is_a?(Array)
        is_selector = true
      end rescue nil
      if is_selector
        raise 'Missing line item match type' if @li_match_type.nil?
        cart.line_items.send(@li_match_type) { |item| qualifier.match?(item) }
      else
        qualifier.match?(cart, @selector)
      end
    end
  end
end

class ProductTagSelector < Selector
  def initialize(match_type, match_condition, tags)
    @match_condition = match_condition
    @invert = match_type == :does_not
    @tags = tags.map(&:downcase)
  end

  def match?(line_item)
    product_tags = line_item.variant.product.tags.to_a.map(&:downcase)
    case @match_condition
      when :match
        return @invert ^ ((@tags & product_tags).length > 0)
      else
        return @invert ^ partial_match(@match_condition, product_tags, @tags)
    end
  end
end

class PercentageDiscount
  def initialize(percent, message)
    @percent = Decimal.new(percent) / 100.0
    @message = message
  end

  def apply(line_item)
    line_discount = line_item.line_price * @percent
    new_line_price = line_item.line_price - line_discount
    line_item.change_line_price(new_line_price, message: @message)
  end
end

CAMPAIGNS = [
  ConditionalDiscount.new(
    :all,
    nil,
    nil,
    ProductTagSelector.new(:does, :match, ["sale"]),
    PercentageDiscount.new(20, "20% off sale items"),
    0
  ),
].freeze

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 -> 20% offtiers[0]
Target scopetagstarget.scope
Target includessaletarget.includeIds
MethodautomaticdiscountMethod
Allocationstandardstacking.allocation
Combines with other discountsnostacking
Il vous sera demandé de confirmer
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
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
Ceramic Travel Mug1$22.00
Sous-total$22.00
Remise-$4.40
Total$17.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 Ceramic Travel Mug à $22.00 et la réponse est fixée.

La remise est de $4.40. Le total payé par l'acheteur est de $17.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
  • 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.

Questions fréquentes

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.

Formes de Script apparentées

Help Center script template

The dialect Shopify’s own documentation taught, with its settings block above a do-not-edit banner.

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.