Menú de la documentación

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

PropiedadValor
Espacio de nombresomnibuzz
Clavelabel
Tipojson
PropietarioVariante de producto
Acceso StorefrontLectura pública
Nombre de la definiciónOmniBuzz 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.

CampoSignificado
vVersión del formato. Ahora mismo, 1.
uCuándo se escribió el valor (hora ISO).
wDuración de la ventana en días.
mResultados por mercado. La clave es el ID numérico del mercado. Solo aparecen los mercados con una etiqueta que mostrar. Puede estar vacío.
cMoneda de la entrada.
pPrecio en el momento de la comprobación, en céntimos (la misma unidad que los precios de Liquid, también en monedas sin decimales).
rEl precio anterior, en céntimos.
pctReducción respecto al precio anterior, en porcentaje, redondeada hacia abajo.
fxTolerancia del tipo de cambio en puntos básicos (200 = 2 %). Solo aparece cuando c no es la moneda de la tienda.
tTexto de la etiqueta por idioma. Los diez idiomas.
bTexto 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:

  1. m tiene una entrada para el ID de mercado del comprador.
  2. c es igual a la moneda del comprador.
  3. El precio de comparación de la variante es mayor que su precio.
  4. r es mayor que 0.
  5. El precio actual en céntimos es igual a p. En una entrada con fx, también vale abs(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 amount a 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 en m.
  • localization.market está 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.