Automatyczna synchronizacja cen pakietów w przypadku zmian cen wariantów

Automatyczna synchronizacja cen pakietów w przypadku zmian cen wariantów

Skopiuj stronę

Automatyczna aktualizacja cen wariantów pakietów w Shopify w przypadku zmiany ceny wariantu składowego za pomocą Shopify Flow.

W przypadku korzystania z **aplikacji **Shopify Bundles do tworzenia zestawów produktów zmiana ceny wariantu produktu składowego nie powoduje automatycznej aktualizacji ceny wariantu produktu zestawowego. Wyzwalacz Zmiana ceny wariantu produktu z rozszerzeń Workflow Trigger Extensions rozwiązuje ten problem poprzez wykrywanie zmiany ceny oraz automatyczne przeliczanie i aktualizowanie ceny wariantu zestawu.


Aby zrozumieć, w jaki sposób można wykorzystać wyzwalacz Zmiana ceny wariantu produktu do synchronizacji cen zestawów, przyjmiemy następujący scenariusz.

Scenariusz: Automatyczna aktualizacja ceny pakietu w przypadku zmiany ceny wariantu komponentu

Proszę sobie wyobrazić, że posiada Pan/Pani produkt w pakiecie (np. zestaw koszulek) utworzony za pomocą aplikacji „Shopify Bundles”. Pakiet zawiera trzy produkty składowe: czarną koszulkę, szarą koszulkę i białą koszulkę, z których każdy kosztuje 10,00 € za wariant. Cena wariantu zestawu wynosi 30,00 € (suma cen wszystkich produktów składowych). Gdy zmienią Państwo cenę wariantu produktu składowego, ten proces automatycznie zaktualizuje odpowiednią cenę wariantu zestawu.

Proszę włączyć ten wyzwalacz w ustawieniach aplikacji -> Warianty produktów -> Zmiany cen wariantów

Zmieniono cenę wariantu produktu

Proszę pobrać produkt nadrzędny zestawu, obliczyć zaktualizowane ceny wariantów oraz zbiorczo zaktualizować ceny wariantów zestawu za pośrednictwem interfejsu API administratora

Przewodnik wideo

Poszczególne etapy można również obejrzeć na tym filmie (film nie zawiera dźwięku; można dostosować prędkość odtwarzania do własnych potrzeb)

Jak zamierzamy to zorganizować

Zrozumienie konfiguracji

  • Oferujemy produkt składający się z elementów (np. szara koszulka) w wariantach rozmiarowych S, M, L, XL, 2XL, z których każdy kosztuje 10,00 €.
  • Posiadamy produkt w pakiecie utworzony za pomocą aplikacji „Shopify Bundles”. Zawiera on 3 produkty w pakiecie (czarna koszulka, szara koszulka, biała koszulka), z których każdy ma 5 wariantów. Cena wariantu zestawu wynosi 30,00 € (suma cen poszczególnych elementów: 3 × 10,00 €).

Tutaj mogą Państwo zapoznać się z poszczególnymi etapami w formie graficznej:

  • W aplikacji Workflow Trigger Extensions proszę otworzyć sekcję Triggers, wyszukać hasło Price i włączyć opcję Product Variant Price Changed. Wymagany jest dostęp do danych dotyczących produktów, wariantów i kolekcji; aplikacja poprosi o nadanie uprawnień, jeśli ich brakuje.
  • Proszę utworzyć nowy, pusty przepływ pracy w aplikacji Shopify Flow i wybrać wyzwalacz Zmiana ceny wariantu produktu z aplikacji Workflow Trigger Extensions
  • Proszę dodać akcję Pobierz dane produktu, aby pobrać zmieniony produkt za pomocą zaawansowanego zapytania, posortowanego według daty utworzenia w porządku rosnącym. Ten krok pobiera informacje o pakiecie nadrzędnym produktu za pośrednictwem pola productParents. Zapytanie wygląda następująco: id:{{productVariant.product.id | split: "gid://shopify/Product/" | last}}
  • Proszę dodać krok Uruchom kod, aby wyodrębnić identyfikator produktu nadrzędnego z wyniku funkcji getProductData. Kod wyodrębnia identyfikatory produktów nadrzędnych z productParents i tworzy ciąg znaków idsCondition do wykorzystania w zapytaniu.

Krok Uruchom kod wykorzystuje poniższe dane wejściowe GraphQL, kod JavaScript oraz wyniki, aby uzyskać identyfikatory produktów nadrzędnych:

Krok „Uruchom kod” przedstawiający dane wejściowe GraphQL, kod JavaScript oraz podgląd wyników

Na stronie „Wyzwalacze” przeprowadzono wyszukiwanie według ceny przy włączonej opcji „Zmiana ceny wariantu produktu”
W aplikacji: w sekcji „Wyzwalacze” wyszukaj hasło „Cena” i włącz opcję „Zmiana ceny wariantu produktu”.
Shopify Flow
W sekcji „Zmiana ceny wariantu produktu” przedstawiono następujące informacje: cenę przed i po zmianie, różnicę, wartość procentową oraz kierunek zmiany.
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!
}
  • Proszę dodać krok Warunek, który sprawdzi, czy wartość productId wygenerowana przez kod „Uruchom” nie jest pusta i czy istnieje. Dzięki temu będziemy kontynuować tylko wtedy, gdy zmieniony produkt faktycznie wchodzi w skład pakietu.
  • Prawda → kontynuować aktualizację ceny pakietu
  • Fałsz → zatrzymaj (produkt nie jest elementem pakietu)
  • Jeśli warunek ma wartość True, proszę dodać kolejną akcję Pobierz dane produktu (1), aby pobrać dane dotyczące wariantów i cen produktu nadrzędnego w pakiecie, korzystając z parametru idsCondition z kroku „Uruchom kod”.
  • Proszę dodać drugi krok Uruchom kod (1), aby obliczyć ceny nowych wariantów pakietów na podstawie zaktualizowanych cen komponentów. W wyniku tego kroku generowana jest tablica variantPrices, zawierająca nowe ceny dla każdego wariantu pakietu.

Ten etap Uruchom kod (1) polega na ponownym obliczeniu cen wariantów pakietów na podstawie zaktualizowanej ceny komponentu. Oto, jak przebiega ten proces: Najpierw pobiera dwie kluczowe informacje z wyzwalacza:

  • changedVariantId - wariant, który właśnie został zmieniony (...158920)
  • newPrice - nowa cena dla tego wariantu (11.00). Następnie program przechodzi cyklicznie przez każdy wariant zestawu i ponownie oblicza jego cenę całkowitą. Każdy wariant zestawu składa się z 3 wariantów składowych (czarna koszulka, szara koszulka, biała koszulka). Dla każdego elementu sprawdzane jest: czy jest to wariant, który właśnie uległ zmianie? Jeśli tak, należy zastosować newPrice (11,00) zamiast nieaktualnej ceny nadal przechowywanej w Shopify (10,00). Jeśli nie, należy zastosować istniejącą wartość component.productVariant.price. Następnie sumowane są ceny elementów, aby uzyskać nową cenę wariantu zestawu.Można zaobserwować działanie tego mechanizmu w danych wyjściowych. Proszę zwrócić uwagę na wariant ...088840, którego składniki obejmują ...158920 (zmieniony wariant). Jego cena wynosi zatem 11 + 10 + 10 = 31, podczas gdy suma cen wszystkich pozostałych wariantów zestawów nadal wynosi 30, ponieważ żaden z ich składników nie uległ zmianie.Jest to kluczowa informacja dotycząca tego etapu: Shopify nie zaktualizował jeszcze ceny komponentu w danych pakietu, więc kod nie może po prostu zsumować istniejących cen, lecz musi na bieżąco zastąpić cenę zmienionego wariantu nową wartością. Bez tego wszystkie warianty nadal wyświetlałyby wartość 30. Wynikowa tablica variantPrices jest następnie przekazywana do pętli For each, która wywołuje funkcję productVariantsBulkUpdate w celu faktycznego zapisania tych ponownie obliczonych cen z powrotem w produkcie pakietowym.
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!]!
}
  • Proszę dodać pętlę For each (iterację), która będzie przechodzić przez wszystkie pozycje w tablicy runCode1.variantPrices. Dla każdej ceny wariantu pętla ta wykonuje akcję wysłania żądania do interfejsu API administratora przy użyciu mutacji **productVariantsBulkUpdate** w celu aktualizacji ceny wariantu pakietu. Można wykorzystać te dane wejściowe dla mutacji:
json
{
  "variants": [
    {
      "id": "{{variantPricesForeachitem.id}}",
      "price": "{{variantPricesForeachitem.price}}"
    }
  ],
  "productId": "{{variantPricesForeachitem.productId}}",
  "allowPartialUpdates": true
}

Jak to wszystko ze sobą współdziała

Gdy zmienia się cena wariantu produktu składowego (np. aktualizują Państwo cenę wariantu „Szara koszulka S” z 10,00 € na 15,00 €):

  1. Uruchamia się wyzwalacz Zmiana ceny wariantu produktu
  2. W ramach tego przepływu pobierany jest pakiet nadrzędny produktu za pomocą productParents
  3. Krok „Uruchom kod” wyodrębnia identyfikator produktu w pakiecie
  4. Warunek ten sprawdza, czy dany produkt wchodzi w skład zestawu
  5. Jeśli tak, pobiera dane dotyczące produktu w pakiecie
  6. W drugim etapie „Uruchom kod” następuje ponowne obliczenie cen wariantów pakietów
  7. Pętla przechodzi przez każdy wariant i aktualizuje cenę pakietu za pomocą mutacji Admin API o nazwie productVariantsBulkUpdate

Cena wariantu pakietu S uległaby teraz zmianie z 30,00 € na 35,00 € (15,00 € + 10,00 € + 10,00 €).