Dokumentationsmenü

Das Label in eigenen Themes und Headless-Storefronts nutzen

Lies das OmniBuzz-Label aus einem Varianten-Metafeld in eigenem Liquid-Code oder in der Storefront API und wende dieselbe Anzeigeregel an wie der App-Block.

Der App-Block deckt die meisten Themes ab. Unterstützt dein Theme keine App-Blöcke oder baust du einen Headless-Storefront, kannst du das fertige Label selbst lesen. OmniBuzz schreibt es in ein Varianten-Metafeld. Das Liquid-Theme und die Storefront API können es beide lesen.

Wo die Daten liegen

EigenschaftWert
Namespaceomnibuzz
Schlüssellabel
Typjson
BesitzerProduktvariante
Storefront-ZugriffÖffentlich lesbar
Name der DefinitionOmniBuzz label

OmniBuzz legt die Definition für dich an. Der Wert existiert, sobald die Variante OmniBuzz-Daten hat. m kann leer sein ({}); dann zeige nichts an.

Nutzer des Theme-Blocks: Es ändert sich nichts. Der Block „Omnibus-Preis“ verwendet weiterhin seine eigenen Daten ($app:omnibus). Diese Seite brauchst du nur, wenn du eigenen Code schreibst.

Das Wertformat

{
  "v": 1,
  "u": "2026-11-05T02:10:00Z",
  "w": 30,
  "m": {
    "123456789": {
      "c": "EUR",
      "p": 10000,
      "r": 12000,
      "pct": 16,
      "t": {
        "en": "Lowest price in the last 30 days: €120.00",
        "de": "Niedrigster Preis der letzten 30 Tage: 120,00 €",
        "fr": "Prix le plus bas des 30 derniers jours : 120,00 €"
      },
      "b": {
        "en": "-16%",
        "de": "-16 %",
        "fr": "-16 %"
      }
    },
    "987654321": {
      "c": "SEK",
      "p": 114500,
      "r": 136000,
      "pct": 15,
      "fx": 200,
      "t": {
        "en": "Lowest price in the last 30 days: SEK 1,360.00",
        "de": "Niedrigster Preis der letzten 30 Tage: 1.360,00 SEK",
        "fr": "Prix le plus bas des 30 derniers jours : 1 360,00 SEK"
      },
      "b": {
        "en": "-15%",
        "de": "-15 %",
        "fr": "-15 %"
      }
    }
  }
}

Das Beispiel zeigt nur drei Sprachen, damit es kurz bleibt. Der echte Wert enthält alle zehn in t und in b. Die Shop-Währung im Beispiel ist EUR, der zweite Markt ist also ein umgerechneter und enthält fx.

FeldBedeutung
vFormatversion. Derzeit 1.
uZeitpunkt, zu dem der Wert geschrieben wurde (ISO-Zeit).
wLänge des Zeitfensters in Tagen.
mErgebnisse pro Markt. Der Schlüssel ist die numerische Markt-ID. Nur Märkte mit einem anzuzeigenden Label sind enthalten. Das Objekt kann leer sein.
cWährung des Eintrags.
pPreis zum Zeitpunkt der Prüfung, in Cent (dieselbe Einheit wie Liquid-Preise, auch bei Währungen ohne Dezimalstellen).
rDer frühere Preis, in Cent.
pctPreissenkung gegenüber dem früheren Preis, in Prozent, abgerundet.
fxWechselkurstoleranz in Basispunkten (200 = 2 %). Nur vorhanden, wenn c nicht die Shop-Währung ist.
tLabel-Text pro Sprache. Alle zehn Sprachen.
bBadge-Text pro Sprache. Nur vorhanden, wenn pct über 0 liegt.

Die Anzeigeregel

Prüfe den gespeicherten Eintrag immer gegen die aktuelle Seite. Zeige das Label nur, wenn alles Folgende zutrifft:

  1. m hat einen Eintrag für die Markt-ID des Käufers.
  2. c entspricht der Währung des Käufers.
  3. Der Vergleichspreis der Variante liegt über ihrem Preis.
  4. r liegt über 0.
  5. Der aktuelle Preis in Cent entspricht p. Bei einem Eintrag mit fx gilt auch abs(price - p) * 10000 <= p * fx.

Wähle den Text in dieser Reihenfolge: die Sprache des Käufers (zum Beispiel de), dann die Basissprache (pt und pt-BR verwenden pt-PT), dann en. Zeige das Badge nur, wenn der aktuelle Preis genau p entspricht. Behandle alle Texte als reinen Text: In Liquid verwende | escape, in JavaScript textContent, nie innerHTML.

Schlägt eine Prüfung fehl, zeige nichts an. Zeige kein altes Label neben einem geänderten Preis.

Liquid-Beispiel

Speichere dies als snippets/omnibuzz-label.liquid und binde es auf der Produktseite ein:

{% doc %}
  @param {variant} variant - The selected variant
  @example
  {% render 'omnibuzz-label', variant: product.selected_or_first_available_variant %}
{% enddoc %}
{%- liquid
  assign label = variant.metafields.omnibuzz.label.value
  assign market_id = localization.market.id | append: ''
  assign entry = label.m[market_id]
  assign price = variant.price
  assign show = false
  assign exact = false

  if entry and entry.c == cart.currency.iso_code and variant.compare_at_price > price and entry.r > 0
    if price == entry.p
      assign show = true
      assign exact = true
    elsif entry.fx != blank
      assign drift = price | minus: entry.p | abs | times: 10000
      assign allowed = entry.p | times: entry.fx
      if drift <= allowed
        assign show = true
      endif
    endif
  endif

  if show
    assign lang = request.locale.iso_code
    assign base = lang | split: '-' | first
    if base == 'pt'
      assign base = 'pt-PT'
    endif
    assign text = entry.t[lang] | default: entry.t[base] | default: entry.t.en
    assign badge = entry.b[lang] | default: entry.b[base] | default: entry.b.en
  endif
-%}
{%- if show and text != blank -%}
  <p class="omnibuzz-label">{{ text | escape }}</p>
  {%- if exact and badge != blank -%}
    <span class="omnibuzz-badge">{{ badge | escape }}</span>
  {%- endif -%}
{%- endif -%}

Das Snippet liest den aktuellen Preis von der Variante. Wählt ein Käufer eine andere Variante, muss dein Theme das Snippet neu rendern oder dieselben Prüfungen im Skript ausführen.

Storefront-API-Beispiel

Ohne @inContext liefert die API die Preise des Hauptmarkts. Übergib immer Land und Sprache des Käufers:

query OmniBuzzLabel($handle: String!, $country: CountryCode!, $language: LanguageCode!)
@inContext(country: $country, language: $language) {
  localization {
    market {
      id
    }
  }
  product(handle: $handle) {
    variants(first: 50) {
      nodes {
        id
        price {
          amount
          currencyCode
        }
        compareAtPrice {
          amount
          currencyCode
        }
        metafield(namespace: "omnibuzz", key: "label") {
          value
        }
      }
    }
  }
}

value ist ein JSON-String. Parse ihn und wende dann die Anzeigeregel an:

  • Rechne amount in Cent um: Math.round(Number(amount) * 100). Tu das für jede Währung.
  • Die Markt-ID ist eine globale ID wie gid://shopify/Market/123456789. Verwende die Zahl am Ende als Schlüssel in m.
  • localization.market ist ab Storefront API 2026-10 veraltet, funktioniert aber noch. Ohne Markt-ID zeige nichts an.

Gut zu wissen

  • Die Werte werden jede Nacht aktualisiert und erneut, wenn du auf der Seite Labels Label-Texte oder die Wechselkurstoleranz änderst.
  • Die App formatiert die Beträge im Text selbst. Das Format kann leicht vom Geldformat deines Shops abweichen.
  • Ein Markt mit ausgeschalteten Labels oder eine Variante ohne Ergebnis hat keinen Eintrag. Zeige dann nichts an.

Wenn du die App deinstallierst

Shopify entfernt nur Daten, die der App selbst gehören. Die Definition omnibuzz und ihre Werte bleiben nach der Deinstallation in deinem Shop. Die App kann sie nicht mehr aufräumen. Um sie zu entfernen, öffne in deinem Shopify-Admin Einstellungen > Benutzerdefinierte Daten > Produktvarianten und lösche die Definition OmniBuzz label. Mit ihr werden auch ihre Werte gelöscht.

Entferne auch deinen Code. Nach der Deinstallation werden die Daten nicht mehr aktualisiert, und ein altes Label könnte neben einem geänderten Preis stehen. Entferne dein Snippet oder deine Abfrage bei der Deinstallation.