¿Qué variables Twig están disponibles en Nonli?

También disponible en:EnglishFrançais

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 context es 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.title o post.social_account.type en 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 son tags y authors. Un nombre incorrecto como categories, organic.categories, tag o author no 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 |first o |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, como 2026-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 organic ausente 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ónValor ausenteValor ''Valor 'A'
{{ x ?? 'B' }}B(vacío)A
{{ x ?: 'B' }}BBA
{{ x|default('B') }}BBA

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.

RutaTipoDisponibilidadDescripciónEjemplo
social_networkcadenaSiempreRed de la cuenta de destino; facebook si se desconoce.instagram
post_typecadenaSiempreTipo de publicación; link si se desconoce.photo
empty_messagecadenaSiempreUna cadena vacía, para no devolver deliberadamente nada.''
shortlink_prefixcadenaSiempreEl texto de la marca que se coloca antes de un enlace corto.➡️
postobjetoSiempreLa publicación que se está creando o editando (consulta post.*).
organicobjetoSiempreEl artículo de origen (consulta organic.*); una lista vacía [] cuando la publicación no tiene artículo.
contextcadenaSiempreCampo 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.

AliasRuta completa preferidaTipoContenido
titleorganic.titlecadenaTítulo del artículo elegido por Nonli
descriptionorganic.descriptioncadenaDescripción del artículo elegida por Nonli
title1organic.html.h1cadenaPrimer encabezado H1 de la página
title2organic.html.h2cadenaPrimer encabezado H2 de la página
head_titleorganic.head.titlecadenaEtiqueta HTML title, a menudo un título SEO más largo
meta_descriptionorganic.meta.descriptioncadenaMetadescripción nativa de la página
og_titleorganic.meta.open_graph.titlecadenaTítulo Open Graph
og_descriptionorganic.meta.open_graph.descriptioncadenaDescripción Open Graph
twitter_titleorganic.meta.twitter.titlecadenaTítulo de Twitter Card
twitter_descriptionorganic.meta.twitter.descriptioncadenaDescripción de Twitter Card
meta_custom_facebook, meta_custom_twitter, meta_custom_instagram, meta_custom_linkedin, meta_custom_tiktok, meta_custom_pinterestorganic.meta.custom.facebook (y así sucesivamente)cadenaMetadatos personalizados por red, extraídos mediante una regla específica del sitio
meta_custom_publisherorganic.meta.custom.publishercadenaCampo personalizado del medio, extraído mediante una regla específica del sitio, por ejemplo el primer párrafo del cuerpo
meta_custom_rss_titleorganic.meta.custom.rss.titlecadenaTítulo del elemento RSS
meta_custom_rss_descriptionorganic.meta.custom.rss.descriptioncadenaDescripción del elemento RSS
authorsorganic.authorlistaAutores del artículo
tagsorganic.taglistaEtiquetas 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.

RutaTipoDisponibilidadDescripciónEjemplo
organic.urlcadenaTodos los artículosURL del artículohttps://www.example.com/politics/budget
organic.canonical_urlcadenaSi está declaradaURL canónicahttps://www.example.com/politics/budget
organic.typecadenaTodos los artículosTipo de contenido detectadoarticle
organic.languagecadenaSi se detectaCódigo de idiomafr
organic.titlecadenaLa mayoría de los artículosTítulo elegido por NonliBudget 2027: what changes
organic.descriptioncadenaSi se encuentraDescripción elegida por NonliThe government presents its budget.
organic.html.h1 / organic.html.h2cadenaSi existePrimer encabezado H1 / H2Key measures
organic.head.titlecadenaSi existeEtiqueta HTML titleBudget 2027 - Example News
organic.meta.descriptioncadenaSi existeMetadescripción nativaThe government presents its budget.
organic.meta.open_graph.title / .descriptioncadenaSi existeTítulo / descripción Open GraphBudget 2027
organic.meta.open_graph.article.sectioncadenaSi existearticle:section de Open GraphPolitics
organic.meta.twitter.title / .descriptioncadenaSi existeTítulo / descripción de Twitter CardBudget 2027
organic.meta.custom.*cadenaRegla específica del sitioCampos personalizados enumerados en la tabla de alias
organic.categorylistaSi se encuentraCategorías normalizadas, incluido el articleSection de JSON-LD['politics', 'economy']
organic.taglistaSi se encuentraEtiquetas del artículo['budget', 'taxes']
organic.authorlistaSi se encuentraAutores del artículo['Camille Martin']
organic.imagelistaSi se encuentraURL de las imágenes encontradas en la página['https://…/budget.jpg']
organic.image_altcadenaSi se encuentraTexto alternativo de la imagen principalThe National Assembly chamber
organic.published_atfechaSi se encuentraFecha de publicación (UTC)2026-10-18T07:30:00.000Z
organic.modified_atfechaSi se encuentraFecha de la última modificación (UTC)2026-10-18T09:00:00.000Z
organic.counter.viewnúmeroConsulta los contadoresVisitas al artículo medidas por Nonli1520

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.

twig
1{%- set categories = organic.category ?? [] -%}
2{%- if 'politique' in categories -%}
3Politics
4{%- 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.

RutaTipoDisponibilidadDescripciónEjemplo
post.post_typecadenaSiempreTipo de publicaciónlink
post.messagecadenaSi está escritoMensaje actualThree ways to save energy.
post.titlecadenaSi está escritoTítulo actualBudget 2027
post.descriptioncadenaSi está escritoDescripción actualWhat changes for households.
post.authorcadenaSi se conoceAutor del contenido de la publicación (un solo texto, no una lista)Camille Martin
post.taglistaSi se conoceEtiquetas de la publicación['budget']
post.languagecadenaSi se conoceCódigo de idiomafr
post.target_urlcadenaPublicaciones con enlaceURL de destinohttps://www.example.com/politics/budget
post.short_idcadenaUna vez acortadoIdentificador del enlace cortoaB3xY
post.social_account.typecadenaSiempreRed de destinolinkedin
post.social_account.namecadenaSiempreNombre de la cuentaExample News
post.social_account.slugcadenaSiempreSlug de la cuentaexample-news
post.social_account.external_idcadenaSiempreIdentificador de la cuenta en la red1000000001
post.source.typecadenaSi se conoceOrigen de la publicación (bot, manual, etc.)bot
post.source.bot_titlecadenaPublicaciones de botNombre del bot que creó la publicaciónPolitics bot
post.source.organic_urlcadenaPublicaciones de artículoURL del artículo de origenhttps://www.example.com/politics/budget
post.breaking_news.activebooleanoSiempreModo de última horafalse
post.schedule.start_datefechaPublicaciones programadasFecha prevista de publicación (UTC)2026-10-19T06:00:00.000Z
post.published_atfechaTras la publicaciónFecha de publicación (UTC)2026-10-19T06:00:04.000Z
post.comment.messagecadenaSi está escritoTexto del primer comentarioRead more: [SHORTLINK]
post.counter.*númeroConsulta los contadoresRendimiento de la publicación42

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 }}.

RutaTipoDescripción
post.counter.clicknúmeroClics
post.counter.engagementnúmeroInteracción
post.counter.reachnúmeroAlcance
post.counter.videoViewsnúmeroReproducciones de vídeo
post.counter.ctrnúmeroTasa de clics
post.counter.overperformingnúmeroPuntuación de rendimiento superior
post.counter.monetizationnúmeroIngresos por monetización del contenido
organic.counter.viewnúmeroVisitas 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: h hora, d día, w semana, m mes, y añ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.

twig
1{%- if (post.counter.engagement ?? 0) > (percentile50Engagement7d ?? 0) -%}TOP{%- else -%}NORMAL{%- endif -%}

7. Funciones#

FunciónDevuelveDescripción
hasLink()booleanotrue cuando la publicación incluye un enlace. Compruébalo antes de escribir [SHORTLINK].
hasFirstCommentShortlink()booleanotrue cuando el primer comentario ya contiene [SHORTLINK].
canPublishPostWithoutSpam()booleanotrue cuando las reglas antispam de la cuenta permiten ahora otra publicación con enlace.
canPublishCommentWithoutSpam()booleanoLa misma comprobación para un comentario que contiene un enlace.
shouldAddComment(metric)booleanoAplica 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)cadenaResume source, o lo recorta en un límite de palabra cuando justCrop es true.
gpt(prompt, model), claude(…), gemini(…), mistral(…)cadenaGeneran texto con la credencial del proveedor de la marca. Consulta Generación de mensajes con IA.
airtable(…)cadenaLee 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:

twig
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.

FiltroEfectoEjemploResultado
upperMayúsculas, conserva los acentos'élan VITAL'|upperÉLAN VITAL
lowerMinúsculas'élan VITAL'|lowerélan vital
capitalizePrimera letra en mayúscula, el resto sin cambios'élan VITAL'|capitalizeÉlan VITAL
slugifySlug de URL'Budget 2027 : ménages'|slugifybudget-2027-menages
camelPalabras unidas, cada una con mayúscula inicial'budget des ménages'|camelBudgetDesMénages
cleanContrae y recorta los espacios, y elimina los espacios alrededor de un guion' Paris - Lyon '|cleanParis-Lyon
ucPhraseMayúscula inicial en cada palabra, las palabras cortas se mantienen en minúscula'le budget des ménages'|ucPhraseLe Budget des Ménages
encodeCodifica para URL, pero conserva caracteres reservados como &, =, /, ?, #'a b&c'|encodea+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
cleanTextLimpieza tipográfica: recorta y añade espacios de no separación franceses'Lire aussi : le budget. '|cleanTextLire aussi : le budget. (espacio de no separación antes de los dos puntos)

Reglas para evitar errores de renderizado:

  • extractMatch y pregReplace fallan cuando el valor es null. Añade |default('') antes de ellos: {{ meta_custom_publisher|default('')|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') }}.
  • encode no 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.

twig
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.

twig
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.

twig
1{{- meta_custom_publisher|default('')|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') ?: organic.image_alt|default('') ?: title -}}

Texto según la red y el tipo de publicación.

twig
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.

twig
1{%- set categories = organic.category ?? [] -%}
2{%- if 'politique' in categories -%}#E50032
3{%- elseif 'sport' in categories -%}#16A34A
4{%- else -%}#6F819D
5{%- endif -%}

Valores de seguimiento a partir de la cuenta de destino.

twig
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.

twig
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.

twig
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.

twig
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.

  1. 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.

  2. Corrige. Prefiere restaurar el origen del mensaje anterior cuando daba el texto deseado, o añade una alternativa adecuada al tipo de variable:

    twig
    1{{- 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.

    Ajustes de un bot de Nonli con Message's source definido como Title, junto a los botones Cancel y Save

    Extracto de los ajustes del bot: Origen del mensaje definido como Título, antes de hacer clic en Guardar.

  3. 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.

  4. 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:

twig
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 sentence conserva 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:

  1. Comprueba lo que se recopiló. En algunos artículos representativos, compara description con 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ó.
  2. 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.
  3. 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.
  4. 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»:

twig
1{{ gpt('Summarize the article's main point') }}

Escapa el apóstrofo, usa un apóstrofo tipográfico o usa comillas dobles:

twig
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, no categories; tags, no tag.
  • Comprueba que la publicación tiene un artículo: organic está vacío en las publicaciones manuales y sin enlace, y los alias quedan entonces sin definir.
  • Imprime una lista con |join(', ') o pruébala con in.
  • Compara las categorías con su forma normalizada (politique societe, no Politique & 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.

¿Te fue útil este artículo?

Reserva una demo personalizada con nuestro equipo.