Automatisk synkronisering af pakkepriser ved prisændringer på varianter
Når du bruger appen »« (Shopify) og** »Bundles« (**) til at oprette produktpakker, medfører en ændring af prisen på en variant af et komponentprodukt ikke automatisk en opdatering af prisen på en variant af pakkeproduktet. Triggeren »Product Variant Price Changed« fra Workflow Trigger Extensions løser dette problem ved at registrere prisændringen og automatisk genberegne og opdatere prisen på pakkevarianten.
Vi tager udgangspunkt i følgende scenario for at forstå, hvordan vi kan bruge udløseren »Prisændring på produktvariant« til at holde priserne på produktpakker synkroniseret.
Scenarie: Automatisk opdatering af pakkeprisen, når prisen på en komponentvariant ændres
Forestil dig, at du har et pakkeprodukt (f.eks. en T-shirt-pakke), der er oprettet med appen »Shopify« Bundles. Pakken indeholder tre delprodukter: sort T-shirt, grå T-shirt og hvid T-shirt, som hver koster 10,00 € pr. variant. Prisen på pakkevarianten er 30,00 € (summen af alle delprodukternes priser). Når du ændrer prisen på en variant af et delprodukt, opdaterer Shopify Flow automatisk den tilsvarende pris på pakkevarianten.
Aktivér denne udløser i appens indstillinger -> Produktvariant -> Prisændringer for varianter
Prisændring på produktvariant
Hent det overordnede bundtprodukt, beregn de opdaterede variantpriser, og opdater bundtvariantpriserne samlet via Admin API’et
Videovejledning
Du kan også se trinene visuelt i denne video (videoen har ingen lyd; du kan justere afspilningshastigheden efter behov)
Sådan får vi Shopify Flow til at fungere
Sådan fungerer opsætningen
- Vi har en vare (f.eks. en grå T-shirt) med varianterne S, M, L, XL og 2XL, som alle koster 10,00 €.
- Vi har oprettet et pakkeprodukt ved hjælp af appen »Shopify Bundles«. Det indeholder 3 produkter i pakken (sort T-shirt, grå T-shirt, hvid T-shirt), hver med 5 varianter. Prisen for pakkevarianten er 30,00 € (summen af priserne på de enkelte produkter: 3 × 10,00 €).
Her kan du se de forskellige trin illustreret:
- I »Workflow Trigger Extensions« skal du åbne »Udløsere«, søge efter »Price« og aktivere »Produktvariant Price Changed«. Funktionen kræver adgang til produkt-, variant- og kollektionsdata; appen beder om denne adgang, hvis den mangler.
- Opret en ny tom arbejdsgang fra appen »Shopify Flow«, og vælg udløseren »Produktvariant Price Changed« fra appen »Workflow Trigger Extensions«
- Tilføj en handling af typen »Hent produktdata« for at hente det ændrede produkt ved hjælp af en avanceret forespørgsel, sorteret efter »oprettet den« i stigende rækkefølge. Dette trin henter oplysninger om produktets overordnede pakke via feltet »
productParents«. Forespørgslen ser således ud:id:{{productVariant.product.id | split: "gid://shopify/Product/" | last}} - Tilføj et »Kør kode«-trin for at udtrække det overordnede bundtets produkt-ID fra resultatet af »
getProductData«. Koden udtrækker de overordnede produkt-ID’er fra »productParents« og opbygger en »idsCondition«-streng til forespørgsel.
Trinnet »Kør kode« bruger følgende GraphQL-inddata, JavaScript-kode og -uddata til at hente de overordnede produkt-ID’er:
Kør kodetrin, der viser GraphQL-inddata, JavaScript-kode og forhåndsvisning af uddata


{
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!
}- Tilføj et »Betingelse«-trin, der kontrollerer, om uddataene fra »Kør kode« (
productId) ikke er tomme og findes. Dette sikrer, at vi kun fortsætter, når det ændrede produkt rent faktisk indgår i en pakke. - Sandt → fortsæt med at opdatere pakkeprisen
- Falsk → stop (produktet indgår ikke i et pakketilbud)
- Hvis betingelsen er »True«, skal du tilføje endnu en handling af typen »Hent produktdata (1)« for at hente variant- og prisoplysninger for det overordnede bundtprodukt ved hjælp af »
idsCondition« fra trinnet »Kør kode«. - Tilføj et yderligere »Kør kode (1)«-trin for at beregne de nye priser for pakkevarianterne på baggrund af de opdaterede komponentpriser. Dette trin genererer en matrix af typen »
variantPrices« med de nye priser for hver pakkevariant.
Dette trin i koden »Kør« (1) genberegner priserne på pakkevarianterne på baggrund af den opdaterede komponentpris. Her er**,** hvad det gør: Først henter det to vigtige oplysninger fra udløseren:
changedVariantIdden variant, der netop er blevet ændret (...158920)newPriceden nye pris for den pågældende variant (11.00). Derefter gennemløber den alle pakkevarianter og genberegner den samlede pris for hver enkelt. Hver pakkevariant består af 3 komponentvarianter (sort T-shirt, grå T-shirt, hvid T-shirt). For hver komponent tjekkes det: Er dette den variant, der netop er ændret? Hvis ja, brugnewPrice(11,00) i stedet for den forældede pris, der stadig er gemt i Shopify (10,00). Hvis nej, brug den eksisterendecomponent.productVariant.price.It og læg komponentpriserne sammen for at få den nye pris for pakkevarianten. Du kan se, hvordan det fungerer, i dine outputdata. Se på variant...088840- dens komponenter omfatter...158920(den ændrede variant). Prisen er derfor 11 + 10 + 10 = 31, mens alle de andre pakkevarianter stadig har en samlet pris på 30, da ingen af deres komponenter er ændret.Dette er det centrale i dette trin: Shopify har endnu ikke opdateret komponentprisen i pakkedataene, så koden kan ikke blot summere de eksisterende priser, men skal i stedet indsætte den nye pris for den ændrede variant undervejs. Uden dette ville alle varianter stadig vise 30. Output-arrayetvariantPricesføres derefter ind i **For each-**løkken, som kalderproductVariantsBulkUpdatefor faktisk at skrive disse genberegnede priser tilbage til pakkeproduktet.
{
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!]!
}- Indsæt en »For each«-løkke (iteration), der gennemløber hvert element i »
runCode1.variantPrices«. For hver variantpris udfører den handlingen »Send Admin API-anmodning« ved hjælp af mutationen »productVariantsBulkUpdate« for at opdatere prisen på bundtvarianten. Du kan bruge denne indtastning til Mutation:
{
"variants": [
{
"id": "{{variantPricesForeachitem.id}}",
"price": "{{variantPricesForeachitem.price}}"
}
],
"productId": "{{variantPricesForeachitem.productId}}",
"allowPartialUpdates": true
}Sådan hænger det hele sammen
Når prisen på en variant af et produkt ændres (f.eks. hvis du opdaterer prisen på varianten »Grey T-Shirt S« fra 10,00 € til 15,00 €):
- Udløser »Prisændring på produktvariant« udløses
- Shopify Flow henter produktets overordnede pakke ved hjælp af
productParents - Trinnet »Kør kode« udtrækker produkt-ID'et for produktpakken
- Denne betingelse kontrollerer, om dette produkt indgår i et sæt
- Hvis ja, henter den produktdataene for produktpakken
- Et andet »Kør kode«-trin genberegner priserne på bundtvariantene
- Loopen gennemløber hver enkelt variant og opdaterer pakkeprisen via Admin API-mutationen »productVariantsBulkUpdate«
Prisen på S-varianten af pakken vil nu blive opdateret fra 30,00 € til 35,00 € (15,00 € + 10,00 € + 10,00 €).

