Usar la etiqueta en temas personalizados y tiendas headless
Lee la etiqueta de OmniBuzz desde un metacampo de variante en tu propio código Liquid o en la Storefront API, y aplica la misma regla de visualización que el bloque de aplicación.
El bloque de aplicación cubre la mayoría de los temas. Si tu tema no admite bloques de aplicación, o creas una tienda headless, puedes leer tú mismo la etiqueta ya preparada. OmniBuzz la escribe en un metacampo de variante. Tanto el tema Liquid como la Storefront API pueden leerlo.
Dónde están los datos
| Propiedad | Valor |
|---|---|
| Espacio de nombres | omnibuzz |
| Clave | label |
| Tipo | json |
| Propietario | Variante de producto |
| Acceso Storefront | Lectura pública |
| Nombre de la definición | OmniBuzz label |
OmniBuzz crea la definición por ti. El valor existe siempre que la variante tenga datos de OmniBuzz. m puede estar vacío ({}); en ese caso no muestres nada.
Si usas el bloque del tema, no cambia nada. El bloque Precio Ómnibus sigue usando sus propios datos ($app:omnibus). Solo necesitas esta página si escribes tu propio código.
El formato del valor
{
"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 %"
}
}
}
}
El ejemplo muestra tres idiomas para que sea corto. El valor real tiene los diez en t y en b. La moneda de la tienda en el ejemplo es EUR, así que el segundo mercado es convertido y lleva fx.
| Campo | Significado |
|---|---|
v | Versión del formato. Ahora mismo, 1. |
u | Cuándo se escribió el valor (hora ISO). |
w | Duración de la ventana en días. |
m | Resultados por mercado. La clave es el ID numérico del mercado. Solo aparecen los mercados con una etiqueta que mostrar. Puede estar vacío. |
c | Moneda de la entrada. |
p | Precio en el momento de la comprobación, en céntimos (la misma unidad que los precios de Liquid, también en monedas sin decimales). |
r | El precio anterior, en céntimos. |
pct | Reducción respecto al precio anterior, en porcentaje, redondeada hacia abajo. |
fx | Tolerancia del tipo de cambio en puntos básicos (200 = 2 %). Solo aparece cuando c no es la moneda de la tienda. |
t | Texto de la etiqueta por idioma. Los diez idiomas. |
b | Texto de la insignia por idioma. Solo aparece cuando pct es mayor que 0. |
La regla de visualización
Comprueba siempre la entrada guardada con la página actual. Muestra la etiqueta solo si se cumple todo lo siguiente:
mtiene una entrada para el ID de mercado del comprador.ces igual a la moneda del comprador.- El precio de comparación de la variante es mayor que su precio.
res mayor que 0.- El precio actual en céntimos es igual a
p. En una entrada confx, también valeabs(price - p) * 10000 <= p * fx.
Elige el texto en este orden: el idioma del comprador (por ejemplo de), después el idioma base (pt y pt-BR usan pt-PT), después en. Muestra la insignia solo cuando el precio actual sea exactamente p. Trata todos los textos como texto sin formato: en Liquid usa | escape, en JavaScript usa textContent, nunca innerHTML.
Si falla una comprobación, no muestres nada. No muestres una etiqueta antigua junto a un precio cambiado.
Ejemplo en Liquid
Guarda esto como snippets/omnibuzz-label.liquid y renderízalo en la página de producto:
{% 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 -%}
El snippet lee el precio actual de la variante. Cuando el comprador elige otra variante, tu tema tiene que renderizar el snippet de nuevo o ejecutar las mismas comprobaciones en un script.
Ejemplo con la Storefront API
Sin @inContext, la API devuelve los precios del mercado principal. Pasa siempre el país y el idioma del comprador:
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 es una cadena JSON. Analízala y aplica la regla de visualización:
- Convierte
amounta céntimos:Math.round(Number(amount) * 100). Hazlo para todas las monedas. - El ID de mercado es un ID global como
gid://shopify/Market/123456789. Usa el número final como clave enm. localization.marketestá obsoleto desde la Storefront API 2026-10, pero sigue funcionando. Sin un ID de mercado, no muestres nada.
Conviene saber
- Los valores se actualizan cada noche, y de nuevo cuando cambias los textos de las etiquetas o la tolerancia del tipo de cambio en la página Etiquetas.
- La aplicación da formato por sí misma a los importes del texto. Puede diferir un poco del formato de moneda de tu tienda.
- Un mercado con las etiquetas desactivadas, o una variante sin resultado, no tiene entrada. En ese caso no muestres nada.
Cuando desinstalas la aplicación
Shopify solo elimina los datos que pertenecen a la propia aplicación. La definición omnibuzz y sus valores se quedan en tu tienda tras desinstalar. La aplicación ya no puede limpiarlos. Para eliminarlos, abre Configuración > Datos personalizados > Variantes de producto en tu administrador de Shopify y borra la definición OmniBuzz label. Al borrarla se borran también sus valores.
Elimina también tu código. Tras desinstalar, los datos dejan de actualizarse y una etiqueta antigua podría quedar junto a un precio cambiado. Elimina tu snippet o tu consulta al desinstalar.