Saltar al contenido principal
Liquid es un lenguaje de plantillas soportado por OneSignal para personalizar mensajes a través de canales incluyendo email, push, SMS, in-app y Live Activities. Usa etiquetas, filtros y condicionales para personalizar dinámicamente el contenido de mensajes. Para aprender más sobre la sintaxis Liquid, consulta la documentación oficial de Liquid.

Sintaxis básica

Liquid usa dos estructuras de sintaxis principales:
  1. Etiquetas de salida: {{ ... }} — Muestra datos de una variable u objeto.
  2. Etiquetas de lógica: {% ... %} — Ejecuta declaraciones condicionales o bucles.

Condicionales

Operadores

  • ==, !=, >, <, >=, <=
  • and, or
  • contains (cadena o array)
liquid
{% if true or false and false %}
  This is true.
{% endif %}

if, elsif, else

liquid
{%- assign userLang = subscription.language -%}
{% if userLang == "es" -%}
Hola {{ first_name }}!
{%- elsif userLang == "fr" -%}
Bonjour {{ first_name }}!
{%- else -%}
Hello {{ first_name }}!
{%- endif %}

unless

liquid
{% unless level == "1" %}
  Great job getting past the first level!
{% endunless %}

Filtros

Aplica filtros usando {{ variable | filter }} para ajustar cómo se muestran los datos.

default

Asigna un valor predeterminado si la propiedad está vacía o no existe.
liquid
Hello {{ first_name | default: "there" }}.

date

El filtro date convierte una marca de tiempo en otro formato de fecha. El formato para esta sintaxis es el mismo que strftime. La entrada usa el mismo formato que Time.parse de Ruby. Establece fechas como una marca de tiempo unix en segundos con tags. Esto permite el uso tanto de personalización con sintaxis liquid como de segmentación con Operadores de tiempo. Por ejemplo, un tag podría verse así: bill_due : 1687968776
liquid
{{ bill_due | date: "%a, %b %d, %y" }}
{{ "now" | date: "%Y-%m-%d %H:%M" }}
Result
Wed, Jun 28, 23
liquid
{{ bill_due | date: "%Y" }}
Result
2023
El formato de fecha funciona en cadenas si contienen fechas bien formateadas.
liquid
{{ "March 14, 2016" | date: "%b %d, %y" }}
Result
Mar 14, 16
Para obtener la hora actual, pasa la palabra especial now (o today) junto con el filtro date.
liquid
This message was sent at {{ "now" | date: "%Y-%m-%d %H:%M" }}.
Result
This message was sent at 2022-11-02 14:39.
La hora actual se renderizará en el mensaje según cuándo se envíe el mensaje al destinatario. Si estás probando el mensaje, verás la hora actual como cuando se envió el mensaje de prueba.

capitalize

Este filtro hace que el primer carácter de una cadena esté en mayúscula y convierte los caracteres restantes a minúsculas.
liquid
{{ "my GREAT title" | capitalize }}
Result
My great title

round

Este filtro redondea un número al entero más cercano, o, si se pasa un número como argumento, a ese número de decimales.
liquid
{{ 1.2 | round }}
  {{ 2.7 | round }}
{{ 183.357 | round: 2 }}
Result
1
3
183.36

pluralize

Este filtro devuelve la forma singular o plural de una cadena basándose en un número dado. El número debe ser un número entero y puede proporcionarse como cadena. Deben proporcionarse tanto la forma singular como la plural de una cadena.
liquid
{{ 1 | pluralize: "singular", "plural" }}
{{ 2 | pluralize: "singular", "plural" }}
1 {{ 1 | pluralize: "person", "people" }}
2 {{ 2 | pluralize: "person", "people" }}
2 {{ "2" | pluralize: "person", "people" }}
Result
singular
plural
1 person
2 people
2 people

Iteración

Bucles for

Ejecuta repetidamente un bloque de código. Para una lista completa de atributos disponibles dentro de un bucle for, consulta la documentación del bucle for de Liquid.
liquid
{% for product in message.custom_data.products %}
  - {{ product.name }}
  {% else %}
    Sorry, we're sold out of all products.
  {% endfor %}
Request Body
{
  "app_id": "YOUR_APP_ID",
  "template_id": "YOUR_TEMPLATE_ID",
  "custom_data": {
    "products": [
      { "name": "Sweater" },
      { "name": "Hat" },
      { "name": "Shirt" }
    ]
  }
}
Result
- Sweater
- Hat
- Shirt

(Si message.custom_data.products está vacío)
Lo sentimos, estamos sin existencias de todos los productos.
Aunque poderosos y flexibles, el uso de bucles for en sintaxis liquid puede llevar a un rendimiento deficiente en la entrega de notificaciones en ciertos casos raros. Ten cuidado con tu uso de bucles for. También ten en cuenta que prevenimos el uso de bucles for en algunos campos de Canal Push: contents, headings, subtitle, apns_alert, y url

limit & offset

Limita el bucle al número especificado de iteraciones. Por ejemplo, si solo quieres mostrar 4 productos en un mensaje, podrías usar Límites y Desplazamientos para especificar el número de productos mostrados.
Data
great_numbers = [1,2,3,4,5,6]
liquid
{% for number in great_numbers limit:2 %}
  {{ number }}
{% endfor %}
Result
1 2
Para comenzar el bucle en el índice especificado, agrega un valor de desplazamiento:
Data
great_numbers = [1,2,3,4,5,6]
liquid
{% for number in great_numbers limit: 3 %}
  {{ number }}
{% endfor %}

{% for number in great_numbers limit: 3 offset: 3 %}
  {{ number }}
{% endfor %}
Result
1 2 3
4 5 6

where

Crea un array que incluye solo los objetos con un valor de propiedad dado, o cualquier valor verdadero por defecto. En este ejemplo, supón que tienes una lista de productos y quieres mostrar tus productos de cocina por separado. Usando where, puedes crear un array que contenga solo los productos que tienen un type de kitchen.
Data
products = [
  {name:"Vacuum", type:"electronics"},
  {name:"Spatula", type:"kitchen"},
  {name:"Television", type:"electronics"},
  {name:"Garlic press", type:"kitchen"}
]
liquid
All products:
{% for product in products %}
- {{ product.name }}
{% endfor %}

{% assign kitchen_products = products | where: "type", "kitchen" %}

Kitchen products:
{% for product in kitchen_products %}
- {{ product.name }}
{% endfor %}
Result
All products:
  - Vacuum
  - Spatula
  - Television
  - Garlic press

Kitchen products:
- Spatula
- Garlic press

Manipulación de cadenas

Aplica filtros de cadena para ajustar cómo se muestran los valores de etiquetas o cadenas en línea en los mensajes.
ComandoDescripciónEjemploSalida de ejemplo
replaceReemplaza una subcadena con otra cadena.{{ 'hello world' | replace: 'world', 'there' }}hello there
capitalizeCapitaliza la primera letra de una cadena.{{ 'hello' | capitalize }}Hello
upcaseConvierte una cadena a mayúsculas.{{ 'hello' | upcase }}HELLO
downcaseConvierte una cadena a minúsculas.{{ 'HELLO' | downcase }}hello
stripElimina espacios en blanco iniciales y finales de una cadena.{{ ' hello ' | strip }}hello
strip_htmlElimina todas las etiquetas HTML de una cadena.{{ '<p>hello</p>' | strip_html }}hello
truncateAcorta una cadena a una longitud especificada, agregando puntos suspensivos (…) si es necesario.{{ 'This is a long sentence' | truncate: 10 }}This is a…
truncatewordsTrunca una cadena después de un cierto número de palabras.{{ 'This is a long sentence' | truncatewords: 2 }}This is…
replace_firstReemplaza la primera ocurrencia de una subcadena.{{ 'hello world' | replace_first: 'world', 'there' }}hello there
prependAgrega una cadena al principio de otra cadena.{{ 'world' | prepend: 'hello ' }}hello world
appendAgrega una cadena al final de otra cadena.{{ 'hello' | append: ' world' }}hello world
lstripElimina espacios en blanco iniciales de una cadena.{{ ' hello' | lstrip }}hello
rstripElimina espacios en blanco finales de una cadena.{{ 'hello ' | rstrip }}hello

Preguntas frecuentes

¿Por qué no funciona la sustitución?

  • Los Mensajes In-App no soportan sustitución de propiedades.
  • La sustitución de tag no funciona cuando se usa “Send Test Message”.
  • Las claves de tag deben ser alfanuméricas, o usar _ y - (sin puntos ni espacios).
  • La sustitución no aparece en modo de vista previa — envía un mensaje real para probar.

¿Cuándo debo usar default en lugar de if/else?

Usa el filtro default cuando solo el valor de la variable necesita un fallback y el texto circundante permanece igual.
liquid
Hello {{ name | default: "there" }}!
Result (name = "Jon")
Hello Jon!
Result (name está vacío)
Hello there!
Usa la lógica condicional if/else cuando el texto circundante, la puntuación o la estructura de la oración también necesiten cambiar según si existe la variable.
liquid
{% if name %}{{ name }}, shop your favorites!{% else %}Shop your favorites!{% endif %}
Result (name = "Jon")
Jon, shop your favorites!
Result (name está vacío)
Shop your favorites!
No uses default cuando la estructura de la oración cambia. Por ejemplo, {{ name | default: "Shop your favorites" }}, shop your favorites renderizaría como “Shop your favorites, shop your favorites” cuando el nombre está vacío. Si el fallback cambia más que solo la variable, usa if/else.

¿Cómo controlar espacios en blanco y saltos de línea?

Usa guiones: {{- ... -}}, {%- ... -%} para recortar espacios en blanco circundantes. Ver Control de espacios en blanco para más detalles.

¿Cómo manejar contenido generado por usuarios?

Envuelve el texto generado por usuarios en {% raw %} y {% endraw %} para prevenir el análisis de Liquid. Ver sintaxis “raw”.
{
  "contents": {
    "en": "{% raw %} Your user-generated content with invalid characters like {{ {% endraw %}"
  }
}

Páginas relacionadas

Personalización de mensajes

Descripción general de todas las opciones de personalización, incluyendo Liquid, Data Feeds y eventos personalizados.

Data Feeds

Obtén datos en tiempo real de tus APIs en los mensajes en el momento del envío.

Etiquetas

Almacena pares clave-valor en usuarios para segmentación y personalización Liquid.

Plantillas

Crea plantillas de mensajes reutilizables con personalización Liquid integrada.