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 triggeren »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 denne proces automatisk den tilsvarende pris på pakkevarianten.
Aktivér denne trigger i appens indstillinger -> Produktvarianter -> Ændringer i variantpriser
Prisændring på produktvariant
Hent det overordnede pakkeprodukt, beregn de opdaterede variantpriser, og opdater pakkevariantpriserne 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 det 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 komponentpriserne: 3 × 10,00 €).
Her kan du se de forskellige trin illustreret:
- I »Workflow Trigger Extensions« skal du åbne »Triggers«, søge efter »Price« og aktivere »Product Variant Price Changed«. Der kræves adgang til produkt-, variant- og kollektionsdata; appen beder om dette, hvis det mangler.
- Opret en ny tom arbejdsgang fra appen »Shopify Flow«, og vælg udløseren »Product Variant 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 fra
getProductData. Koden udtrækker de overordnede produkt-ID’er fraproductParentsog opbygger enidsCondition-streng til forespørgsel.
Trinnet »Kør kode« bruger følgende GraphQL-inddata, JavaScript-kode og -uddata til at hente ID’erne for de overordnede produkter:
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 udgangen fra »Kør kode« (
productId) ikke er tom 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 pakkeudbud)
- 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 andet »Kør kode (1)«-trin for at beregne de nye priser for pakkevarianterne på baggrund af de opdaterede komponentpriser. Dette trin genererer en »
variantPrices«-matrix med de nye priser for hver pakkevariant.
Dette »Kør kode (1)«-trin 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, brugesnewPrice(11,00) i stedet for den forældede pris, der stadig er gemt i Shopify (10,00). Hvis nej, bruges den eksisterendecomponent.productVariant.price.It, og komponentpriserne lægges 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 er nødt til at erstatte den ændrede variants pris med den nye pris på farten. Uden dette ville alle varianter stadig vise 30. Output-arrayetvariantPricesføres derefter ind i **For each-**løkken, som kalderproductVariantsBulkUpdatefor rent 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 **API-**anmodningen »Send Admin« 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 €):
- Triggeren »Prisændring på produktvariant« udløses
- Workflowet 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 €).

