Použití textu ceny ve vlastních šablonách a headless obchodech
Načtěte text OmniBuzz z metapole varianty ve vlastním kódu Liquid nebo v Storefront API a použijte stejné pravidlo zobrazení jako aplikační blok.
Aplikační blok stačí pro většinu šablon. Pokud vaše šablona aplikační bloky nepodporuje nebo stavíte headless obchod, můžete hotový text načíst sami. OmniBuzz ho zapisuje do metapole varianty. Číst ho umí šablona Liquid i Storefront API.
Kde jsou data
| Vlastnost | Hodnota |
|---|---|
| Jmenný prostor | omnibuzz |
| Klíč | label |
| Typ | json |
| Vlastník | Varianta produktu |
| Přístup ze Storefrontu | Veřejné čtení |
| Název definice | OmniBuzz label |
OmniBuzz definici vytvoří za vás. Hodnota existuje vždy, když má varianta data OmniBuzz. m může být prázdné ({}); pak nezobrazujte nic.
Pokud používáte blok šablony, nic se nemění. Blok Omnibus cena dál používá vlastní data ($app:omnibus). Tuto stránku potřebujete, jen když píšete vlastní kód.
Formát hodnoty
{
"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 %"
}
}
}
}
Příklad ukazuje tři jazyky, aby zůstal krátký. Skutečná hodnota má všech deset v t i v b. Měna obchodu je v příkladu EUR, takže druhý trh je přepočítaný a má fx.
| Pole | Význam |
|---|---|
v | Verze formátu. Nyní 1. |
u | Kdy byla hodnota zapsána (čas ISO). |
w | Délka okna ve dnech. |
m | Výsledky podle trhů. Klíčem je číselné ID trhu. Jsou tu jen trhy s textem k zobrazení. Může být prázdné. |
c | Měna záznamu. |
p | Cena v okamžiku kontroly, v haléřích (stejná jednotka jako ceny v Liquidu, i u měn bez desetinných míst). |
r | Předchozí cena, v haléřích. |
pct | Snížení oproti předchozí ceně v procentech, zaokrouhlené dolů. |
fx | Tolerance směnného kurzu v bazických bodech (200 = 2 %). Je přítomné jen tehdy, když c není měna obchodu. |
t | Text ceny podle jazyka. Všech deset jazyků. |
b | Text štítku slevy podle jazyka. Je přítomný jen tehdy, když je pct větší než 0. |
Pravidlo zobrazení
Uložený záznam vždy porovnejte s aktuální stránkou. Text zobrazte, jen když platí všechno z následujícího:
mobsahuje záznam pro ID trhu kupujícího.cse rovná měně kupujícího.- Srovnávací cena varianty je vyšší než její cena.
rje větší než 0.- Aktuální cena v haléřích se rovná
p. U záznamu sfxstačí iabs(price - p) * 10000 <= p * fx.
Text vyberte v tomto pořadí: jazyk kupujícího (například de), potom základní jazyk (pt a pt-BR používají pt-PT), potom en. Štítek slevy zobrazte, jen když se aktuální cena přesně rovná p. Všechny texty berte jako prostý text: v Liquidu použijte | escape, v JavaScriptu textContent, nikdy innerHTML.
Pokud některá kontrola selže, nezobrazujte nic. Nezobrazujte starý text vedle změněné ceny.
Příklad v Liquidu
Uložte to jako snippets/omnibuzz-label.liquid a vykreslete na stránce produktu:
{% 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 -%}
Snippet čte aktuální cenu z varianty. Když kupující zvolí jinou variantu, musí vaše šablona snippet vykreslit znovu nebo provést stejné kontroly ve skriptu.
Příklad se Storefront API
Bez @inContext vrací API ceny hlavního trhu. Vždy předávejte zemi a jazyk kupujícího:
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 je řetězec JSON. Zpracujte ho a potom použijte pravidlo zobrazení:
- Přepočtěte
amountna haléře:Math.round(Number(amount) * 100). Udělejte to pro každou měnu. - ID trhu je globální ID, například
gid://shopify/Market/123456789. Jako klíč vmpoužijte číslo na konci. localization.marketje od Storefront API 2026-10 zastaralé, ale stále funguje. Bez ID trhu nezobrazujte nic.
Dobré vědět
- Hodnoty se aktualizují každou noc a znovu poté, co na stránce Štítky změníte texty nebo toleranci směnného kurzu.
- Částky v textu formátuje samotná aplikace. Formát se může mírně lišit od peněžního formátu vašeho obchodu.
- Trh s vypnutými texty nebo varianta bez výsledku nemá záznam. V takovém případě nezobrazujte nic.
Když aplikaci odinstalujete
Shopify odebírá jen data, která patří samotné aplikaci. Definice omnibuzz a její hodnoty zůstávají po odinstalaci ve vašem obchodě. Aplikace je už nemůže uklidit. Abyste je odstranili, otevřete v administraci Shopify Nastavení > Vlastní data > Varianty produktů a smažte definici OmniBuzz label. Smazáním zmizí i její hodnoty.
Odstraňte i svůj kód. Po odinstalaci se data přestanou aktualizovat a starý text by mohl stát vedle změněné ceny. Svůj snippet nebo dotaz odstraňte při odinstalaci.