Automatisk synkronisering av paketpriser vid prisändringar för varianter

Automatisk synkronisering av paketpriser vid prisändringar för varianter

Kopiera sidan

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ån productParents och skapar en idsCondition-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

På sidan ”Triggers” sökte man efter ”Pris”, med alternativet ”Prisändring för produktvariant” aktiverat
I appen: Gå till ”Triggers”, sök efter ”Price” och aktivera ”Product Variant Price Changed”.
Shopify Flow
I avsnittet ”Vilka produktvarianter har fått prisändringar?” anges följande: priset före och efter, skillnaden, procenttalet och riktningen.
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!
}
  • Lägg till ett villkorssteg som kontrollerar att utdata productId frå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 idsCondition frå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änd newPrice (11,00) istället för det gamla priset som fortfarande finns lagrat i Shopify (10,00). Om nej, använd det befintliga component.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-matrisen variantPrices matas sedan in i ”For each”-slingan som anropar productVariantsBulkUpdate för att faktiskt skriva tillbaka dessa omberäknade priser till paketprodukten.
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!]!
}
  • 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:
json
{
  "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 €):

  1. Utlösaren ”Prisändring för produktvariant” aktiveras
  2. Flödet hämtar produktens överordnade paket med hjälp av productParents
  3. Steget ”Kör kod” extraherar produkt-ID:t för produktpaketet
  4. Villkoret kontrollerar om den här produkten ingår i ett paket
  5. Om svaret är ja, hämtar den produktuppgifterna för produktpaketet
  6. I ett andra steg i koden ”Run” beräknas priserna för paketvarianterna på nytt
  7. 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 €).