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
| Eigenschaft | Wert |
|---|---|
| Namespace | omnibuzz |
| Schlüssel | label |
| Typ | json |
| Besitzer | Produktvariante |
| Storefront-Zugriff | Öffentlich lesbar |
| Name der Definition | OmniBuzz 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.
| Feld | Bedeutung |
|---|---|
v | Formatversion. Derzeit 1. |
u | Zeitpunkt, zu dem der Wert geschrieben wurde (ISO-Zeit). |
w | Länge des Zeitfensters in Tagen. |
m | Ergebnisse pro Markt. Der Schlüssel ist die numerische Markt-ID. Nur Märkte mit einem anzuzeigenden Label sind enthalten. Das Objekt kann leer sein. |
c | Währung des Eintrags. |
p | Preis zum Zeitpunkt der Prüfung, in Cent (dieselbe Einheit wie Liquid-Preise, auch bei Währungen ohne Dezimalstellen). |
r | Der frühere Preis, in Cent. |
pct | Preissenkung gegenüber dem früheren Preis, in Prozent, abgerundet. |
fx | Wechselkurstoleranz in Basispunkten (200 = 2 %). Nur vorhanden, wenn c nicht die Shop-Währung ist. |
t | Label-Text pro Sprache. Alle zehn Sprachen. |
b | Badge-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:
mhat einen Eintrag für die Markt-ID des Käufers.centspricht der Währung des Käufers.- Der Vergleichspreis der Variante liegt über ihrem Preis.
rliegt über 0.- Der aktuelle Preis in Cent entspricht
p. Bei einem Eintrag mitfxgilt auchabs(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
amountin 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 inm. localization.marketist 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.