Preise von Bundles bei Preisänderungen an Varianten automatisch synchronisieren

Wenn Sie die App (Shopify) ** „Bundles“** zum Erstellen von Produktpaketen verwenden, wird der Variantenpreis des Paketprodukts nicht automatisch aktualisiert, wenn Sie den Variantenpreis eines Einzelprodukts ändern. Der Trigger **„Product Variant Price Changed“ (Variantenpreis **des Produkts geändert) von Workflow Trigger Extensions löst dieses Problem, indem er die Preisänderung erkennt und den Variantenpreis des Pakets automatisch neu berechnet und aktualisiert.


Wir gehen von folgendem Szenario aus, um zu verstehen, wie wir den Trigger „Preisänderung bei Produktvariante“ nutzen können, um die Preise von Produktpaketen synchron zu halten.

Szenario: Automatische Aktualisierung des Paketpreises bei einer Preisänderung einer Komponentenvariante

Stellen Sie sich vor, Sie haben ein Bundle-Produkt (z. B. ein T-Shirt-Bundle) mit der App „ShopifyBundles“ erstellt. Das Bundle enthält drei Einzelprodukte: ein schwarzes T-Shirt, ein graues T-Shirt und ein weißes T-Shirt, die jeweils 10,00 € pro Variante kosten. Der Preis der Bundle-Variante beträgt 30,00 € (die Summe aller Einzelproduktpreise). Wenn Sie den Preis einer Variante eines Einzelprodukts ändern, aktualisiert dieser Workflow automatisch den entsprechenden Preis der Bundle-Variante.

Aktivieren Sie diesen Trigger in den App-Einstellungen unter „Produktvarianten“ -> „Preisänderungen bei Varianten“.

Preisänderung bei einer Produktvariante

Das übergeordnete Bundle-Produkt abrufen, die aktualisierten Variantenpreise berechnen und die Preise der Bundle-Varianten über die Admin-API in einem Schritt aktualisieren

Video-Anleitung

Die einzelnen Schritte kannst du dir auch in diesem Video anschauen (das Video hat keinen Ton; du kannst die Wiedergabegeschwindigkeit nach Bedarf anpassen).

Wie wir das in die Wege leiten werden

Die Konfiguration verstehen

  • Wir haben ein Produkt (z. B. ein graues T-Shirt) mit den Varianten S, M, L, XL und 2XL, die jeweils 10,00 € kosten.
  • Wir haben ein Bundle-Produkt erstellt, das mit der AppShopify-Bundles“ erstellt wurde. Es enthält 3 gebündelte Produkte (schwarzes T-Shirt, graues T-Shirt, weißes T-Shirt) mit jeweils 5 Varianten. Der Preis für die Bundle-Variante beträgt 30,00 (Summe der Einzelpreise: 3 × 10,00 €).

Hier können Sie die einzelnen Schritte anschaulich nachvollziehen:

  • Öffnen Sie in „Workflow Trigger Extensionsden Bereich „Trigger“, suchen Sie nach „Preis“ und aktivieren Sie „Preisänderung bei Produktvariante“. Hierfür ist der Zugriff auf Produkt-, Varianten- und Kollektionsdaten erforderlich; die App fordert Sie dazu auf, falls dieser noch fehlt.
  • Erstellen Sie in der App Shopify Flow einen neuen leeren Workflow und wählen Sie den Trigger „Product Variant Price Changed“ aus der AppWorkflow Trigger Extensions“ aus.
  • Fügen Sie die Aktion „Produktdaten abrufen“ hinzu, um das geänderte Produkt mithilfe einer erweiterten Abfrage abzurufen, sortiert nach „Erstellt am“ in aufsteigender Reihenfolge. In diesem Schritt werden die Informationen zum übergeordneten Bundle des Produkts über das Feld productParents abgerufen. Die Abfrage sieht wie folgt aus: id:{{productVariant.product.id | split: "gid://shopify/Product/" | last}}
  • Fügen Sie einen Schritt „Code ausführen“ hinzu, um die Produkt-ID des übergeordneten Bundles aus dem Ergebnis von getProductData zu extrahieren. Der Code extrahiert die Produkt-IDs der übergeordneten Produkte aus productParents und erstellt eine Zeichenfolge vom Typ idsCondition für die Abfrage.

Der Schritt „Code ausführen“ verwendet die folgenden GraphQL-Eingaben, JavaScript-Code und Ausgaben, um die IDs der übergeordneten Produkte abzurufen:

Schritt „Code ausführen“, der die GraphQL-Eingabe, den JavaScript-Code und die Vorschau der Ausgabe anzeigt

Auf der Seite „Trigger“ wurde nach „Preis“ gesucht, wobei die Option „Preis der Produktvariante geändert“ aktiviert war
In der App: Suchen Sie unter „Trigger“ nach „Preis“ und aktivieren Sie „Preisänderung bei Produktvariante“.
Der Variablenauswähler von Flow für „Preisänderung bei Produktvariante“ mit den Feldern „alterPreis“, „neuerPreis“, „Differenz“, „prozentualeÄnderung“ und „Richtung“
Der Workflow „Welche Produktvariante hat eine Preisänderung erfahren?“ liefert folgende Informationen: den Preis vor und nach der Änderung, die Differenz, den Prozentsatz und die Richtung.
bash
{
  getProductData {
    productParents {
      id
    }
  }
}
javascript
export default function main(input) {
  const productIds = input.getProductData[0]?.productParents?.map(p => p.id) ?? [];
  const productId = productIds[0] ?? null;

  const idsCondition = productIds
    .map(gid => "id:" + gid.split("gid://shopify/Product/").pop())
    .join(" OR ");

  return {
    productId: productId,
    productIds: productIds,
    idsCondition: idsCondition,
  };
}
typescript
type Output {
  productId: String
  productIds: [String!]!
  idsCondition: String!
}
  • Fügen Sie einen Schritt „Bedingung“ hinzu, der prüft, ob die Ausgabe des Schritts „Code ausführen“ (productId) nicht leer ist und existiert. Dadurch wird sichergestellt, dass wir nur dann fortfahren, wenn das geänderte Produkt tatsächlich Teil eines Bundles ist.
  • Wahr → den Bundle-Preis weiterhin aktualisieren
  • Falsch → Stopp (das Produkt ist kein Bestandteil eines Bundles)
  • Wenn die Bedingung „True“ ist, fügen Sie eine weitere Aktion „Produktdaten abrufen (1)“ hinzu, um die Varianten- und Preisdaten des übergeordneten Bundle-Produkts mithilfe des idsCondition aus dem Schritt „Code ausführen“ abzurufen.
  • Fügen Sie einen zweiten Schritt „Code ausführen (1)“ hinzu, um die Preise der neuen Bundle-Varianten auf der Grundlage der aktualisierten Komponentenpreise zu berechnen. Dieser Schritt gibt ein Array vom Typ variantPrices mit den neuen Preisen für jede Bundle-Variante aus.

In diesem Schritt „Code ausführen (1)“ werden die Preise der Paketvarianten auf der Grundlage des aktualisierten Komponentenpreises neu berechnet. Und so funktioniert es: Zunächst werden zwei wichtige Informationen aus dem Auslöser abgerufen:

  • changedVariantId die Variante, die gerade geändert wurde (...158920)
  • newPrice den neuen Preis für diese Variante (11.00). Anschließend durchläuft das Skript alle Bundle-Varianten und berechnet deren Gesamtpreis neu. Jede Bundle-Variante besteht aus drei Komponentenvarianten (schwarzes T-Shirt, graues T-Shirt, weißes T-Shirt). Für jede Komponente wird geprüft: Handelt es sich um die Variante, die sich gerade geändert hat? Wenn ja, wird newPrice (11,00) anstelle des veralteten Preises verwendet, der noch unter Shopify (10,00) gespeichert ist. Wenn nein, wird der bestehende Preis component.productVariant.price.It verwendet. Die Preise der Komponenten werden addiert, um den neuen Preis der Bundle-Variante zu erhalten. Sie können die Funktionsweise in Ihren Ausgabedaten sehen. Betrachten Sie die Variante ...088840 - zu ihren Komponenten gehört ...158920 (die geänderte Variante). Ihr Preis beträgt also 11 + 10 + 10 = 31, während alle anderen Paketvarianten weiterhin insgesamt 30 ergeben, da sich bei keiner ihrer Komponenten etwas geändert hat.Das ist die zentrale Erkenntnis dieses Schritts: Shopify hat den Preis der Komponente in den Paketdaten noch nicht aktualisiert, daher kann der Code nicht einfach die vorhandenen Preise addieren, sondern muss den neuen Preis für die geänderte Variante im laufenden Betrieb einfügen. Ohne diese Maßnahme würden alle Varianten weiterhin den Wert 30 anzeigen. Das Ausgabearray variantPrices wird dann in die For each-Schleife eingespeist, die productVariantsBulkUpdate aufruft, um diese neu berechneten Preise tatsächlich wieder in das Bundle-Produkt zu schreiben.
bash
{
  productVariant {
    id
  }
  priceChange {
    oldPrice { amount }
    newPrice { amount }
  }
  getProductData1 {
    id
    variants {
      id
      productVariantComponents {
        productVariant {
          id
          price
        }
      }
    }
  }
}
javascript
export default function main(input) {
  const changedVariantId = input.productVariant.id;
  const newPrice = parseFloat(input.priceChange.newPrice.amount);

  const variantPrices = input.getProductData1.flatMap(product =>
    product.variants.map(variant => ({
      productId: product.id,
      id: variant.id,
      price: variant.productVariantComponents.reduce((sum, component) => {
        const p = component.productVariant.id === changedVariantId
          ? newPrice
          : parseFloat(component.productVariant.price);
        return sum + p;
      }, 0)
    }))
  );

  return { variantPrices };
}
yaml
type VariantPrice {
  productId: String!
  id: String!
  price: Float!
}
type Output {
  variantPrices: [VariantPrice!]!
}
  • Fügen Sie eine „For each“-Schleife (Iteration) hinzu, die alle Elemente in runCode1.variantPrices durchläuft. Für jede Preisvariante führt sie die Aktion „Send Admin API Request“ unter Verwendung der Mutation „productVariantsBulkUpdate“ aus, um den Preis der Bundle-Variante zu aktualisieren. Sie können diese Eingabe für die Mutation verwenden:
json
{
  "variants": [
    {
      "id": "{{variantPricesForeachitem.id}}",
      "price": "{{variantPricesForeachitem.price}}"
    }
  ],
  "productId": "{{variantPricesForeachitem.productId}}",
  "allowPartialUpdates": true
}

Wie das alles zusammenhängt

Wenn sich der Preis einer Variante eines Produktes ändert (z. B. wenn Sie den Preis der Variante „Graues T-Shirt S“ von 10,00 € auf 15,00 € anpassen):

  1. Der Trigger „Preisänderung bei Produktvariante“ wird ausgelöst
  2. Der Ablauf ruft das übergeordnete Bundle des Produkts mithilfe von productParents ab.
  3. Der Schritt „Code ausführen“ extrahiert die Produkt-ID des Bundles
  4. Die Bedingung prüft, ob dieses Produkt Teil eines Pakets ist
  5. Falls ja, ruft es die Produktdaten des Bundles ab
  6. In einem zweiten „Run Code“-Schritt werden die Preise der Bundle-Varianten neu berechnet
  7. Die Schleife durchläuft jede Variante und aktualisiert den Bundle-Preis mithilfe der Admin-API-Mutation „productVariantsBulkUpdate“.

Der Preis für die Bundle-S-Variante würde sich nun von 30,00 € auf 35,00 € ändern (15,00 € + 10,00 € + 10,00 €).