Automatisk synkronisering av pakkepriser ved prisendringer på varianter
Oppdater prisene på variantene i Shopify-pakker automatisk når prisen på en komponentvariant endres, ved hjelp av Shopify Flow.
Når du bruker Shopify Bundles-appen til å opprette produktpakker, fører en endring i variantprisen til et komponentprodukt ikke automatisk til at variantprisen til pakkeproduktet oppdateres. Utløseren Product Variant Price Changed fra Workflow Trigger Extensions løser dette ved å oppdage prisendringen og automatisk beregne og oppdatere variantprisen for pakken på nytt.
Vi skal ta utgangspunkt i følgende scenario for å forstå hvordan vi kan bruke utløseren Prisendring på produktvariant til å holde pakkeprisene synkronisert.
Scenario: Automatisk oppdatering av pakkeprisen når prisen på en komponentvariant endres
Tenk deg at du har et pakkeprodukt (f.eks. en T-skjortepakke) opprettet med Shopify-appen «Bundles». Pakken inneholder tre komponentprodukter: svart T-skjorte, grå T-skjorte og hvit T-skjorte, som hver koster 10,00 € per variant. Prisen på pakkevarianten er 30,00 € (summen av alle komponentprisene). Når du endrer prisen på en variant av et komponentprodukt, vil denne prosessen automatisk oppdatere den tilsvarende prisen på pakkevarianten.
Aktiver denne utløseren i appinnstillingene -> Produktvarianter -> Endringer i variantpriser
Prisendring på produktvariant
Hent det overordnede pakkeproduktet, beregne oppdaterte variantpriser og oppdater variantprisene for pakken samlet via Admin API
Videoveiledning
Du kan også se trinnene visuelt i denne videoen (videoen har ikke lyd, og du kan justere hastigheten etter behov)
Hvordan vi skal få dette til å fungere
Forstå oppsettet
- Vi har en komponentvare (f.eks. grå T-skjorte) med variantene S, M, L, XL og 2XL, som alle koster 10,00 €.
- Vi har et pakkeprodukt som er opprettet med Shopify Bundles-appen. Det inneholder 3 produkter i pakken (svart T-skjorte, grå T-skjorte, hvit T-skjorte), hver med 5 varianter. Prisen på pakkevarianten er 30,00 € (summen av komponentprisene: 3 × 10,00 €).
Her kan du se trinnene visuelt:
- I Workflow Trigger Extensions åpner du Triggers, søker etter Price og aktiverer Product Variant Price Changed. Dette krever tilgang til produkt-, variant- og kolleksjonsdata; appen ber om dette dersom det mangler.
- Opprett en ny, tom arbeidsflyt fra Shopify Flow-appen, og velg utløseren Prisendring på produktvariant fra Workflow Trigger Extensions-appen
- Legg til en handling for å hente produktdata for å hente det endrede produktet ved hjelp av et avansert søk, sortert etter opprettet i stigende rekkefølge. Dette trinnet henter informasjon om produktets overordnede pakke via feltet
productParents. Søket ser slik ut:id:{{productVariant.product.id | split: "gid://shopify/Product/" | last}} - Legg til et Kjør kode-trinn for å hente produkt-ID-en til overordnet produkt fra resultatet av
getProductData. Koden henter ID-ene til de overordnede produktene fraproductParentsog oppretter enidsCondition-streng for søk.
Trinnet Kjør kode bruker følgende GraphQL-inndata, JavaScript-kode og utdata for å hente ID-ene til overordnede produkter:
Kjør kodetrinn som viser GraphQL-inndata, JavaScript-kode og forhåndsvisning 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!
}- Legg til et Betingelse-trinn som sjekker om utdataen fra «Kjør kode»
productIdikke er tom og finnes. Dette sikrer at vi bare fortsetter når det endrede produktet faktisk inngår i en pakke. - Sant → fortsett å oppdatere pakkeprisen
- Feil → stopp (produktet inngår ikke i en pakke)
- Hvis betingelsen er True, legger du til en ny handling Hent produktdata (1) for å hente variant- og prisdata for det overordnede produktet ved hjelp av
idsCondition-verdien fra trinnet «Kjør kode». - Legg til et nytt Kjør kode (1)-trinn for å beregne de nye prisene for pakkevariantene basert på de oppdaterte komponentprisene. Dette trinnet genererer en
variantPrices-matrise med de nye prisene for hver pakkevariant.
Dette Kjør kode (1)-trinnet beregner prisene på pakkevariantene på nytt ut fra den oppdaterte komponentprisen. Slik fungerer det: Først henter det to viktige opplysninger fra utløseren:
changedVariantId: varianten som nettopp ble endret (...158920)newPrice, den nye prisen for den varianten (11.00). Deretter går den gjennom hver pakkevariant og beregner totalprisen på nytt. Hver pakkevariant består av 3 komponentvarianter (svart T-skjorte, grå T-skjorte, hvit T-skjorte). For hver komponent sjekker den: er dette varianten som nettopp ble endret? Hvis ja, bruknewPrice(11,00) i stedet for den gamle prisen som fortsatt er lagret i Shopify (10,00). Hvis nei, bruk den eksisterendecomponent.productVariant.price. Den summerer komponentprisene for å få den nye prisen på pakkevarianten.Du kan se at dette fungerer i utdataene dine. Se på varianten...088840- komponentene inkluderer...158920(den endrede varianten). Prisen blir dermed 11 + 10 + 10 = 31, mens alle de andre pakkevariantene fortsatt har en totalpris på 30, siden ingen av komponentene deres har endret seg.Dette er det viktigste poenget i dette trinnet: Shopify har ennå ikke oppdatert komponentprisen i pakkedataene, så koden kan ikke bare summere de eksisterende prisene - den må erstatte den endrede variantens pris på farten. Uten dette ville alle varianter fortsatt vise 30. Utdata-variantPrices-matrisen mates deretter inn i For each-sløyfen, som kallerproductVariantsBulkUpdatefor å faktisk skrive disse omberegnede prisene tilbake 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!]!
}- Legg til en For each-sløyfe (iterasjon) som går gjennom hvert element i
runCode1.variantPrices. For hver variantpris utfører den handlingen Send Admin API-forespørsel ved hjelp av mutasjonen**productVariantsBulkUpdate**for å oppdatere prisen på pakkevarianten. Du kan bruke denne inndataen til mutasjonen:
{
"variants": [
{
"id": "{{variantPricesForeachitem.id}}",
"price": "{{variantPricesForeachitem.price}}"
}
],
"productId": "{{variantPricesForeachitem.productId}}",
"allowPartialUpdates": true
}Hvordan det hele henger sammen
Når prisen på en variant av et produkt endres (f.eks. hvis du oppdaterer prisen på varianten «Grey T-Shirt S» fra 10,00 € til 15,00 €):
- Utløseren Prisendring på produktvariant utløses
- Flyten henter produktets overordnede pakke ved hjelp av
productParents - Trinnet «Kjør kode» henter ut produkt-ID-en for produktpakken
- Denne betingelsen sjekker om dette produktet inngår i et pakketilbud
- Hvis ja, henter den produktdataene for produktpakken
- Et nytt «Kjør kode»-trinn beregner prisene på pakkevariantene på nytt
- Sløyfen går gjennom hver variant og oppdaterer pakkeprisen ved hjelp av **productVariantsBulkUpdate-**mutasjonen i Admin API
Prisen på «Bundle S»-varianten vil nå endres fra 30,00 € til 35,00 € (15,00 € + 10,00 € + 10,00 €).
