I template Smart Message sono scritti in Twig 3. Questa pagina elenca tutte le variabili, funzioni e filtri che Nonli supporta in questo contesto, con il relativo tipo, i casi in cui possono mancare e un esempio testato. Per creare un template passo dopo passo, parti da Come creare uno Smart Message.
1. Dove si applica questo contesto#
Lo stesso contesto è disponibile in due punti:
- Template Smart Message, usati dai bot, dal pulsante a forma di lampadina dell'editor dei post e dal pulsante del primo commento. Possono compilare messaggio, titolo, descrizione, commento, titolo del video, testo alternativo e titolo dell'ancora TikTok.
- Valori dinamici di Smart Image, quando un testo o un colore di Smart Image usa un template Smart Message come sorgente. In questo caso la variabile
contextè uguale a'smart_image'. Vedi Come usare i colori dinamici in Smart Image.
Anche i parametri URL dinamici e il paywall dinamico usano Twig, ma con un contesto molto più ridotto: un post limitato (source, social_account, post_type, author, user_id, breaking_news, short_id), referer, la funzione isComment(), e contatori e percentili. organic, gli alias di primo livello e le funzioni Smart Message riportate di seguito non esistono in quel contesto.
2. Regole su nomi e tipi#
- Preferisci i percorsi completi. Scrivi
organic.titleopost.social_account.typeanziché un alias di primo livello. Gli alias restano supportati per i template esistenti. - I nomi sono in snake_case e seguono i nomi dei campi memorizzati:
canonical_url,published_at,open_graph. - Rispetta singolare e plurale. I percorsi sono
organic.category,organic.tag,organic.author; gli alias sonotagseauthors. Un nome errato comecategories,organic.categories,tagoauthornon genera un errore: produce un valore vuoto. - Tipi. Una string è un testo. Una list è una sequenza di valori: verificala con
in, leggila con|firsto|join(', '), non stamparla mai direttamente. Un object raggruppa altri percorsi. Seguono numeri, booleani e date. Le date sono stringhe ISO 8601 in UTC come2026-10-18T07:30:00.000Z; formattale con|date. - Assenza. Un valore esiste solo se la sorgente lo fornisce. Dipende dall'origine del post (articolo, post manuale, post senza link), dal social network, dal tipo di post e dai metadati che lo scraper ha trovato nella pagina. Un percorso
organicmancante restituisce un valore vuoto; una lista vuota è considerata mancante.
Usa ?? per sostituire un valore mancante o null, e ?: o |default() per sostituire anche una stringa vuota:
| Espressione | Valore mancante | Valore '' | Valore 'A' |
|---|---|---|---|
{{ x ?? 'B' }} | B | (vuoto) | A |
{{ x ?: 'B' }} | B | B | A |
{{ x|default('B') }} | B | B | A |
Dopo un filtro usa ?: o |default(), mai ??: {{ x|upper ?? 'B' }} è un errore di sintassi e il template viene rifiutato quando lo salvi.
3. Variabili di primo livello#
Queste variabili sono sempre definite in uno Smart Message.
| Percorso | Tipo | Disponibilità | Descrizione | Esempio |
|---|---|---|---|---|
social_network | string | Sempre | Rete dell'account di destinazione; facebook quando è sconosciuta. | instagram |
post_type | string | Sempre | Tipo di post; link quando è sconosciuto. | photo |
empty_message | string | Sempre | Una stringa vuota, per non restituire deliberatamente nulla. | '' |
shortlink_prefix | string | Sempre | Il testo del brand inserito prima di un link breve. | ➡️ |
post | object | Sempre | Il post in fase di creazione o modifica (vedi post.*). | |
organic | object | Sempre | L'articolo sorgente (vedi organic.*); una lista vuota [] quando il post non ha un articolo. | |
context | string | Sempre | Campo in corso di generazione: message, title, description, comment, videoTitle, altText, tikTokAnchorTitle, oppure smart_image quando Smart Image elabora il template. | message |
3.1. Alias legacy#
Quando il post proviene da un articolo, Nonli copia anche alcuni campi dell'articolo al primo livello. Questi alias sono definiti (eventualmente null) non appena esiste un articolo e non definiti quando il post non ne ha. Ognuno ha un percorso completo preferito.
| Alias | Percorso completo preferito | Tipo | Contenuto |
|---|---|---|---|
title | organic.title | string | Titolo dell'articolo scelto da Nonli |
description | organic.description | string | Descrizione dell'articolo scelta da Nonli |
title1 | organic.html.h1 | string | Primo titolo H1 della pagina |
title2 | organic.html.h2 | string | Primo titolo H2 della pagina |
head_title | organic.head.title | string | Tag HTML title, spesso un titolo SEO più lungo |
meta_description | organic.meta.description | string | Meta description nativa della pagina |
og_title | organic.meta.open_graph.title | string | Titolo Open Graph |
og_description | organic.meta.open_graph.description | string | Descrizione Open Graph |
twitter_title | organic.meta.twitter.title | string | Titolo Twitter Card |
twitter_description | organic.meta.twitter.description | string | Descrizione Twitter Card |
meta_custom_facebook, meta_custom_twitter, meta_custom_instagram, meta_custom_linkedin, meta_custom_tiktok, meta_custom_pinterest | organic.meta.custom.facebook (e così via) | string | Metadati personalizzati per rete, estratti da una regola specifica del sito |
meta_custom_publisher | organic.meta.custom.publisher | string | Campo publisher personalizzato estratto da una regola specifica del sito, ad esempio il primo paragrafo del testo |
meta_custom_rss_title | organic.meta.custom.rss.title | string | Titolo dell'elemento RSS |
meta_custom_rss_description | organic.meta.custom.rss.description | string | Descrizione dell'elemento RSS |
authors | organic.author | list | Autori dell'articolo |
tags | organic.tag | list | Tag dell'articolo |
In un articolo reale, title e title1 contengono spesso lo stesso titolo, head_title contiene il titolo SEO più lungo e meta_description inizia spesso con il sommario. Ognuno di essi può essere vuoto, quindi prevedi sempre un'alternativa.
Le scelte «Meta custom …» dell'editor e delle sorgenti dei bot corrispondono a questi alias meta_custom_*. Vengono compilate solo sui siti per cui Nonli ha configurato una regola di estrazione dedicata. Un articolo di un sito esterno alla tua azienda espone solo i suoi campi pubblici, quindi organic.counter.view non è disponibile.
4. [object Object],: l'articolo sorgente#
organic esiste quando il post proviene da un articolo (bot, URL incollato nell'editor, SDK, RSS). Un post manuale o un post senza link non ha un articolo: organic è allora una lista vuota e ogni percorso organic.* è vuoto.
| Percorso | Tipo | Disponibilità | Descrizione | Esempio |
|---|---|---|---|---|
organic.url | string | Ogni articolo | URL dell'articolo | https://www.example.com/politics/budget |
organic.canonical_url | string | Se dichiarato | URL canonico | https://www.example.com/politics/budget |
organic.type | string | Ogni articolo | Tipo di contenuto rilevato | article |
organic.language | string | Se rilevata | Codice della lingua | fr |
organic.title | string | La maggior parte degli articoli | Titolo scelto da Nonli | Budget 2027: what changes |
organic.description | string | Se trovata | Descrizione scelta da Nonli | The government presents its budget. |
organic.html.h1 / organic.html.h2 | string | Se presente | Primo titolo H1 / H2 | Key measures |
organic.head.title | string | Se presente | Tag HTML title | Budget 2027 - Example News |
organic.meta.description | string | Se presente | Meta description nativa | The government presents its budget. |
organic.meta.open_graph.title / .description | string | Se presente | Titolo / descrizione Open Graph | Budget 2027 |
organic.meta.open_graph.article.section | string | Se presente | article:section di Open Graph | Politics |
organic.meta.twitter.title / .description | string | Se presente | Titolo / descrizione Twitter Card | Budget 2027 |
organic.meta.custom.* | string | Regola specifica del sito | Campi personalizzati elencati nella tabella degli alias | |
organic.category | list | Se trovata | Categorie normalizzate, incluso articleSection di JSON-LD | ['politics', 'economy'] |
organic.tag | list | Se trovato | Tag dell'articolo | ['budget', 'taxes'] |
organic.author | list | Se trovato | Autori dell'articolo | ['Camille Martin'] |
organic.image | list | Se trovata | URL delle immagini trovate nella pagina | ['https://…/budget.jpg'] |
organic.image_alt | string | Se trovato | Testo alternativo dell'immagine principale | The National Assembly chamber |
organic.published_at | date | Se trovata | Data di pubblicazione (UTC) | 2026-10-18T07:30:00.000Z |
organic.modified_at | date | Se trovata | Data dell'ultima modifica (UTC) | 2026-10-18T09:00:00.000Z |
organic.counter.view | number | Vedi i contatori | Visualizzazioni dell'articolo misurate da Nonli | 1520 |
4.1. Categorie e ,[object Object]#
Nonli memorizza il valore articleSection di JSON-LD, e gli altri segnali di categoria della pagina, in organic.category. È una lista, non un testo, e non esiste alcuna variabile categories. I valori sono normalizzati: minuscolo, accenti rimossi, punteggiatura trasformata in spazi. Ad esempio Politique & Société, Économie e Sports > Rugby diventano politique societe, economie e sports rugby. Confronta sempre con i valori effettivamente osservati sui tuoi articoli.
1{%- set categories = organic.category ?? [] -%}2{%- if 'politique' in categories -%}3Politics4{%- endif -%}Prima categoria, oppure nulla: {{ organic.category|default([])|first|default('') }}
Tutte le categorie: {{ organic.category|default([])|join(', ') }}
La sezione Open Graph originale, non normalizzata, resta disponibile come {{ organic.meta.open_graph.article.section ?? '' }}.
5. [object Object],: il post#
post descrive il post in fase di creazione o modifica. I campi vengono compilati progressivamente: un campo in corso di generazione è ancora vuoto mentre viene elaborato il suo template.
| Percorso | Tipo | Disponibilità | Descrizione | Esempio |
|---|---|---|---|---|
post.post_type | string | Sempre | Tipo di post | link |
post.message | string | Se scritto | Messaggio attuale | Three ways to save energy. |
post.title | string | Se scritto | Titolo attuale | Budget 2027 |
post.description | string | Se scritta | Descrizione attuale | What changes for households. |
post.author | string | Se noto | Autore del contenuto del post (un solo testo, non una lista) | Camille Martin |
post.tag | list | Se noti | Tag del post | ['budget'] |
post.language | string | Se nota | Codice della lingua | fr |
post.target_url | string | Post con link | URL di destinazione | https://www.example.com/politics/budget |
post.short_id | string | Dopo l'accorciamento | Identificativo del link breve | aB3xY |
post.social_account.type | string | Sempre | Rete di destinazione | linkedin |
post.social_account.name | string | Sempre | Nome dell'account | Example News |
post.social_account.slug | string | Sempre | Slug dell'account | example-news |
post.social_account.external_id | string | Sempre | Identificativo dell'account sulla rete | 1000000001 |
post.source.type | string | Se nota | Origine del post (bot, manuale e così via) | bot |
post.source.bot_title | string | Post da bot | Nome del bot che ha creato il post | Politics bot |
post.source.organic_url | string | Post da articolo | URL dell'articolo sorgente | https://www.example.com/politics/budget |
post.breaking_news.active | boolean | Sempre | Modalità breaking news | false |
post.schedule.start_date | date | Post pianificati | Data di pubblicazione prevista (UTC) | 2026-10-19T06:00:00.000Z |
post.published_at | date | Dopo la pubblicazione | Data di pubblicazione (UTC) | 2026-10-19T06:00:04.000Z |
post.comment.message | string | Se scritto | Testo del primo commento | Read more: [SHORTLINK] |
post.counter.* | number | Vedi i contatori | Performance del post | 42 |
Gli identificativi interni e i campi tecnici (ID di utente, azienda e brand, email dell'account, URL del webhook, stati, tracce di errore, contatori grezzi) sono volutamente esclusi: non sono un'interfaccia pubblica stabile e non devono comparire nei testi pubblicati. post.user_id è documentato solo per i parametri URL.
6. Contatori e percentili#
Un contatore viene caricato solo quando il template lo nomina esplicitamente, ad esempio post.counter.click. Non è disponibile quando la metrica non esiste ancora, cosa che accade sempre per un post non ancora pubblicato. Scrivi sempre un'alternativa: {{ post.counter.click ?? 0 }}.
| Percorso | Tipo | Descrizione |
|---|---|---|
post.counter.click | number | Clic |
post.counter.engagement | number | Engagement |
post.counter.reach | number | Copertura |
post.counter.videoViews | number | Visualizzazioni video |
post.counter.ctr | number | Percentuale di clic |
post.counter.overperforming | number | Punteggio di sovraperformance |
post.counter.monetization | number | Guadagni di monetizzazione dei contenuti |
organic.counter.view | number | Visualizzazioni dell'articolo (solo quando il post ha un articolo) |
Una variabile percentile confronta un post con i post pubblicati dallo stesso account in un periodo, esclusi i breaking news. Il suo nome è percentile + percentile (1 o 2 cifre) + metrica + durata (1 o 2 cifre) + unità:
- metriche:
Click,Engagement,Reach,VideoViews,Ctr,Overperforming,Monetization; - unità:
hora,dgiorno,wsettimana,mmese,yanno.
percentile50Click1d è la mediana dei clic in 1 giorno; percentile90Engagement7d è il 90° percentile dell'engagement in 7 giorni. Il valore è null in assenza di dati e viene memorizzato nella cache per 30 minuti.
1{%- if (post.counter.engagement ?? 0) > (percentile50Engagement7d ?? 0) -%}TOP{%- else -%}NORMAL{%- endif -%}7. Funzioni#
| Funzione | Restituisce | Descrizione |
|---|---|---|
hasLink() | boolean | true quando il post contiene un link. Verificala prima di scrivere [SHORTLINK]. |
hasFirstCommentShortlink() | boolean | true quando il primo commento contiene già [SHORTLINK]. |
canPublishPostWithoutSpam() | boolean | true quando le regole antispam dell'account consentono ora un altro post con link. |
canPublishCommentWithoutSpam() | boolean | Stessa verifica per un commento contenente un link. |
shouldAddComment(metric) | boolean | Applica la regola di campionamento dei commenti configurata; la metrica facoltativa indica il contatore usato. Il risultato può variare. |
aiGenerated(source, min, target, max, ending, justCrop) | string | Riassume source, oppure lo tronca al limite di una parola quando justCrop è true. |
gpt(prompt, model), claude(…), gemini(…), mistral(…) | string | Generano testo con le credenziali del provider del brand. Vedi Generazione di messaggi con l'IA. |
airtable(…) | string | Legge un valore da una base Airtable collegata. Restituisce solo testo. |
aiGenerated() risolve solo i nomi di primo livello forniti come testo. Passa 'description' oppure il valore stesso (organic.title), mai il testo 'organic.title', che viene restituito letteralmente. Anche un nome inesistente viene restituito letteralmente: su un post senza articolo, aiGenerated('description', …) restituisce la parola description. Proteggila con una condizione:
1{%- if organic -%}2{{- aiGenerated('description', null, null, 40, '…', true) -}}3{%- endif -%}8. Filtri#
I filtri e gli operatori Twig standard (default, first, join, length, trim, replace, date, map, in, ??, ?:, ~) sono documentati nella documentazione di Twig. Nonli aggiunge o sostituisce i filtri seguenti. Tutti i risultati riportati qui sotto provengono dal renderer di Nonli.
| Filtro | Effetto | Esempio | Risultato |
|---|---|---|---|
upper | Maiuscolo, accenti mantenuti | 'élan VITAL'|upper | ÉLAN VITAL |
lower | Minuscolo | 'élan VITAL'|lower | élan vital |
capitalize | Prima lettera maiuscola, il resto invariato | 'élan VITAL'|capitalize | Élan VITAL |
slugify | Slug per URL | 'Budget 2027 : ménages'|slugify | budget-2027-menages |
camel | Parole unite, ciascuna con l'iniziale maiuscola | 'budget des ménages'|camel | BudgetDesMénages |
clean | Comprime e rimuove gli spazi in eccesso, ed elimina gli spazi attorno a un trattino | ' Paris - Lyon '|clean | Paris-Lyon |
ucPhrase | Maiuscole di titolo, parole brevi in minuscolo | 'le budget des ménages'|ucPhrase | Le Budget des Ménages |
encode | Codifica per URL ma mantiene i caratteri riservati come &, =, /, ?, # | 'a b&c'|encode | a+b&c |
extractMatch(regex) | Primo gruppo di cattura, oppure null | 'Price: 10 €'|extractMatch('/([[:digit:]]+)/u') | 10 |
pregReplace(regex, replacement) | Sostituzione con espressione regolare | 'Budget 2027'|pregReplace('/[[:digit:]]+/', 'N') | Budget N |
cleanText | Pulizia tipografica: rimuove gli spazi in eccesso, aggiunge gli spazi unificatori francesi | 'Lire aussi : le budget. '|cleanText | Lire aussi : le budget. (spazio unificatore prima dei due punti) |
Regole per evitare errori di elaborazione:
extractMatchepregReplacefalliscono quando il valore ènull. Aggiungi|default('')prima di essi:{{ meta_custom_publisher|default('')|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') }}.encodenon protegge&,=o#: non usarlo per costruire un parametro a partire da un valore che potrebbe contenerli.- Preferisci le classi POSIX come
[[:digit:]],[[:space:]]e[[:alpha:]]alle sequenze con barra rovesciata: sopravvivono al copia e incolla. Copia i template da un blocco di codice, mai da una riga renderizzata di una chat o di un'email, che potrebbe perdere le barre rovesciate.
9. Ricette testate#
Ogni ricetta qui sotto è stata elaborata con il motore Twig di Nonli su fixture di articoli complete, parziali e vuote.
Titolo (H1 o title) seguito dalla meta description, con un link breve solo dove serve. In un post con link su Facebook restituisce il titolo e la descrizione; in una foto su Facebook aggiunge ➡️ [SHORTLINK]; su Instagram non aggiunge mai un link; senza articolo restituisce un testo vuoto.
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 -%}Prima frase della descrizione, poi la descrizione, poi il titolo.
1{%- set source = meta_description ?: description ?: '' -%}2{{- source|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') ?: source ?: title -}}Prima frase del campo publisher personalizzato, con ripiego sul testo alternativo dell'immagine, poi sul titolo.
1{{- meta_custom_publisher|default('')|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') ?: organic.image_alt|default('') ?: title -}}Testo per rete e tipo di post.
1{%- if social_network == 'instagram' -%}2{{- title -}}3{%- elseif post_type == 'link' -%}4{{- description ?: title -}}5{%- else -%}6{{- title -}}7{%- endif -%}Colore di Smart Image per categoria. Restituisce #E50032 per la politica, #16A34A per lo sport e #6F819D negli altri casi.
1{%- set categories = organic.category ?? [] -%}2{%- if 'politique' in categories -%}#E500323{%- elseif 'sport' in categories -%}#16A34A4{%- else -%}#6F819D5{%- endif -%}Valori di tracciamento dall'account di destinazione.
1utm_source={{ post.social_account.type|default('social') }}&utm_campaign={{ post.social_account.slug|default('')|encode }}Data di pubblicazione nel fuso orario della redazione. 2026-10-18T07:30:00.000Z diventa 18/10/2026 09:30. Senza una data di pubblicazione, date stamperebbe la data corrente, quindi la condizione lascia invece il testo vuoto.
1{%- if organic.published_at|default(null) -%}2{{- organic.published_at|date('d/m/Y H:i', 'Europe/Paris') -}}3{%- endif -%}Hashtag dai tag. ['budget', 'impots'] diventa #Budget #Impots.
1{{ tags|default([])|map(t => '#' ~ t|camel)|join(' ') }}Mantieni le parole brevi e i numeri insieme alla parola successiva (per i titoli di Smart Image, che non vanno mai a capo su uno spazio unificatore). La finale se jouera à guichets fermés mantiene La, se e à attaccati alla parola seguente, e 16 septembre o 3 000 euros restano uniti. La modifica si applica solo alle immagini generate da ora in poi.
1{%- set titre = organic.title ?? title -%}2{{- titre|pregReplace("/(?<=^|[[:space:]])([[:alpha:]]{1,2}|[[:digit:]]+)[[:space:]]+/u", "$1\xC2\xA0") -}}Twig trasforma \xC2\xA0 in uno spazio unificatore; $1 mantiene la parola breve o il numero che ha trovato corrispondenza.
10. Campi smart automatici e al clic#
Ogni brand ha due impostazioni: Automatic configuration of smart fields (configurazione automatica dei campi smart) e Smart field configuration at the click of the button (configurazione dei campi smart al clic del pulsante). Il pulsante dell'editor usa la configurazione al clic e ricorre a quella automatica solo quando non esiste alcuna configurazione al clic. Un campo impostato sul template pubblico Empty viene svuotato quando clicchi il pulsante, perché l'editor riscrive nel campo il valore generato.
I bot non usano queste impostazioni del brand. Ogni bot ha le proprie sorgenti, come Message's source e Description's source, che puntano a un valore integrato (Title, Description e così via) oppure a un template Smart Message.
11. Risoluzione dei problemi#
11.1. Il mio bot interroga la sua sorgente ma non crea alcun post#
Un bot attivo può trovare l'articolo e non creare comunque alcun post quando il suo Smart Message produce un messaggio vuoto. Succede, ad esempio, quando il template legge un campo facoltativo come meta_custom_publisher e l'articolo non lo ha. Nonli scarta allora il candidato prima di qualsiasi pubblicazione: viene scartato un messaggio vuoto, o di cinque caratteri o meno una volta rimosso il link breve, così come un post con link e titolo vuoto. La verifica del messaggio vuoto non si applica ai bot impostati su No message né a Pinterest; la verifica del titolo vuoto si applica a tutti i bot.
È diverso da un post che è stato creato e poi è fallito sulla rete: un post di questo tipo è visibile in Posts con uno stato di errore. Vedi Perché il mio bot non ha pubblicato questo articolo? per individuare prima la fase.
-
Confronta. Individua il bot esatto. Confronta alcuni messaggi che ha generato correttamente in passato con i metadati degli articoli corrispondenti e controlla cosa è cambiato nella sua configurazione. Il nome di un template o l'HTML attuale della pagina non bastano da soli a dimostrare cosa funzionava prima. Elabora il template attuale su un articolo idoneo rappresentativo e verifica se la variabile è assente oppure presente ma vuota.
-
Correggi. Preferisci ripristinare la sorgente del messaggio precedente quando dava la formulazione desiderata, oppure aggiungi un'alternativa adatta al tipo di variabile:
twig1{{- meta_custom_publisher ?: title -}}Se il titolo dell'articolo corrisponde alla formulazione desiderata, apri il bot, imposta Message's source su Title, poi clicca Save. Questo modifica il testo generato.

Estratto delle impostazioni del bot: Message's source impostato su Title, prima di cliccare Save.
-
Ambito. Cambiare la sorgente del bot riguarda solo i post futuri di quel bot. Modificare un template Smart Message condiviso riguarda ogni bot e ogni campo che lo usa. I post esistenti non vengono mai riscritti.
-
Verifica. Attendi la prossima interrogazione normale e controlla gli articoli ancora idonei. Gli articoli più vecchi non vengono recuperati automaticamente, e un post manuale non dimostra che il bot si sia ripreso.
11.2. Occhiello, sommario e prima frase sono valori diversi#
Un breve marcatore editoriale (a volte chiamato occhiello), il sommario completo e la prima frase di un testo sono tre cose diverse. Nonli non ha una variabile dedicata per il marcatore breve: una regola specifica del sito può memorizzarlo in un campo meta_custom_*, e alcuni articoli legittimamente non ne hanno. Non sostituire un marcatore mancante con l'intero sommario. Mostra il marcatore solo quando esiste:
1{%- set marker = meta_custom_instagram|default('')|trim -%}2{%- if marker -%}{{- marker ~ ' | ' -}}{%- endif -%}3{{- title -}}Con un marcatore il risultato è EXCLUSIVE | Budget 2027: what changes; senza, solo il titolo. Qui meta_custom_instagram è solo un esempio: usa il campo che la regola del tuo sito compila effettivamente.
meta_description (meta description nativa), meta_custom_publisher (campo personalizzato) e description (descrizione scelta da Nonli) sono input distinti. Un template che ne legge uno non è influenzato quando un altro viene corretto. Aggiornare un campo raccolto non cambia la sorgente del bot selezionata, il testo di Smart Image né i post già generati.
11.3. Descrizione raccolta completa o prima frase del sommario#
Quattro valori vengono spesso confusi quando un bot compone il suo messaggio:
- Descrizione raccolta (
description,organic.description): la descrizione dell'articolo raccolta da Nonli, usata così com'è, non suddivisa in frasi. Nonli la prende prima di tutto dai dati strutturati dell'articolo, altrimenti da Open Graph, poi da Twitter Card, poi dalla meta description nativa. Quando proviene da questi tag, mantiene il loro taglio a 500 caratteri. La descrizione dell'elemento RSS (meta_custom_rss_description) non viene mai usata come descrizione raccolta. - Metadati nativi (
meta_description,og_description,twitter_description): le descrizioni dichiarate nei meta tag della pagina. Nonli taglia ciascuna di esse a 500 caratteri quando le raccoglie. Questo limite è specifico di questi tre campi: una descrizione raccolta presa dai dati strutturati non viene tagliata. - Prima frase: un template come
Template: [public] Message from first standfirst sentencemantiene deliberatamente una sola frase e gestisce il link tramite il proprio marcatore[SHORTLINK]. - Marcatore breve: un campo facoltativo descritto nella sezione precedente, che alcuni articoli non hanno.
Né il nome di un template né la sorgente selezionata dimostrano che la descrizione raccolta sia il tuo sommario completo. Per pubblicare l'intera descrizione raccolta invece della sua prima frase:
- Verifica cosa è stato raccolto. Su alcuni articoli rappresentativi, confronta
descriptioncon il sommario completo che ti aspetti. Se manca, è troncata o contiene il testo dell'articolo invece del sommario, chiedi al supporto di correggere e verificare prima la raccolta. Cambiare la sorgente del bot non può recuperare un testo che non è stato raccolto. - Cambia la sorgente. Apri il bot, imposta Message's source su Description, poi clicca Save. Non confonderla con Description's source, che compila il campo descrizione del post, non il suo testo.
- Controlla il messaggio successivo. Guarda il prossimo post generato dal bot: il testo completo, dove compare il link e il limite di testo di ogni rete di destinazione. Una descrizione completa può essere lunga, e sceglierla non garantisce che ogni rete accetti l'intero testo. Nonli gestisce comunque il link breve: su un post senza link nativo, lo aggiunge subito dopo il testo generato, prima di qualsiasi suffisso del bot e degli hashtag, a meno che il primo commento non lo contenga già. I post di tipo link e condivisione non ricevono alcun link breve aggiunto, tranne i post con link su X e Mastodon, dove viene aggiunto in fondo al testo. I messaggi di Instagram e TikTok non ricevono alcun link breve. Un template con la prima frase può accorciare il testo o collocare il link in modo diverso a seconda della rete, quindi non aspettarti lo stesso risultato.
- Ambito. La modifica si applica solo ai post che questo bot genera da ora in poi. I post esistenti, gli altri bot e i template Smart Message condivisi restano invariati, e nessun articolo più vecchio viene importato o ripubblicato.
11.4. Gli apostrofi bloccano il mio template#
In una stringa Twig tra apici singoli, un apostrofo chiude la stringa. Questo template viene rifiutato quando lo salvi, con un errore come «Invalid template syntax at line 1»:
1{{ gpt('Summarize the article's main point') }}Fai l'escape dell'apostrofo, usa un apostrofo tipografico oppure usa le virgolette doppie:
1{{ gpt('Summarize the article\'s main point') }}2{{ gpt('Summarize the article’s main point') }}3{{ gpt("Summarize the article's main point") }}Il numero di riga indicato è la riga del template che contiene l'errore.
11.5. Una variabile resta vuota#
- Controlla l'ortografia esatta:
organic.category, noncategories;tags, nontag. - Controlla che il post abbia un articolo:
organicè vuoto per i post manuali e senza link, e gli alias non sono allora definiti. - Stampa una lista con
|join(', ')oppure verificala conin. - Confronta le categorie con la loro forma normalizzata (
politique societe, nonPolitique & Société). - Controlla i contatori con
?? 0: non sono disponibili prima della pubblicazione.
11.6. Un template può aggiungere collaboratori su Instagram?#
No. I template compilano solo campi di testo, e airtable() restituisce testo: può scrivere una @menzione, non creare una collaborazione. Aggiungi i collaboratori nell'editor dei post con Collaborators, oppure con il campo API collaborator[] (slug, type) di POST o PUT /v2.1/posts/bulk. Meta accetta fino a 3 collaboratori; vedi Come fare una collaborazione su Instagram con Nonli.