Szablony Smart Message pisze się w Twig 3. Ta strona zawiera wszystkie zmienne, funkcje i filtry obsługiwane przez Nonli w tym kontekście, wraz z ich typem, sytuacjami, w których mogą być niedostępne, i przetestowanym przykładem. Aby utworzyć szablon krok po kroku, zacznij od artykułu Jak utworzyć Smart Message.
1. Gdzie obowiązuje ten kontekst#
Ten sam kontekst jest dostępny w dwóch miejscach:
- Szablony Smart Message używane przez boty, przez przycisk z żarówką w edytorze posta i przez przycisk pierwszego komentarza. Mogą wypełniać wiadomość, tytuł, opis, komentarz, tytuł wideo, tekst alternatywny i tytuł kotwicy na TikToku.
- Wartości dynamiczne Smart Image, gdy tekst lub kolor w Smart Image korzysta z szablonu Smart Message jako źródła. W takim przypadku zmienna
contextma wartość'smart_image'. Zobacz Jak używać dynamicznych kolorów w Smart Image.
Dynamiczne parametry URL i dynamiczny paywall również korzystają z Twig, ale w znacznie węższym kontekście: ograniczony post (source, social_account, post_type, author, user_id, breaking_news, short_id), referer, funkcja isComment() oraz liczniki i percentyle. Nie istnieją tam organic, aliasy najwyższego poziomu ani opisane niżej funkcje Smart Message.
2. Zasady nazewnictwa i typów#
- Używaj pełnych ścieżek. Pisz
organic.titlelubpost.social_account.typezamiast aliasu najwyższego poziomu. Aliasy są nadal obsługiwane w istniejących szablonach. - Nazwy są w formacie snake_case i odpowiadają nazwom zapisanych pól:
canonical_url,published_at,open_graph. - Zwracaj uwagę na liczbę pojedynczą i mnogą. Ścieżki to
organic.category,organic.tag,organic.author; aliasy totagsiauthors. Błędna nazwa, taka jakcategories,organic.categories,tagczyauthor, nie powoduje błędu: zwraca pustą wartość. - Typy. string to tekst. list (lista) to ciąg wartości: sprawdzaj ją za pomocą
in, odczytuj za pomocą|firstlub|join(', ')i nigdy nie wyświetlaj jej bezpośrednio. object (obiekt) grupuje inne ścieżki. Dalej są liczby, wartości logiczne i daty. Daty to ciągi znaków w formacie ISO 8601 UTC, takie jak2026-10-18T07:30:00.000Z; formatuj je za pomocą|date. - Brak wartości. Wartość istnieje tylko wtedy, gdy dostarcza ją źródło. Zależy to od pochodzenia posta (artykuł, post ręczny, post bez linku), sieci społecznościowej, typu posta i metadanych, które scraper znalazł na stronie. Brakująca ścieżka
organicdaje pustą wartość; pusta lista jest traktowana jak brak wartości.
Użyj ??, aby zastąpić brakującą wartość lub null, oraz ?: lub |default(), aby zastąpić także pusty ciąg znaków:
| Wyrażenie | Brak wartości | Wartość '' | Wartość 'A' |
|---|---|---|---|
{{ x ?? 'B' }} | B | (puste) | A |
{{ x ?: 'B' }} | B | B | A |
{{ x|default('B') }} | B | B | A |
Po filtrze używaj ?: lub |default(), nigdy ??: {{ x|upper ?? 'B' }} to błąd składni, a szablon zostanie odrzucony przy zapisie.
3. Zmienne najwyższego poziomu#
Te zmienne są zawsze zdefiniowane w Smart Message.
| Ścieżka | Typ | Dostępność | Opis | Przykład |
|---|---|---|---|---|
social_network | string | Zawsze | Sieć konta docelowego; facebook, gdy jest nieznana. | instagram |
post_type | string | Zawsze | Typ posta; link, gdy jest nieznany. | photo |
empty_message | string | Zawsze | Pusty ciąg znaków, aby celowo nic nie zwracać. | '' |
shortlink_prefix | string | Zawsze | Tekst marki umieszczany przed krótkim linkiem. | ➡️ |
post | object | Zawsze | Tworzony lub edytowany post (zobacz post.*). | |
organic | object | Zawsze | Artykuł źródłowy (zobacz organic.*); pusta lista [], gdy post nie ma artykułu. | |
context | string | Zawsze | Generowane pole: message, title, description, comment, videoTitle, altText, tikTokAnchorTitle lub smart_image, gdy szablon renderuje Smart Image. | message |
3.1. Starsze aliasy#
Gdy post pochodzi z artykułu, Nonli kopiuje też niektóre pola artykułu na najwyższy poziom. Te aliasy są zdefiniowane (mogą mieć wartość null), gdy tylko istnieje artykuł, i niezdefiniowane, gdy post go nie ma. Każdy z nich ma zalecaną pełną ścieżkę.
| Alias | Zalecana pełna ścieżka | Typ | Zawartość |
|---|---|---|---|
title | organic.title | string | Tytuł artykułu wybrany przez Nonli |
description | organic.description | string | Opis artykułu wybrany przez Nonli |
title1 | organic.html.h1 | string | Pierwszy nagłówek H1 strony |
title2 | organic.html.h2 | string | Pierwszy nagłówek H2 strony |
head_title | organic.head.title | string | Znacznik HTML title, często dłuższy tytuł SEO |
meta_description | organic.meta.description | string | Natywny opis meta strony |
og_title | organic.meta.open_graph.title | string | Tytuł Open Graph |
og_description | organic.meta.open_graph.description | string | Opis Open Graph |
twitter_title | organic.meta.twitter.title | string | Tytuł Twitter Card |
twitter_description | organic.meta.twitter.description | string | Opis Twitter Card |
meta_custom_facebook, meta_custom_twitter, meta_custom_instagram, meta_custom_linkedin, meta_custom_tiktok, meta_custom_pinterest | organic.meta.custom.facebook (i tak dalej) | string | Niestandardowe metadane dla poszczególnych sieci, wyodrębnione przez regułę właściwą dla danej strony |
meta_custom_publisher | organic.meta.custom.publisher | string | Niestandardowe pole wydawcy wyodrębnione przez regułę właściwą dla danej strony, na przykład pierwszy akapit treści |
meta_custom_rss_title | organic.meta.custom.rss.title | string | Tytuł z elementu RSS |
meta_custom_rss_description | organic.meta.custom.rss.description | string | Opis z elementu RSS |
authors | organic.author | list | Autorzy artykułu |
tags | organic.tag | list | Tagi artykułu |
W prawdziwym artykule title i title1 często zawierają ten sam nagłówek, head_title zawiera dłuższy tytuł SEO, a meta_description często zaczyna się od leadu. Każda z tych wartości może być pusta, więc zawsze przewiduj wartość zastępczą.
Opcje „Meta custom …” w edytorze i w źródłach botów odpowiadają aliasom meta_custom_*. Są wypełniane tylko na stronach, dla których Nonli skonfigurowało dedykowaną regułę wyodrębniania. Artykuł ze strony spoza Twojej firmy udostępnia tylko swoje pola publiczne, dlatego brakuje dla niego organic.counter.view.
4. [object Object],: artykuł źródłowy#
organic istnieje, gdy post pochodzi z artykułu (bot, adres URL wklejony w edytorze, SDK, RSS). Post ręczny lub post bez linku nie ma artykułu: organic jest wtedy pustą listą, a każda ścieżka organic.* jest pusta.
| Ścieżka | Typ | Dostępność | Opis | Przykład |
|---|---|---|---|---|
organic.url | string | Każdy artykuł | Adres URL artykułu | https://www.example.com/politics/budget |
organic.canonical_url | string | Gdy zadeklarowany | Kanoniczny adres URL | https://www.example.com/politics/budget |
organic.type | string | Każdy artykuł | Wykryty typ treści | article |
organic.language | string | Gdy wykryty | Kod języka | fr |
organic.title | string | Większość artykułów | Tytuł wybrany przez Nonli | Budget 2027: what changes |
organic.description | string | Gdy znaleziony | Opis wybrany przez Nonli | The government presents its budget. |
organic.html.h1 / organic.html.h2 | string | Gdy obecny | Pierwszy nagłówek H1 / H2 | Key measures |
organic.head.title | string | Gdy obecny | Znacznik HTML title | Budget 2027 - Example News |
organic.meta.description | string | Gdy obecny | Natywny opis meta | The government presents its budget. |
organic.meta.open_graph.title / .description | string | Gdy obecny | Tytuł / opis Open Graph | Budget 2027 |
organic.meta.open_graph.article.section | string | Gdy obecny | Open Graph article:section | Politics |
organic.meta.twitter.title / .description | string | Gdy obecny | Tytuł / opis Twitter Card | Budget 2027 |
organic.meta.custom.* | string | Reguła właściwa dla strony | Pola niestandardowe wymienione w tabeli aliasów | |
organic.category | list | Gdy znalezione | Znormalizowane kategorie, w tym JSON-LD articleSection | ['politics', 'economy'] |
organic.tag | list | Gdy znalezione | Tagi artykułu | ['budget', 'taxes'] |
organic.author | list | Gdy znalezieni | Autorzy artykułu | ['Camille Martin'] |
organic.image | list | Gdy znalezione | Adresy URL obrazów znalezionych na stronie | ['https://…/budget.jpg'] |
organic.image_alt | string | Gdy znaleziony | Tekst alternatywny głównego obrazu | The National Assembly chamber |
organic.published_at | date | Gdy znaleziona | Data publikacji (UTC) | 2026-10-18T07:30:00.000Z |
organic.modified_at | date | Gdy znaleziona | Data ostatniej modyfikacji (UTC) | 2026-10-18T09:00:00.000Z |
organic.counter.view | number | Zobacz liczniki | Wyświetlenia artykułu mierzone przez Nonli | 1520 |
4.1. Kategorie i ,[object Object]#
Nonli zapisuje wartość JSON-LD articleSection oraz inne sygnały kategorii ze strony w organic.category. Jest to lista, a nie tekst, i nie istnieje zmienna categories. Wartości są normalizowane: małe litery, usunięte znaki diakrytyczne, znaki interpunkcyjne zamienione na spacje. Na przykład Politique & Société, Économie i Sports > Rugby stają się politique societe, economie i sports rugby. Zawsze porównuj z wartościami faktycznie występującymi w Twoich artykułach.
1{%- set categories = organic.category ?? [] -%}2{%- if 'politique' in categories -%}3Politics4{%- endif -%}Pierwsza kategoria lub nic: {{ organic.category|default([])|first|default('') }}
Wszystkie kategorie: {{ organic.category|default([])|join(', ') }}
Surowa sekcja Open Graph, bez normalizacji, pozostaje dostępna jako {{ organic.meta.open_graph.article.section ?? '' }}.
5. [object Object],: post#
post opisuje tworzony lub edytowany post. Pola są wypełniane stopniowo: pole, które jest właśnie generowane, pozostaje puste podczas renderowania jego własnego szablonu.
| Ścieżka | Typ | Dostępność | Opis | Przykład |
|---|---|---|---|---|
post.post_type | string | Zawsze | Typ posta | link |
post.message | string | Gdy napisana | Bieżąca wiadomość | Three ways to save energy. |
post.title | string | Gdy napisany | Bieżący tytuł | Budget 2027 |
post.description | string | Gdy napisany | Bieżący opis | What changes for households. |
post.author | string | Gdy znany | Autor treści posta (jeden tekst, nie lista) | Camille Martin |
post.tag | list | Gdy znane | Tagi posta | ['budget'] |
post.language | string | Gdy znany | Kod języka | fr |
post.target_url | string | Posty z linkiem | Docelowy adres URL | https://www.example.com/politics/budget |
post.short_id | string | Po skróceniu | Identyfikator krótkiego linku | aB3xY |
post.social_account.type | string | Zawsze | Sieć docelowa | linkedin |
post.social_account.name | string | Zawsze | Nazwa konta | Example News |
post.social_account.slug | string | Zawsze | Slug konta | example-news |
post.social_account.external_id | string | Zawsze | Identyfikator konta w sieci | 1000000001 |
post.source.type | string | Gdy znany | Pochodzenie posta (bot, ręczny i tak dalej) | bot |
post.source.bot_title | string | Posty botów | Nazwa bota, który utworzył post | Politics bot |
post.source.organic_url | string | Posty z artykułu | Adres URL artykułu źródłowego | https://www.example.com/politics/budget |
post.breaking_news.active | boolean | Zawsze | Tryb breaking news | false |
post.schedule.start_date | date | Posty zaplanowane | Planowana data publikacji (UTC) | 2026-10-19T06:00:00.000Z |
post.published_at | date | Po publikacji | Data publikacji (UTC) | 2026-10-19T06:00:04.000Z |
post.comment.message | string | Gdy napisany | Tekst pierwszego komentarza | Read more: [SHORTLINK] |
post.counter.* | number | Zobacz liczniki | Wyniki posta | 42 |
Identyfikatory wewnętrzne i pola techniczne (identyfikatory użytkownika, firmy i marki, adres e-mail konta, adres URL webhooka, statusy, ślady błędów, surowe liczniki) są celowo wykluczone: nie stanowią stabilnego interfejsu publicznego i nie mogą pojawiać się w publikowanym tekście. post.user_id jest udokumentowany tylko dla parametrów URL.
6. Liczniki i percentyle#
Licznik jest wczytywany tylko wtedy, gdy szablon jawnie go wymienia, na przykład post.counter.click. Brakuje go, gdy metryka jeszcze nie istnieje, co zawsze dotyczy posta, który nie został opublikowany. Zawsze dodawaj wartość zastępczą: {{ post.counter.click ?? 0 }}.
| Ścieżka | Typ | Opis |
|---|---|---|
post.counter.click | number | Kliknięcia |
post.counter.engagement | number | Zaangażowanie |
post.counter.reach | number | Zasięg |
post.counter.videoViews | number | Wyświetlenia wideo |
post.counter.ctr | number | Współczynnik klikalności (CTR) |
post.counter.overperforming | number | Wskaźnik ponadprzeciętnych wyników |
post.counter.monetization | number | Przychody z monetyzacji treści |
organic.counter.view | number | Wyświetlenia artykułu (tylko gdy post ma artykuł) |
Zmienna percentyla porównuje post z postami opublikowanymi przez to samo konto w danym okresie, z wyłączeniem newsów z ostatniej chwili. Jej nazwa składa się z percentile + percentyl (1 lub 2 cyfry) + metryka + czas trwania (1 lub 2 cyfry) + jednostka:
- metryki:
Click,Engagement,Reach,VideoViews,Ctr,Overperforming,Monetization; - jednostki:
hgodzina,ddzień,wtydzień,mmiesiąc,yrok.
percentile50Click1d to mediana kliknięć z 1 dnia; percentile90Engagement7d to 90. percentyl zaangażowania z 7 dni. Bez danych wartość wynosi null i jest przechowywana w pamięci podręcznej przez 30 minut.
1{%- if (post.counter.engagement ?? 0) > (percentile50Engagement7d ?? 0) -%}TOP{%- else -%}NORMAL{%- endif -%}7. Funkcje#
| Funkcja | Zwraca | Opis |
|---|---|---|
hasLink() | boolean | true, gdy post zawiera link. Sprawdź to przed wpisaniem [SHORTLINK]. |
hasFirstCommentShortlink() | boolean | true, gdy pierwszy komentarz zawiera już [SHORTLINK]. |
canPublishPostWithoutSpam() | boolean | true, gdy reguły antyspamowe konta pozwalają teraz na kolejny post z linkiem. |
canPublishCommentWithoutSpam() | boolean | To samo sprawdzenie dla komentarza zawierającego link. |
shouldAddComment(metric) | boolean | Stosuje skonfigurowaną regułę próbkowania komentarzy; opcjonalna metryka wskazuje używany licznik. Wynik może się zmieniać. |
aiGenerated(source, min, target, max, ending, justCrop) | string | Streszcza source lub przycina go na granicy słowa, gdy justCrop ma wartość true. |
gpt(prompt, model), claude(…), gemini(…), mistral(…) | string | Generują tekst przy użyciu danych uwierzytelniających dostawcy przypisanych do marki. Zobacz Generowanie wiadomości przez AI. |
airtable(…) | string | Odczytuje wartość z połączonej bazy Airtable. Zwraca wyłącznie tekst. |
aiGenerated() rozpoznaje tylko nazwy najwyższego poziomu podane jako tekst. Przekaż 'description' lub samą wartość (organic.title), nigdy tekst 'organic.title', który zostanie zwrócony dosłownie. Nazwa, która nie istnieje, również jest zwracana dosłownie: w poście bez artykułu aiGenerated('description', …) zwraca słowo description. Zabezpiecz to warunkiem:
1{%- if organic -%}2{{- aiGenerated('description', null, null, 40, '…', true) -}}3{%- endif -%}8. Filtry#
Standardowe filtry i operatory Twig (default, first, join, length, trim, replace, date, map, in, ??, ?:, ~) są opisane w dokumentacji Twig. Nonli dodaje lub zastępuje poniższe filtry. Wszystkie wyniki poniżej pochodzą z renderera Nonli.
| Filtr | Działanie | Przykład | Wynik |
|---|---|---|---|
upper | Wielkie litery, znaki diakrytyczne zachowane | 'élan VITAL'|upper | ÉLAN VITAL |
lower | Małe litery | 'élan VITAL'|lower | élan vital |
capitalize | Pierwsza litera wielka, reszta bez zmian | 'élan VITAL'|capitalize | Élan VITAL |
slugify | Slug URL | 'Budget 2027 : ménages'|slugify | budget-2027-menages |
camel | Słowa połączone, każde wielką literą | 'budget des ménages'|camel | BudgetDesMénages |
clean | Scala i przycina spacje oraz usuwa spacje wokół łącznika | ' Paris - Lyon '|clean | Paris-Lyon |
ucPhrase | Wielkie litery na początku słów, krótkie słowa pozostają małymi literami | 'le budget des ménages'|ucPhrase | Le Budget des Ménages |
encode | Koduje URL, ale zachowuje znaki zastrzeżone, takie jak &, =, /, ?, # | 'a b&c'|encode | a+b&c |
extractMatch(regex) | Pierwsza grupa przechwytująca lub null | 'Price: 10 €'|extractMatch('/([[:digit:]]+)/u') | 10 |
pregReplace(regex, replacement) | Zastępowanie wyrażeniem regularnym | 'Budget 2027'|pregReplace('/[[:digit:]]+/', 'N') | Budget N |
cleanText | Porządkowanie typograficzne: przycina spacje, dodaje francuskie spacje nierozdzielające | 'Lire aussi : le budget. '|cleanText | Lire aussi : le budget. (spacja nierozdzielająca przed dwukropkiem) |
Zasady, które pozwalają uniknąć błędów renderowania:
extractMatchipregReplacezwracają błąd, gdy wartość tonull. Dodaj przed nimi|default(''):{{ meta_custom_publisher|default('')|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') }}.encodenie chroni&,=ani#: nie używaj go do budowania parametru z wartości, która może je zawierać.- Zamiast sekwencji z ukośnikiem wstecznym używaj klas POSIX, takich jak
[[:digit:]],[[:space:]]i[[:alpha:]]: nie psują się przy kopiowaniu i wklejaniu. Kopiuj szablony z bloku kodu, nigdy z wyrenderowanej wiadomości czatu lub e-maila, które mogą usuwać ukośniki wsteczne.
9. Przetestowane przepisy#
Każdy poniższy przepis został wyrenderowany silnikiem Twig Nonli na pełnych, częściowych i pustych danych testowych artykułów.
Nagłówek (H1 lub tytuł), a po nim opis meta, z krótkim linkiem tylko tam, gdzie jest potrzebny. W poście z linkiem na Facebooku zwraca nagłówek i opis; w poście ze zdjęciem na Facebooku dodaje ➡️ [SHORTLINK]; na Instagramie nigdy nie dodaje linku; bez artykułu zwraca pusty tekst.
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 -%}Pierwsze zdanie opisu, w razie jego braku opis, a następnie tytuł.
1{%- set source = meta_description ?: description ?: '' -%}2{{- source|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') ?: source ?: title -}}Pierwsze zdanie niestandardowego pola wydawcy, w razie jego braku tekst alternatywny obrazu, a następnie tytuł.
1{{- meta_custom_publisher|default('')|extractMatch('/^(.+?[.!?…])(?=[[:space:]]|$)/u') ?: organic.image_alt|default('') ?: title -}}Tekst zależny od sieci i typu posta.
1{%- if social_network == 'instagram' -%}2{{- title -}}3{%- elseif post_type == 'link' -%}4{{- description ?: title -}}5{%- else -%}6{{- title -}}7{%- endif -%}Kolor Smart Image zależny od kategorii. Zwraca #E50032 dla polityki, #16A34A dla sportu i #6F819D w pozostałych przypadkach.
1{%- set categories = organic.category ?? [] -%}2{%- if 'politique' in categories -%}#E500323{%- elseif 'sport' in categories -%}#16A34A4{%- else -%}#6F819D5{%- endif -%}Wartości śledzące z konta docelowego.
1utm_source={{ post.social_account.type|default('social') }}&utm_campaign={{ post.social_account.slug|default('')|encode }}Data publikacji w strefie czasowej redakcji. 2026-10-18T07:30:00.000Z zmienia się w 18/10/2026 09:30. Bez daty publikacji date wyświetliłby bieżącą datę, dlatego warunek pozostawia wtedy pusty tekst.
1{%- if organic.published_at|default(null) -%}2{{- organic.published_at|date('d/m/Y H:i', 'Europe/Paris') -}}3{%- endif -%}Hashtagi z tagów. ['budget', 'impots'] zmienia się w #Budget #Impots.
1{{ tags|default([])|map(t => '#' ~ t|camel)|join(' ') }}Krótkie słowa i liczby trzymane razem z następnym słowem (w tytułach Smart Image, które nigdy nie łamią wiersza na spacji nierozdzielającej). W La finale se jouera à guichets fermés słowa La, se i à pozostają połączone z następnym słowem, a 16 septembre czy 3 000 euros nie są rozdzielane. Zmiana dotyczy tylko nowo generowanych obrazów.
1{%- set titre = organic.title ?? title -%}2{{- titre|pregReplace("/(?<=^|[[:space:]])([[:alpha:]]{1,2}|[[:digit:]]+)[[:space:]]+/u", "$1\xC2\xA0") -}}Twig zamienia \xC2\xA0 na spację nierozdzielającą; $1 zachowuje dopasowane krótkie słowo lub liczbę.
10. Inteligentne pola automatyczne i uruchamiane kliknięciem#
Każda marka ma dwa ustawienia: Automatic configuration of smart fields (automatyczna konfiguracja inteligentnych pól) i Smart field configuration at the click of the button (konfiguracja inteligentnych pól po kliknięciu przycisku). Przycisk w edytorze korzysta z konfiguracji uruchamianej kliknięciem, a do automatycznej wraca tylko wtedy, gdy konfiguracja uruchamiana kliknięciem nie istnieje. Pole ustawione na publiczny szablon Empty (pusty) jest czyszczone po kliknięciu przycisku, ponieważ edytor wpisuje wygenerowaną wartość z powrotem do pola.
Boty nie korzystają z tych ustawień marki. Każdy bot ma własne źródła, takie jak Message's source (źródło wiadomości) i Description's source (źródło opisu), które wskazują wbudowaną wartość (Title, Description i tak dalej) lub szablon Smart Message.
11. Rozwiązywanie problemów#
11.1. Mój bot sprawdza źródło, ale nie tworzy żadnego posta#
Aktywny bot może znaleźć artykuł, a mimo to nie utworzyć posta, gdy jego Smart Message renderuje pustą wiadomość. Dzieje się tak na przykład wtedy, gdy szablon odczytuje pole opcjonalne, takie jak meta_custom_publisher, a artykuł go nie ma. Nonli odfiltrowuje wtedy kandydata przed jakąkolwiek publikacją: wiadomość pusta lub mająca pięć znaków lub mniej po usunięciu krótkiego linku zostaje odrzucona, podobnie jak post z linkiem z pustym tytułem. Sprawdzenie pustej wiadomości nie dotyczy botów ustawionych na No message (bez wiadomości) ani Pinteresta; sprawdzenie pustego tytułu dotyczy każdego bota.
Jest to coś innego niż post, który został utworzony, a następnie nie powiódł się w sieci: taki post jest widoczny w Posts ze statusem błędu. Zobacz Dlaczego bot nie opublikował tego artykułu?, aby najpierw ustalić, na którym etapie wystąpił problem.
-
Porównaj. Zidentyfikuj dokładnie, o którego bota chodzi. Porównaj kilka wiadomości, które wcześniej wygenerował poprawnie, z metadanymi odpowiednich artykułów i sprawdź, co zmieniło się w jego konfiguracji. Sama nazwa szablonu ani obecny kod HTML strony nie dowodzą, co wcześniej działało. Wyrenderuj obecny szablon na reprezentatywnym artykule spełniającym warunki i sprawdź, czy zmiennej brakuje, czy istnieje, ale jest pusta.
-
Napraw. Najlepiej przywróć poprzednie źródło wiadomości, jeśli dawało zamierzone sformułowanie, albo dodaj wartość zastępczą dopasowaną do typu zmiennej:
twig1{{- meta_custom_publisher ?: title -}}Jeśli tytuł artykułu odpowiada zamierzonemu sformułowaniu, otwórz bota, ustaw Message's source na Title, a następnie kliknij Save. Zmienia to generowany tekst.

Fragment ustawień bota: Message's source ustawione na Title, przed kliknięciem Save.
-
Zakres. Zmiana źródła bota dotyczy tylko przyszłych postów tego bota. Edycja udostępnionego szablonu Smart Message wpływa na każdego bota i każde pole, które z niego korzysta. Istniejące posty nigdy nie są przepisywane.
-
Sprawdź. Poczekaj na następne zwykłe sprawdzenie źródła i obejrzyj artykuły, które nadal spełniają warunki. Starsze artykuły nie są automatycznie nadrabiane, a post ręczny nie dowodzi, że bot znów działa.
11.2. Krótki znacznik, lead i pierwsze zdanie to różne wartości#
Krótki znacznik redakcyjny (nazywany czasem nadtytułem), pełny lead i pierwsze zdanie tekstu to trzy różne rzeczy. Nonli nie ma dedykowanej zmiennej dla krótkiego znacznika: reguła właściwa dla danej strony może zapisywać go w polu meta_custom_*, a niektóre artykuły po prostu go nie mają. Nie zastępuj brakującego znacznika całym leadem. Wyświetlaj znacznik tylko wtedy, gdy istnieje:
1{%- set marker = meta_custom_instagram|default('')|trim -%}2{%- if marker -%}{{- marker ~ ' | ' -}}{%- endif -%}3{{- title -}}Ze znacznikiem wynik to EXCLUSIVE | Budget 2027: what changes; bez niego tylko tytuł. meta_custom_instagram jest tu tylko przykładem: użyj pola, które faktycznie wypełnia reguła Twojej strony.
meta_description (natywny opis meta), meta_custom_publisher (pole niestandardowe) i description (opis wybrany przez Nonli) to odrębne dane wejściowe. Poprawienie jednego z nich nie wpływa na szablon, który odczytuje inne. Aktualizacja zebranego pola nie zmienia wybranego źródła bota, tekstu Smart Image ani już wygenerowanych postów.
11.3. Pełny zebrany opis czy pierwsze zdanie leadu#
Gdy bot tworzy wiadomość, często myli się cztery wartości:
- Zebrany opis (
description,organic.description): opis artykułu zebrany przez Nonli, używany w całości, bez dzielenia na zdania. Nonli pobiera go najpierw z danych strukturalnych artykułu, a w razie ich braku z Open Graph, następnie z Twitter Card, a na końcu z natywnego opisu meta. Gdy pochodzi z tych znaczników, zachowuje ich przycięcie do 500 znaków. Opis elementu RSS (meta_custom_rss_description) nigdy nie jest używany jako zebrany opis. - Metadane natywne (
meta_description,og_description,twitter_description): opisy zadeklarowane w znacznikach meta strony. Nonli przycina każdy z nich do 500 znaków podczas zbierania. Ten limit dotyczy tylko tych trzech pól: zebrany opis pobrany z danych strukturalnych nie jest przycinany. - Pierwsze zdanie: szablon taki jak
Template: [public] Message from first standfirst sentencecelowo zachowuje jedno zdanie i obsługuje link za pomocą własnego znacznika[SHORTLINK]. - Krótki znacznik: pole opcjonalne opisane w poprzedniej sekcji, którego niektóre artykuły nie mają.
Ani nazwa szablonu, ani wybrane źródło nie dowodzą, że zebrany opis to Twój pełny lead. Aby publikować pełny zebrany opis zamiast jego pierwszego zdania:
- Sprawdź, co zostało zebrane. Na kilku reprezentatywnych artykułach porównaj
descriptionz pełnym leadem, którego oczekujesz. Jeśli go brakuje, jest przycięty lub zawiera treść artykułu zamiast leadu, najpierw poproś wsparcie o poprawienie i sprawdzenie zbierania danych. Zmiana źródła bota nie odzyska tekstu, który nie został zebrany. - Zmień źródło. Otwórz bota, ustaw Message's source na Description, a następnie kliknij Save. Nie myl tego z Description's source, które wypełnia pole opisu posta, a nie jego tekst.
- Sprawdź następną wiadomość. Obejrzyj następny post wygenerowany przez bota: pełny tekst, miejsce linku i limit tekstu każdej sieci docelowej. Pełny opis może być długi, a jego wybór nie gwarantuje, że każda sieć przyjmie cały tekst. Nonli nadal obsługuje krótki link: w poście bez natywnego linku dodaje krótki link bezpośrednio po wygenerowanym tekście, przed ewentualnym sufiksem bota i hashtagami, chyba że pierwszy komentarz już go zawiera. Posty z linkiem i udostępnienia nie dostają dołączonego krótkiego linku, z wyjątkiem postów z linkiem w X i na Mastodonie, gdzie jest on dodawany na samym końcu. Wiadomości na Instagramie i TikToku nie dostają krótkiego linku. Szablon pierwszego zdania może skracać tekst lub umieszczać link w różnych miejscach zależnie od sieci, więc nie oczekuj takiego samego wyniku.
- Zakres. Zmiana dotyczy tylko postów generowanych przez tego bota od teraz. Istniejące posty, inne boty i udostępnione szablony Smart Message pozostają bez zmian, a żaden starszy artykuł nie jest importowany ani publikowany ponownie.
11.4. Apostrofy psują mój szablon#
W ciągu Twig w pojedynczych cudzysłowach apostrof kończy ciąg. Ten szablon zostanie odrzucony przy zapisie z błędem takim jak „Invalid template syntax at line 1”:
1{{ gpt('Summarize the article's main point') }}Poprzedź apostrof znakiem ucieczki, użyj apostrofu typograficznego lub podwójnych cudzysłowów:
1{{ gpt('Summarize the article\'s main point') }}2{{ gpt('Summarize the article’s main point') }}3{{ gpt("Summarize the article's main point") }}Podany numer wiersza to wiersz szablonu, który zawiera błąd.
11.5. Zmienna pozostaje pusta#
- Sprawdź dokładną pisownię:
organic.category, a niecategories;tags, a nietag. - Sprawdź, czy post ma artykuł:
organicjest puste w przypadku postów ręcznych i postów bez linku, a aliasy są wtedy niezdefiniowane. - Wyświetlaj listę za pomocą
|join(', ')lub sprawdzaj ją za pomocąin. - Porównuj kategorie z ich znormalizowaną postacią (
politique societe, a niePolitique & Société). - Zabezpieczaj liczniki za pomocą
?? 0: przed publikacją ich brakuje.
11.6. Czy szablon może dodać współpracowników na Instagramie?#
Nie. Szablony wypełniają tylko pola tekstowe, a airtable() zwraca tekst: może wpisać oznaczenie z @, ale nie utworzy współpracy. Dodaj współpracowników w edytorze posta za pomocą Collaborators (współpracownicy) lub pola API collaborator[] (slug, type) w POST lub PUT /v2.1/posts/bulk. Meta akceptuje maksymalnie 3 współpracowników; zobacz Jak utworzyć współpracę na Instagramie z Nonli.