Automatisk synkronisering av paketpriser vid prisändringar för varianter
Uppdatera priserna på varianter i Shopify-paket automatiskt när priset på en komponentvariant ändras, med hjälp av Shopify Flow.
När du använder Shopify Bundles-appen för att skapa produktpaket uppdateras inte paketproduktens variantpris automatiskt när priset på en ingående produkt ändras. Triggern ”Produktvariantpris ändrat” från Workflow Trigger Extensions löser detta genom att upptäcka prisändringen och automatiskt beräkna om och uppdatera paketvariantpriset.
Vi utgår från följande scenario för att förstå hur vi kan använda utlösaren ”Prisändring för produktvariant” för att hålla paketerbjudandenas priser synkroniserade.
Scenario: Automatisk uppdatering av paketpriset när priset på en komponentvariant ändras
Tänk dig att du har ett paket (t.ex. ett T-shirt-paket) som skapats med appen ”Shopify Bundles”. Paketet innehåller tre ingående produkter: svart T-shirt, grå T-shirt och vit T-shirt, som alla kostar 10,00 € per variant. Priset för paketvarianten är 30,00 € (summan av alla enskilda produkters priser). När du ändrar priset för en enskild produkts variant kommer detta flöde automatiskt att uppdatera priset för motsvarande paketvariant.
Aktivera denna utlösare i appens inställningar -> Produktvarianter -> Prisändringar för varianter
Prisändring för produktvariant
Hämta det överordnade paketet, beräkna uppdaterade variantpriser och uppdatera paketvariantpriserna i bulk via Admin API
Videoguide
Du kan också se stegen visuellt i den här videon (videon har inget ljud, du kan justera hastigheten efter behov)
Hur vi ska få det här att fungera
Att förstå uppbyggnaden
- Vi har en produkt (t.ex. en grå T-shirt) med storlekarna S, M, L, XL och 2XL, och alla kostar 10,00 €.
- Vi har skapat ett paket med hjälp av appen ”Shopify Bundles”. Det innehåller tre produkter (svart T-shirt, grå T-shirt, vit T-shirt), var och en med fem varianter. Priset för paketvarianten är 30,00 € (summan av komponentpriserna: 3 × 10,00 €).
Här kan du se de olika stegen på ett överskådligt sätt:
- I ”Workflow Trigger Extensions” öppnar du ”Triggers”, söker efter ”Price” och aktiverar ”Product Variant Price Changed”. Det krävs åtkomst till produkt-, variant- och kollektionsdata; appen ber om detta om det saknas.
- Skapa ett nytt tomt arbetsflöde i appen ”Shopify Flow” och välj utlösaren ”Prisändring för produktvariant” från appen ”Workflow Trigger Extensions”
- Lägg till en åtgärd av typen ”Hämta produktdata” för att hämta den ändrade produkten med hjälp av en avancerad sökning, sorterad efter ”skapad” i stigande ordning. Detta steg hämtar information om produktens överordnade paket via fältet
productParents. Sökningen ser ut så här:id:{{productVariant.product.id | split: "gid://shopify/Product/" | last}} - Lägg till ett ”Kör kod”-steg för att extrahera produkt-ID:t för det överordnade paketet från resultatet av
getProductData. Koden extraherar produkt-ID:n för de överordnade produkterna frånproductParentsoch skapar enidsCondition-sträng för sökningen.
I steget ”Kör kod” används följande GraphQL-indata, JavaScript-kod och utdata för att hämta ID:n för överordnade produkter:
Kör kodsteg som visar GraphQL-inmatningen, JavaScript-koden och förhandsgranskningen av utdata


{
getProductData {
productParents {
id
}
}
}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,
};
}type Output {
productId: String
productIds: [String!]!
idsCondition: String!
}- Lägg till ett villkorssteg som kontrollerar att utdata
productIdfrån steget ”Kör kod” inte är tomt och att det finns. Detta säkerställer att vi endast går vidare när den ändrade produkten faktiskt ingår i ett paket. - Sant → fortsätt att uppdatera paketpriset
- Falskt → stopp (produkten ingår inte i ett paket)
- Om villkoret är sant, lägg till ytterligare en åtgärd av typen ”Hämta produktdata (1)” för att hämta varianten och prisuppgifterna för den överordnade produktbuntens produkt med hjälp av
idsConditionfrån steget ”Kör kod”. - Lägg till ett andra steg av typen ”Kör kod (1)” för att beräkna de nya priserna för paketvarianterna utifrån de uppdaterade komponentpriserna. Detta steg genererar en array med namnet
variantPrices, som innehåller de nya priserna för varje paketvariant.
I detta steg i koden ”Run” (1) beräknas priserna för paketvarianterna på nytt utifrån det uppdaterade komponentpriset. Så här går det till: Först hämtas två viktiga uppgifter från utlösaren:
changedVariantId: den variant som just har ändrats (...158920)newPrice, det nya priset för den varianten (11.00). Därefter går den igenom varje paketvariant och beräknar om dess totalpris. Varje paketvariant består av 3 komponentvarianter (svart T-shirt, grå T-shirt, vit T-shirt). För varje komponent kontrolleras: är detta den variant som just har ändrats? Om ja, användnewPrice(11,00) istället för det gamla priset som fortfarande finns lagrat i Shopify (10,00). Om nej, använd det befintligacomponent.productVariant.price. Komponentpriserna summeras för att få det nya priset för paketvarianten.Du kan se hur det fungerar i dina utdata. Titta på varianten...088840- dess komponenter inkluderar...158920(den ändrade varianten). Så dess pris blir 11 + 10 + 10 = 31, medan alla andra paketvarianter fortfarande summerar till 30 eftersom ingen av deras komponenter har ändrats.Detta är den viktigaste insikten i detta steg: Shopify har ännu inte uppdaterat komponentpriset i paketdata, så koden kan inte bara summera de befintliga priserna, utan måste ersätta det gamla priset med det nya för den ändrade varianten i realtid. Utan detta skulle alla varianter fortfarande visa 30. Utdata-matrisenvariantPricesmatas sedan in i ”For each”-slingan som anroparproductVariantsBulkUpdateför att faktiskt skriva tillbaka dessa omberäknade priser till paketprodukten.
{
productVariant {
id
}
priceChange {
oldPrice { amount }
newPrice { amount }
}
getProductData1 {
id
variants {
id
productVariantComponents {
productVariant {
id
price
}
}
}
}
}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 };
}type VariantPrice {
productId: String!
id: String!
price: Float!
}
type Output {
variantPrices: [VariantPrice!]!
}- Lägg till en ”For each”-slinga (iteration) som går igenom varje post i
runCode1.variantPrices. För varje variantpris utför den åtgärden ”Skicka Admin API-förfrågan” med hjälp av mutationen **productVariantsBulkUpdate**för att uppdatera priset på paketvarianten. Du kan använda den här indata för Mutation:
{
"variants": [
{
"id": "{{variantPricesForeachitem.id}}",
"price": "{{variantPricesForeachitem.price}}"
}
],
"productId": "{{variantPricesForeachitem.productId}}",
"allowPartialUpdates": true
}Hur allt hänger ihop
När priset på en variant av en produkt ändras (t.ex. om du uppdaterar varianten ”Grey T-Shirt S” från 10,00 € till 15,00 €):
- Utlösaren ”Prisändring för produktvariant” aktiveras
- Flödet hämtar produktens överordnade paket med hjälp av
productParents - Steget ”Kör kod” extraherar produkt-ID:t för produktpaketet
- Villkoret kontrollerar om den här produkten ingår i ett paket
- Om svaret är ja, hämtar den produktuppgifterna för produktpaketet
- I ett andra steg i koden ”Run” beräknas priserna för paketvarianterna på nytt
- Slingan går igenom varje variant och uppdaterar paketpriset via Admin API-mutationen ”productVariantsBulkUpdate”
Priset för paketvarianten S skulle nu ändras från 30,00 € till 35,00 € (15,00 € + 10,00 € + 10,00 €).
