Post WordPress in Markdown, per LLM e agenti
Gli LLM e gli agenti AI consumano meno token e capiscono meglio i contenuti quando leggono Markdown invece di HTML renderizzato. Post Content to Markdown scrive Markdown per WordPress nel modo giusto: content negotiation, conversione dei blocchi e autodiscovery della versione Markdown.
Indice degli argomenti
Gli LLM e gli agenti AI lavorano meglio con Markdown rispetto all’HTML renderizzato, perché consumano meno token e non devono estrapolare il contenuto dal markup. Il plugin roots/post-content-to-markdown aggiunge una rappresentazione Markdown a qualsiasi sito WordPress, senza un’API dedicata o una route separata da gestire.
Su Roots era già stato spiegato che diversi plugin SEO dicono di servire “Markdown per l’AI” ma in realtà ignorano del tutto l’header Accept, e finiscono per rispondere sempre in HTML, anche a chi sta chiedendo esplicitamente Markdown. Post Content to Markdown invece gestisce le risposte nel modo giusto: content negotiation, conversione dei blocchi, header Link e tag <link> in <head>, in modo che anche gli LLM che non inviano Accept: text/markdown possano comunque trovare la versione Markdown.
Il tuo sito WordPress è pronto per l’AI? Verifica qualsiasi URL con acceptmarkdown.com: ti dice cosa manca per agenti e LLM, con i link alle guide collegate. Su acceptmarkdown.com/status trovi come si comportano oggi i principali agenti AI.
Cosa fa
Il plugin assegna a ogni post e a ogni feed una versione Markdown che i client possono richiedere in tre modi diversi:
- Un header di richiesta
Accept: text/markdown, ideale per agenti e script - Un parametro in query string
?format=markdown - Un suffisso
.mdaggiunto all’URL, per esempio/hello-world.md. La versione HTML del post espone questo URL sia tramite un header di rispostaLink: rel="alternate"; type="text/markdown", sia con un tag<link>corrispondente in<head>, così gli agenti che non supportano ancora l’headerAccept: text/markdownpossono raggiungere comunque la versione Markdown seguendo quel link.
Ecco lo stesso post Hello world! in due forme diverse:
$ curl https://example.com/hello-world/<html lang="it-IT">…2.400 righe di markup del tema…</html>
$ curl -H "Accept: text/markdown" https://example.com/hello-world/# Hello world!
Benvenuto in WordPress. Questo è il tuo primo articolo. Modificalo o eliminalo, poi inizia a scrivere.La conversione non perde i contenuti
- Esegue prima il rendering dei blocchi Gutenberg e solo dopo converte, così blocchi dinamici, embed e tabelle finiscono nel Markdown senza perdere pezzi per strada
- Rimuove il markup aggiunto dagli highlighter di sintassi (Prism, highlight.js, ecc.), così i blocchi di codice arrivano belli puliti, senza il “rumore” prodotto dai tag HTML tipo
<span class="token …"> - Salva il risultato della conversione nell’object cache (Redis/Memcached) usando un hash del contenuto come chiave: le richieste successive non rifanno il rendering dei blocchi, non espandono gli shortcode e non rieseguono il passaggio HTML → Markdown, ma leggono direttamente dalla cache
Feed e commenti
La stessa content negotiation funziona anche sui feed:
/feed/markdown/è un feed Markdown dedicato, con metadati del sito, titoli dei post, autori, date, categorie, tag e contenuto completo/feed/conAccept: text/markdownrestituisce il feed principale in Markdown/post-slug/feed/conAccept: text/markdownrestituisce il post con tutti i suoi commenti
Il feed Markdown viene anche esposto nel feed RSS, tramite un <atom:link rel="alternate" type="text/markdown">. In questo modo feed reader e agenti riescono a trovarlo da soli, senza bisogno di sapere dove cercare.
Filtri
I filtri coprono i casi più comuni:
post_content_to_markdown/post_typespermette di estendere la conversione a pagine o custom post type (di default:['post'])post_content_to_markdown/post_allowedè una allowlist per singolo post, applicata dopo il controllo sul post typepost_content_to_markdown/converter_optionsconfigura lo stile degli header, gli hard break e i nodi da rimuoverepost_content_to_markdown/conversion_cache_durationpermette di abbassare la durata della cache (TTL) se hai blocchi che variano in base alla richiestapost_content_to_markdown/markdown_outputesegue una passata finale sul Markdown già convertito, fuori dalla cache, a ogni richiesta. È il punto in cui inserire personalizzazioni per-request senza dover invalidare le voci in cache.
Nel README trovi la lista completa dei filtri disponibili.
Content negotiation conforme agli standard
Molti plugin che promettono di gestire “Markdown per l’AI” trascurano i dettagli HTTP. Post Content to Markdown invece segue alla lettera la RFC 9110 §12.5.1:
- interpreta correttamente i q-value: una richiesta del tipo
Accept: text/html;q=0.9, text/markdown;q=1.0riceve correttamente il Markdown - ogni risposta del front-end include
Vary: Accept, così browser, proxy e CDN tengono conto dell’header Accept e non finiscono per restituire HTML a un client che ha chiesto Markdown - quando l’header
Acceptdel client esclude tutte le rappresentazioni che il sito può fornire, viene restituito un406 Not Acceptable, invece di ripiegare silenziosamente sull’HTML - ogni risposta in Markdown espone un header
X-Markdown-Source: accept | md-url | query, così dai log di accesso capisci in che modo i client stanno richiedendo il Markdown - le risposte agli URL
.mdaggiungonoX-Robots-Tag: noindex, nofollow, così i motori di ricerca non indicizzano l’alias Markdown affiancandolo alla pagina HTML canonica
Release recenti
Alcune novità recenti del plugin:
- v1.3 (#5) esegue il rendering dei blocchi Gutenberg prima della conversione e gestisce correttamente le tabelle
- v1.5 (#8, #9) allinea la content negotiation alla specifica: parsing dei q-value,
Vary: Accepte406 Not Acceptable - v1.6 (#11) introduce il suffisso
.mdcon annuncio via headerLinke tag<link> - v1.7 (#12) aggiunge la memoization su object cache, l’autodiscovery
<atom:link>nel feed RSS e l’header di rispostaX-Markdown-Source
La storia completa è su GitHub.
Come installare il plugin
composer require roots/post-content-to-markdownIl sorgente è su GitHub: issue e pull request sono benvenuti.