SEO

Schema Article passo per passo, senza duplicati

Article è il tipo schema.org che descrive un articolo: titolo, date, autore, immagine. Va aggiunto una volta per pagina, con i dati già visibili nel testo.

In sintesi

  • Article descrive un articolo pubblicato e va dichiarato una volta per pagina, con i valori che l'utente legge.
  • Sul sito in produzione la pagina articolo serve 2 blocchi JSON-LD con 7 nodi, Article compreso, letti il 1 novembre 2026.
  • Un nodo Article duplicato, o con una data aggiornata a ogni deploy, annulla l'informazione che il markup doveva portare.

Article è il tipo schema.org che descrive un articolo pubblicato: titolo, date, autore, immagine. Si aggiunge come JSON-LD nella pagina, una volta sola, con gli stessi valori che l'utente legge.

Cosa chiede Google

La pagina Article, letta il 1 novembre 2026, dice che il markup aiuta Google a mostrare titolo, immagine e data migliori nel risultato, e che non esiste un requisito di markup per entrare nei servizi di Google News. L'esempio ufficiale usa NewsArticle con headline, image, datePublished, dateModified e author. BlogPosting e NewsArticle sono sottotipi di Article: scegli quello che descrive la pagina, non il più grande.

Il blocco completo

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Come aggiungere schema markup senza rompere il sito",
  "datePublished": "2026-11-01T21:45:00+01:00",
  "dateModified": "2026-11-01T21:45:00+01:00",
  "author": {
    "@type": "Person",
    "name": "Enea Zani",
    "url": "https://eneawork.it"
  },
  "image": ["https://ui.eneawork.it/blog-covers/it/come-aggiungere-schema-markup.png"],
  "mainEntityOfPage": {
    "@id": "https://ui.eneawork.it/it/blog/come-aggiungere-schema-markup"
  }
}

Il blocco contiene i cinque campi dell'esempio, più mainEntityOfPage, che dice a quale URL appartiene l'articolo. image è un array: una sola immagine va bene, ma l'array evita di riscrivere il blocco quando ne aggiungi una seconda. author è un oggetto Person con un URL che risponde: un autore senza pagina è un nome, non un'entità.

Controllare il nodo prima del deploy

cat > check-article.mjs ]*application\/ld\+json[^>]*>([\s\S]*?)/g)];
const nodes = blocks.flatMap(([, raw]) => {
  const data = JSON.parse(raw);
  return data["@graph"] || [data];
});
const article = nodes.find((n) => /^(Article|NewsArticle|BlogPosting)$/.test(n["@type"]));
if (!article) {
  console.log("no Article node");
  process.exit(1);
}
const missing = ["headline", "datePublished", "author", "image"].filter((k) => !article[k]);
console.log(`${nodes.length} JSON-LD nodes, Article ${article["@type"]}`);
console.log(missing.length ? `missing: ${missing.join(", ")}` : "required fields present");
EOF
node check-article.mjs https://ui.eneawork.it/blog/come-aggiungere-schema-markup

Lo script scarica la pagina, unisce i nodi di ogni blocco (anche dentro @graph) e cerca il primo Article, NewsArticle o BlogPosting. Poi elenca le proprietà che mancano fra quelle dell'esempio. Un nodo assente è un errore di deploy, non di validatore: nessuno strumento sa che quel tipo doveva esserci.

Quattro errori che si vedono spesso

  • Due nodi Article nella stessa pagina, uno generato dal CMS e uno dal componente: Google ne sceglie uno e i dati si contraddicono.
  • dateModified aggiornata a ogni deploy invece che a ogni modifica reale: la data perde significato e Google la ignora.
  • headline diversa dall'H1 visibile: il markup descrive un testo che l'utente non vede, ed è la definizione di markup fuorviante.
  • image che punta a un 404: l'immagine è la parte del risultato che si vede di più, e un errore lì si nota subito.

Il record dal vivo

Un articolo del catalogo ha già la forma giusta: glass-blog-card-shadcnui rende titolo, data e anteprima, cioè tre dei campi che Article riusa. Le liste da cui partire sono blog e i 1.556 blocchi. Dati verificati il 1 novembre 2026.

La limitazione

Article non produce un rich result da solo e non sposta la posizione. Serve a far leggere a Google dati che sono già in pagina e a ridurre le ipotesi quando due pagine si somigliano. Se il markup contraddice il testo visibile, Google applica un'azione manuale: nessun validatore vede quella differenza, perché il confronto è semantico.

Dove continuare

L'introduzione al formato è in come aggiungere schema markup; il markup delle domande è in schema FAQPage; la sequenza per entrare nell'indice è in indicizzare un sito su Google. Se il sito è su WordPress o su componenti React, chi genera il JSON-LD cambia: il confronto è in WordPress, Wix o componenti React.

Domande frequenti

Meglio Article, NewsArticle o BlogPosting?

Quello che descrive la pagina: BlogPosting per un blog, NewsArticle per una testata, Article quando nessuno dei due è preciso. I tre condividono le stesse proprietà.

L'immagine è obbligatoria?

Nell'esempio di Google sì, e nella pratica conviene sempre: è la parte del risultato che si vede di più. Deve rispondere 200 e avere un formato che Google indicizza.

Dove va il blocco Article?

Nell'HTML della pagina, in head o in body, dentro un tag script con type application/ld+json. Non deve stare dentro un altro script.

Posso usare un unico blocco con @graph?

Sì, ed è quello che fa questo sito: 2 script con 7 nodi, Article accanto a Organization e BreadcrumbList. L'importante è che ogni entità compaia una volta, con dati coerenti.

datePublished e dateModified devono essere ISO 8601?

Sì. Google accetta data e ora con fuso orario, per esempio 2026-11-01T21:45:00+01:00. Una data senza fuso viene interpretata, e l'interpretazione non è sempre quella che intendevi.