Automatisk synkronisering av pakkepriser ved prisendringer på varianter

Automatisk synkronisering av pakkepriser ved prisendringer på varianter

Kopier side

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 fra productParents og oppretter en idsCondition-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

På siden «Utløsere» ble det søkt etter «Pris», med «Prisendring på produktvariant» aktivert
I appen: Gå til «Utløsere», søk etter «Pris» og slå på «Endring i pris på produktvariant».
Shopify Flow
Funksjonen «Hvilken produktvariant har fått endret pris?» viser følgende informasjon: prisen før og etter, differansen, prosentandelen og retningen.
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!
}
  • Legg til et Betingelse-trinn som sjekker om utdataen fra «Kjør kode» productId ikke 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, bruk newPrice (11,00) i stedet for den gamle prisen som fortsatt er lagret i Shopify (10,00). Hvis nei, bruk den eksisterende component.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 kaller productVariantsBulkUpdate for å faktisk skrive disse omberegnede prisene tilbake til pakkeproduktet.
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!]!
}
  • 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:
json
{
  "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 €):

  1. Utløseren Prisendring på produktvariant utløses
  2. Flyten henter produktets overordnede pakke ved hjelp av productParents
  3. Trinnet «Kjør kode» henter ut produkt-ID-en for produktpakken
  4. Denne betingelsen sjekker om dette produktet inngår i et pakketilbud
  5. Hvis ja, henter den produktdataene for produktpakken
  6. Et nytt «Kjør kode»-trinn beregner prisene på pakkevariantene på nytt
  7. 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 €).