Las plantillas de Smart Message se escriben en Twig 3. Esta página enumera todas las variables, funciones y filtros que Nonli admite en ese contexto, con su tipo, los casos en que pueden faltar y un ejemplo probado. Para crear una plantilla paso a paso, empieza por Cómo crear un Smart Message.
1. Dónde se aplica este contexto#
El mismo contexto está disponible en dos lugares:
- Plantillas de Smart Message, usadas por los bots, por el botón de la bombilla del editor de publicaciones y por el botón del primer comentario. Pueden rellenar el mensaje, el título, la descripción, el comentario, el título del vídeo, el texto alternativo y el título de anclaje de TikTok.
- Valores dinámicos de Smart Image, cuando un texto o un color de Smart Image usa como origen una plantilla de Smart Message. En ese caso, la variable
contextes igual a'smart_image'. Consulta Cómo usar colores dinámicos en Smart Image.
Los parámetros de URL dinámicos y el paywall dinámico también usan Twig, pero con un contexto mucho más reducido: un post restringido (source, social_account, post_type, author, user_id, breaking_news, short_id), referer, la función isComment(), y contadores y percentiles. organic, los alias de nivel superior y las funciones de Smart Message que se describen más abajo no existen ahí.
2. Reglas de nombres y de tipos#
- Prefiere las rutas completas. Escribe
organic.titleopost.social_account.typeen lugar de un alias de nivel superior. Los alias siguen siendo compatibles para las plantillas existentes. - Los nombres van en snake_case y siguen los nombres de los campos almacenados:
canonical_url,published_at,open_graph. - Respeta el singular y el plural. Las rutas son
organic.category,organic.tag,organic.author; los alias sontagsyauthors. Un nombre incorrecto comocategories,organic.categories,tagoauthorno genera ningún error: se muestra como un valor vacío. - Tipos. Una cadena es texto. Una lista es una secuencia de valores: pruébala con
in, léela con|firsto|join(', '), y nunca la imprimas directamente. Un objeto agrupa otras rutas. Después vienen los números, los booleanos y las fechas. Las fechas son cadenas ISO 8601 en UTC, como2026-10-18T07:30:00.000Z; dales formato con|date. - Ausencia. Un valor solo existe si la fuente lo proporciona. Depende del origen de la publicación (artículo, publicación manual, publicación sin enlace), de la red social, del tipo de publicación y de los metadatos que el scraper haya encontrado en la página. Una ruta
organicausente se muestra vacía; una lista vacía se trata como ausente.
Usa ?? para sustituir un valor ausente o null, y ?: o |default() para sustituir también una cadena vacía:
| Expresión | Valor ausente | Valor '' | Valor 'A' |
|---|---|---|---|
{{ x ?? 'B' }} | B | (vacío) | A |
{{ x ?: 'B' }} | B | B | A |
{{ x|default('B') }} | B | B | A |
Después de un filtro, usa ?: o |default(), nunca ??: {{ x|upper ?? 'B' }} es un error de sintaxis y la plantilla se rechaza al guardarla.
3. Variables de nivel superior#
Estas variables siempre están definidas en un Smart Message.
| Ruta | Tipo | Disponibilidad | Descripción | Ejemplo |
|---|---|---|---|---|
social_network | cadena | Siempre | Red de la cuenta de destino; facebook si se desconoce. | instagram |
post_type | cadena | Siempre | Tipo de publicación; link si se desconoce. | photo |
empty_message | cadena | Siempre | Una cadena vacía, para no devolver deliberadamente nada. | '' |
shortlink_prefix | cadena | Siempre | El texto de la marca que se coloca antes de un enlace corto. | ➡️ |
post | objeto | Siempre | La publicación que se está creando o editando (consulta post.*). | |
organic | objeto | Siempre | El artículo de origen (consulta organic.*); una lista vacía [] cuando la publicación no tiene artículo. | |
context | cadena | Siempre | Campo que se está generando: message, title, description, comment, videoTitle, altText, tikTokAnchorTitle, o smart_image cuando Smart Image renderiza la plantilla. | message |
3.1. Alias heredados#
Cuando la publicación procede de un artículo, Nonli también copia algunos campos del artículo al nivel superior. Estos alias están definidos (posiblemente null) en cuanto existe un artículo y sin definir cuando la publicación no tiene ninguno. Cada uno tiene una ruta completa preferida.
| Alias | Ruta completa preferida | Tipo | Contenido |
|---|---|---|---|
title | organic.title | cadena | Título del artículo elegido por Nonli |
description | organic.description | cadena | Descripción del artículo elegida por Nonli |
title1 | organic.html.h1 | cadena | Primer encabezado H1 de la página |
title2 | organic.html.h2 | cadena | Primer encabezado H2 de la página |
head_title | organic.head.title | cadena | Etiqueta HTML title, a menudo un título SEO más largo |
meta_description | organic.meta.description | cadena | Metadescripción nativa de la página |
og_title | organic.meta.open_graph.title | cadena | Título Open Graph |
og_description | organic.meta.open_graph.description | cadena | Descripción Open Graph |
twitter_title | organic.meta.twitter.title | cadena | Título de Twitter Card |
twitter_description | organic.meta.twitter.description | cadena | Descripción de Twitter Card |
meta_custom_facebook, meta_custom_twitter, meta_custom_instagram, meta_custom_linkedin, meta_custom_tiktok, meta_custom_pinterest | organic.meta.custom.facebook (y así sucesivamente) | cadena | Metadatos personalizados por red, extraídos mediante una regla específica del sitio |
meta_custom_publisher | organic.meta.custom.publisher | cadena | Campo personalizado del medio, extraído mediante una regla específica del sitio, por ejemplo el primer párrafo del cuerpo |
meta_custom_rss_title | organic.meta.custom.rss.title | cadena | Título del elemento RSS |
meta_custom_rss_description | organic.meta.custom.rss.description | cadena | Descripción del elemento RSS |
authors | organic.author | lista | Autores del artículo |
tags | organic.tag | lista | Etiquetas del artículo |
En un artículo real, title y title1 suelen contener el mismo titular, head_title contiene el título SEO más largo y meta_description suele empezar por la entradilla. Cualquiera de ellos puede estar vacío, así que prevé siempre una alternativa.
Las opciones «Meta custom …» del editor y de los orígenes de los bots corresponden a estos alias meta_custom_*. Solo se rellenan en los sitios donde Nonli ha configurado una regla de extracción específica. Un artículo de un sitio ajeno a tu empresa solo expone sus campos públicos, por lo que organic.counter.view no existe para él.
4. [object Object],: el artículo de origen#
organic existe cuando la publicación procede de un artículo (bot, URL pegada en el editor, SDK, RSS). Una publicación manual o sin enlace no tiene artículo: organic es entonces una lista vacía y todas las rutas organic.* están vacías.
| Ruta | Tipo | Disponibilidad | Descripción | Ejemplo |
|---|---|---|---|---|
organic.url | cadena | Todos los artículos | URL del artículo | https://www.example.com/politics/budget |
organic.canonical_url | cadena | Si está declarada | URL canónica | https://www.example.com/politics/budget |
organic.type | cadena | Todos los artículos | Tipo de contenido detectado | article |
organic.language | cadena | Si se detecta | Código de idioma | fr |
organic.title | cadena | La mayoría de los artículos | Título elegido por Nonli | Budget 2027: what changes |
organic.description | cadena | Si se encuentra | Descripción elegida por Nonli | The government presents its budget. |
organic.html.h1 / organic.html.h2 | cadena | Si existe | Primer encabezado H1 / H2 | Key measures |
organic.head.title | cadena | Si existe | Etiqueta HTML title | Budget 2027 - Example News |
organic.meta.description | cadena | Si existe | Metadescripción nativa | The government presents its budget. |
organic.meta.open_graph.title / .description | cadena | Si existe | Título / descripción Open Graph | Budget 2027 |
organic.meta.open_graph.article.section | cadena | Si existe | article:section de Open Graph | Politics |
organic.meta.twitter.title / .description | cadena | Si existe | Título / descripción de Twitter Card | Budget 2027 |
organic.meta.custom.* | cadena | Regla específica del sitio | Campos personalizados enumerados en la tabla de alias | |
organic.category | lista | Si se encuentra | Categorías normalizadas, incluido el articleSection de JSON-LD | ['politics', 'economy'] |
organic.tag | lista | Si se encuentra | Etiquetas del artículo | ['budget', 'taxes'] |
organic.author | lista | Si se encuentra | Autores del artículo | ['Camille Martin'] |
organic.image | lista | Si se encuentra | URL de las imágenes encontradas en la página | ['https://…/budget.jpg'] |
organic.image_alt | cadena | Si se encuentra | Texto alternativo de la imagen principal | The National Assembly chamber |
organic.published_at | fecha | Si se encuentra | Fecha de publicación (UTC) | 2026-10-18T07:30:00.000Z |
organic.modified_at | fecha | Si se encuentra | Fecha de la última modificación (UTC) | 2026-10-18T09:00:00.000Z |
organic.counter.view | número | Consulta los contadores | Visitas al artículo medidas por Nonli | 1520 |
4.1. Categorías y ,[object Object]#
Nonli almacena el valor articleSection de JSON-LD, y las demás señales de categoría de la página, en organic.category. Es una lista, no un texto, y no existe ninguna variable categories. Los valores se normalizan: minúsculas, sin acentos y con la puntuación convertida en espacios. Por ejemplo, Politique & Société, Économie y Sports > Rugby pasan a ser politique societe, economie y sports rugby. Compara siempre con los valores que hayas visto realmente en tus propios artículos.
1{%- set categories = organic.category ?? [] -%}2{%- if 'politique' in categories -%}3Politics4{%- endif -%}Primera categoría, o nada: {{ organic.category|default([])|first|default('') }}
Todas las categorías: {{ organic.category|default([])|join(', ') }}
La sección Open Graph en bruto, sin normalizar, sigue disponible como {{ organic.meta.open_graph.article.section ?? '' }}.
5. [object Object],: la publicación#
post describe la publicación que se está creando o editando. Los campos se rellenan de forma progresiva: un campo que se está generando sigue vacío mientras se renderiza su propia plantilla.
| Ruta | Tipo | Disponibilidad | Descripción | Ejemplo |
|---|---|---|---|---|
post.post_type | cadena | Siempre | Tipo de publicación | link |
post.message | cadena | Si está escrito | Mensaje actual | Three ways to save energy. |
post.title | cadena | Si está escrito | Título actual | Budget 2027 |
post.description | cadena | Si está escrito | Descripción actual | What changes for households. |
post.author | cadena | Si se conoce | Autor del contenido de la publicación (un solo texto, no una lista) | Camille Martin |
post.tag | lista | Si se conoce | Etiquetas de la publicación | ['budget'] |
post.language | cadena | Si se conoce | Código de idioma | fr |
post.target_url | cadena | Publicaciones con enlace | URL de destino | https://www.example.com/politics/budget |
post.short_id | cadena | Una vez acortado | Identificador del enlace corto | aB3xY |
post.social_account.type | cadena | Siempre | Red de destino | linkedin |
post.social_account.name | cadena | Siempre | Nombre de la cuenta | Example News |
post.social_account.slug | cadena | Siempre | Slug de la cuenta | example-news |
post.social_account.external_id | cadena | Siempre | Identificador de la cuenta en la red | 1000000001 |
post.source.type | cadena | Si se conoce | Origen de la publicación (bot, manual, etc.) | bot |
post.source.bot_title | cadena | Publicaciones de bot | Nombre del bot que creó la publicación | Politics bot |
post.source.organic_url | cadena | Publicaciones de artículo | URL del artículo de origen | https://www.example.com/politics/budget |
post.breaking_news.active | booleano | Siempre | Modo de última hora | false |
post.schedule.start_date | fecha | Publicaciones programadas | Fecha prevista de publicación (UTC) | 2026-10-19T06:00:00.000Z |
post.published_at | fecha | Tras la publicación | Fecha de publicación (UTC) | 2026-10-19T06:00:04.000Z |
post.comment.message | cadena | Si está escrito | Texto del primer comentario | Read more: [SHORTLINK] |
post.counter.* | número | Consulta los contadores | Rendimiento de la publicación | 42 |
Los identificadores internos y los campos técnicos (ID de usuario, de empresa y de marca, correo de la cuenta, URL de webhook, estados, trazas de error, contadores en bruto) se excluyen deliberadamente: no son una interfaz pública estable y no deben aparecer en textos publicados. post.user_id solo está documentado para los parámetros de URL.
6. Contadores y percentiles#
Un contador solo se carga cuando la plantilla lo nombra de forma explícita, por ejemplo post.counter.click. Falta cuando la métrica todavía no existe, lo que ocurre siempre en una publicación que aún no se ha publicado. Escribe siempre una alternativa: {{ post.counter.click ?? 0 }}.
| Ruta | Tipo | Descripción |
|---|---|---|
post.counter.click | número | Clics |
post.counter.engagement | número | Interacción |
post.counter.reach | número | Alcance |
post.counter.videoViews | número | Reproducciones de vídeo |
post.counter.ctr | número | Tasa de clics |
post.counter.overperforming | número | Puntuación de rendimiento superior |
post.counter.monetization | número | Ingresos por monetización del contenido |
organic.counter.view | número | Visitas al artículo (solo cuando la publicación tiene un artículo) |
Una variable de percentil compara una publicación con las publicadas por la misma cuenta durante un periodo, excluidas las de última hora. Su nombre es percentile + percentil (1 o 2 dígitos) + métrica + duración (1 o 2 dígitos) + unidad:
- métricas:
Click,Engagement,Reach,VideoViews,Ctr,Overperforming,Monetization; - unidades:
hhora,ddía,wsemana,mmes,yaño.
percentile50Click1d es la mediana de clics en 1 día; percentile90Engagement7d, el percentil 90 de interacción en 7 días. El valor es null si no hay datos y se almacena en caché durante 30 minutos.
1{%- if (post.counter.engagement ?? 0) > (percentile50Engagement7d ?? 0) -%}TOP{%- else -%}NORMAL{%- endif -%}7. Funciones#
| Función | Devuelve | Descripción |
|---|---|---|
hasLink() | booleano | true cuando la publicación incluye un enlace. Compruébalo antes de escribir [SHORTLINK]. |
hasFirstCommentShortlink() | booleano | true cuando el primer comentario ya contiene [SHORTLINK]. |
canPublishPostWithoutSpam() | booleano | true cuando las reglas antispam de la cuenta permiten ahora otra publicación con enlace. |
canPublishCommentWithoutSpam() | booleano | La misma comprobación para un comentario que contiene un enlace. |
shouldAddComment(metric) | booleano | Aplica la regla de muestreo de comentarios configurada; la métrica opcional indica el contador que se usa. El resultado puede variar. |
aiGenerated(source, min, target, max, ending, justCrop) | cadena | Resume source, o lo recorta en un límite de palabra cuando justCrop es true. |
gpt(prompt, model), claude(…), gemini(…), mistral(…) | cadena | Generan texto con la credencial del proveedor de la marca. Consulta Generación de mensajes con IA. |
airtable(…) | cadena | Lee un valor de una base de Airtable conectada. Solo devuelve texto. |
aiGenerated() solo resuelve nombres de nivel superior indicados como texto. Pasa 'description' o el propio valor (organic.title), nunca el texto 'organic.title', que se devuelve literalmente. Un nombre que no existe también se devuelve literalmente: en una publicación sin artículo, aiGenerated('description', …) devuelve la palabra description. Protégelo con una condición:
1{%- if organic -%}2{{- aiGenerated('description', null, null, 40, '…', true) -}}3{%- endif -%}8. Filtros#
Los filtros y operadores estándar de Twig (default, first, join, length, trim, replace, date, map, in, ??, ?:, ~) están documentados en la documentación de Twig. Nonli añade o sustituye los filtros siguientes. Todos los resultados que se muestran a continuación proceden del renderizador de Nonli.
| Filtro | Efecto | Ejemplo | Resultado |
|---|---|---|---|
upper | Mayúsculas, conserva los acentos | 'élan VITAL'|upper | ÉLAN VITAL |
lower | Minúsculas | 'élan VITAL'|lower | élan vital |
capitalize | Primera letra en mayúscula, el resto sin cambios | 'élan VITAL'|capitalize | Élan VITAL |
slugify | Slug de URL | 'Budget 2027 : ménages'|slugify | budget-2027-menages |
camel | Palabras unidas, cada una con mayúscula inicial | 'budget des ménages'|camel | BudgetDesMénages |
clean | Contrae y recorta los espacios, y elimina los espacios alrededor de un guion | ' Paris - Lyon '|clean | Paris-Lyon |
ucPhrase | Mayúscula inicial en cada palabra, las palabras cortas se mantienen en minúscula | 'le budget des ménages'|ucPhrase | Le Budget des Ménages |
encode | Codifica para URL, pero conserva caracteres reservados como &, =, /, ?, # | 'a b&c'|encode | a+b&c |
extractMatch(regex) | Primer grupo de captura, o null | 'Price: 10 €'|extractMatch('/([[:digit:]]+)/u') | 10 |
pregReplace(regex, replacement) | Sustitución mediante expresión regular | 'Budget 2027'|pregReplace('/[[:digit:]]+/', 'N') | Budget N |
cleanText | Limpieza tipográfica: recorta y añade espacios de no separación franceses | 'Lire aussi : le budget. '|cleanText | Lire aussi : le budget. (espacio de no separación antes de los dos puntos) |
Reglas para evitar errores de renderizado:
extractMatchypregReplacefallan cuando el valor esnull. Añade|default('')antes de ellos:{{ meta_custom_publisher|default('')|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') }}.encodeno protege&,=ni#: no lo uses para construir un parámetro a partir de un valor que pueda contenerlos.- Prefiere las clases POSIX como
[[:digit:]],[[:space:]]y[[:alpha:]]a las secuencias con barra invertida: sobreviven al copiar y pegar. Copia las plantillas desde un bloque de código, nunca desde una línea renderizada de un chat o de un correo, que puede perder las barras invertidas.
9. Recetas probadas#
Todas las recetas siguientes se han renderizado con el motor Twig de Nonli sobre artículos de prueba completos, parciales y vacíos.
Titular (H1 o título) seguido de la metadescripción, con un enlace corto solo donde hace falta. En una publicación de enlace de Facebook devuelve el titular y la descripción; en una foto de Facebook añade ➡️ [SHORTLINK]; en Instagram nunca añade un enlace; sin artículo devuelve un texto vacío.
1{%- set titre = title1 ?: title -%}2{%- set desc = meta_description ?: description -%}3{{- titre -}}4{%- if desc -%}{{- '\n\n' ~ desc -}}{%- endif -%}5{%- if post_type != 'link' and social_network not in ['instagram', 'tiktok', 'pinterest'] and not hasFirstCommentShortlink() and hasLink() -%}6{{- '\n\n' ~ shortlink_prefix -}}[SHORTLINK]7{%- endif -%}Primera frase de la descripción, luego la descripción y después el título.
1{%- set source = meta_description ?: description ?: '' -%}2{{- source|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') ?: source ?: title -}}Primera frase del campo personalizado del medio, con el texto alternativo de la imagen como alternativa y, después, el título.
1{{- meta_custom_publisher|default('')|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') ?: organic.image_alt|default('') ?: title -}}Texto según la red y el tipo de publicación.
1{%- if social_network == 'instagram' -%}2{{- title -}}3{%- elseif post_type == 'link' -%}4{{- description ?: title -}}5{%- else -%}6{{- title -}}7{%- endif -%}Color de Smart Image según la categoría. Devuelve #E50032 para política, #16A34A para deporte y #6F819D en los demás casos.
1{%- set categories = organic.category ?? [] -%}2{%- if 'politique' in categories -%}#E500323{%- elseif 'sport' in categories -%}#16A34A4{%- else -%}#6F819D5{%- endif -%}Valores de seguimiento a partir de la cuenta de destino.
1utm_source={{ post.social_account.type|default('social') }}&utm_campaign={{ post.social_account.slug|default('')|encode }}Fecha de publicación en la zona horaria de la redacción. 2026-10-18T07:30:00.000Z pasa a ser 18/10/2026 09:30. Sin fecha de publicación, date imprimiría la fecha actual, por lo que la condición deja el texto vacío en su lugar.
1{%- if organic.published_at|default(null) -%}2{{- organic.published_at|date('d/m/Y H:i', 'Europe/Paris') -}}3{%- endif -%}Hashtags a partir de las etiquetas. ['budget', 'impots'] pasa a ser #Budget #Impots.
1{{ tags|default([])|map(t => '#' ~ t|camel)|join(' ') }}Mantener las palabras cortas y los números junto a la palabra siguiente (para los títulos de Smart Image, que nunca rompen una línea en un espacio de no separación). La finale se jouera à guichets fermés mantiene La, se y à unidos a la palabra siguiente, y 16 septembre o 3 000 euros permanecen juntos. El cambio solo se aplica a las imágenes que se generen a partir de ahora.
1{%- set titre = organic.title ?? title -%}2{{- titre|pregReplace("/(?<=^|[[:space:]])([[:alpha:]]{1,2}|[[:digit:]]+)[[:space:]]+/u", "$1\xC2\xA0") -}}Twig convierte \xC2\xA0 en un espacio de no separación; $1 conserva la palabra corta o el número que ha coincidido.
10. Campos inteligentes automáticos y al pulsar el botón#
Cada marca tiene dos ajustes: Configuración automática de los campos inteligentes y Configuración de los campos inteligentes al pulsar el botón. El botón del editor usa la configuración al pulsar y recurre a la automática solo cuando no existe ninguna configuración al pulsar. Un campo definido con la plantilla pública Vacío se borra al pulsar el botón, porque el editor escribe el valor generado de vuelta en el campo.
Los bots no usan estos ajustes de la marca. Cada bot tiene sus propios orígenes, como Origen del mensaje y Origen de la descripción, que apuntan a un valor integrado (Título, Descripción, etc.) o a una plantilla de Smart Message.
11. Solución de problemas#
11.1. Mi bot consulta su fuente pero no crea ninguna publicación#
Un bot activo puede encontrar el artículo y aun así no crear ninguna publicación cuando su Smart Message genera un mensaje vacío. Esto ocurre, por ejemplo, cuando la plantilla lee un campo opcional como meta_custom_publisher y el artículo no lo tiene. Nonli filtra entonces el candidato antes de cualquier publicación: se descarta un mensaje vacío, o de cinco caracteres o menos una vez quitado el enlace corto, y también una publicación de enlace con un título vacío. La comprobación del mensaje vacío no se aplica a los bots configurados con Sin mensaje ni a Pinterest; la comprobación del título vacío se aplica a todos los bots.
Esto es distinto de una publicación que se creó y después falló en la red: esa publicación es visible en Publicaciones con un estado de error. Consulta ¿Por qué mi bot no publicó este artículo? para localizar primero la etapa.
-
Compara. Identifica el bot exacto. Compara algunos mensajes que generó correctamente antes con los metadatos de los artículos correspondientes y comprueba qué ha cambiado en su configuración. El nombre de una plantilla o el HTML actual de la página, por sí solos, no demuestran lo que funcionaba antes. Renderiza la plantilla actual en un artículo representativo que cumpla los requisitos y comprueba si la variable falta o está presente pero vacía.
-
Corrige. Prefiere restaurar el origen del mensaje anterior cuando daba el texto deseado, o añade una alternativa adecuada al tipo de variable:
twig1{{- meta_custom_publisher ?: title -}}Si el título del artículo coincide con el texto deseado, abre el bot, define Origen del mensaje como Título y haz clic en Guardar. Esto cambia el texto generado.

Extracto de los ajustes del bot: Origen del mensaje definido como Título, antes de hacer clic en Guardar.
-
Alcance. Cambiar el origen del bot solo afecta a las futuras publicaciones de ese bot. Editar una plantilla de Smart Message compartida afecta a todos los bots y campos que la usan. Las publicaciones existentes nunca se reescriben.
-
Comprueba. Espera a la siguiente consulta normal y fíjate en los artículos que siguen cumpliendo los requisitos. Los artículos más antiguos no se recuperan automáticamente, y una publicación manual no demuestra que el bot se haya recuperado.
11.2. El rótulo corto, la entradilla y la primera frase son valores distintos#
Un rótulo editorial corto (a veces llamado antetítulo), la entradilla completa y la primera frase de un texto son tres cosas diferentes. Nonli no tiene ninguna variable específica para el rótulo corto: una regla específica del sitio puede almacenarlo en un campo meta_custom_*, y algunos artículos legítimamente no tienen ninguno. No sustituyas un rótulo ausente por toda la entradilla. Muestra el rótulo solo cuando exista:
1{%- set marker = meta_custom_instagram|default('')|trim -%}2{%- if marker -%}{{- marker ~ ' | ' -}}{%- endif -%}3{{- title -}}Con rótulo, el resultado es EXCLUSIVE | Budget 2027: what changes; sin él, solo el título. Aquí meta_custom_instagram es solo un ejemplo: usa el campo que rellene realmente la regla de tu sitio.
meta_description (metadescripción nativa), meta_custom_publisher (campo personalizado) y description (descripción elegida por Nonli) son entradas independientes. Una plantilla que lee una de ellas no se ve afectada cuando se corrige otra. Actualizar un campo recopilado no cambia el origen seleccionado del bot, el texto de Smart Image ni las publicaciones ya generadas.
11.3. Descripción recopilada completa o primera frase de la entradilla#
A menudo se confunden cuatro valores cuando un bot compone su mensaje:
- Descripción recopilada (
description,organic.description): la descripción del artículo que Nonli ha recopilado, usada tal cual, sin dividirla en frases. Nonli la toma primero de los datos estructurados del artículo y, si no, de su Open Graph, después de Twitter Card y por último de la metadescripción nativa. Cuando procede de estas etiquetas, conserva su corte de 500 caracteres. La descripción del elemento RSS (meta_custom_rss_description) nunca se usa como descripción recopilada. - Metadatos nativos (
meta_description,og_description,twitter_description): las descripciones declaradas en las etiquetas meta de la página. Nonli corta cada una de ellas a 500 caracteres cuando las recopila. Este límite es específico de estos tres campos: una descripción recopilada a partir de datos estructurados no se corta. - Primera frase: una plantilla como
Template: [public] Message from first standfirst sentenceconserva deliberadamente una sola frase y gestiona el enlace mediante su propio marcador[SHORTLINK]. - Rótulo corto: un campo opcional descrito en la sección anterior, que algunos artículos no tienen.
Ni el nombre de una plantilla ni el origen seleccionado demuestran que la descripción recopilada sea tu entradilla completa. Para publicar la descripción recopilada completa en lugar de su primera frase:
- Comprueba lo que se recopiló. En algunos artículos representativos, compara
descriptioncon la entradilla completa que esperas. Si falta, está cortada o contiene texto del cuerpo en lugar de la entradilla, pide primero al soporte que corrija y verifique la recopilación. Cambiar el origen del bot no puede recuperar un texto que no se recopiló. - Cambia el origen. Abre el bot, define Origen del mensaje como Descripción y haz clic en Guardar. No lo confundas con Origen de la descripción, que rellena el campo de descripción de la publicación, no su texto.
- Comprueba el siguiente mensaje. Fíjate en la siguiente publicación que genere el bot: el texto completo, dónde aparece el enlace y el límite de texto de cada red de destino. Una descripción completa puede ser larga, y elegirla no garantiza que todas las redes acepten el texto entero. Nonli sigue gestionando el enlace corto: en una publicación sin enlace nativo, lo añade justo después del texto generado, antes de cualquier sufijo del bot y de los hashtags, salvo que el primer comentario ya lo incluya. Las publicaciones de enlace y de compartir no reciben ningún enlace corto añadido, salvo las publicaciones de enlace en X y Mastodon, donde se añade al final del todo. Los mensajes de Instagram y TikTok no reciben ningún enlace corto. Una plantilla de primera frase puede acortar el texto o colocar el enlace de forma distinta según la red, así que no esperes el mismo resultado.
- Alcance. El cambio se aplica solo a las publicaciones que este bot genere a partir de ahora. Las publicaciones existentes, los demás bots y las plantillas de Smart Message compartidas no cambian, y no se importa ni se vuelve a publicar ningún artículo anterior.
11.4. Los apóstrofos rompen mi plantilla#
En una cadena Twig entre comillas simples, un apóstrofo termina la cadena. Esta plantilla se rechaza al guardarla, con un error como «Invalid template syntax at line 1»:
1{{ gpt('Summarize the article's main point') }}Escapa el apóstrofo, usa un apóstrofo tipográfico o usa comillas dobles:
1{{ gpt('Summarize the article\'s main point') }}2{{ gpt('Summarize the article’s main point') }}3{{ gpt("Summarize the article's main point") }}El número de línea indicado es el de la línea de la plantilla que contiene el error.
11.5. Una variable sigue vacía#
- Comprueba la ortografía exacta:
organic.category, nocategories;tags, notag. - Comprueba que la publicación tiene un artículo:
organicestá vacío en las publicaciones manuales y sin enlace, y los alias quedan entonces sin definir. - Imprime una lista con
|join(', ')o pruébala conin. - Compara las categorías con su forma normalizada (
politique societe, noPolitique & Société). - Comprueba los contadores con
?? 0: faltan antes de la publicación.
11.6. ¿Puede una plantilla añadir colaboradores de Instagram?#
No. Las plantillas solo rellenan campos de texto, y airtable() devuelve texto: puede escribir una @mención, pero no crear una colaboración. Añade los colaboradores en el editor de publicaciones con Colaboradores, o con el campo de la API collaborator[] (slug, type) de POST o PUT /v2.1/posts/bulk. Meta admite hasta 3 colaboradores; consulta Cómo hacer una colaboración de Instagram con Nonli.