Guides
SEO et recherche IA
Données structurées, llms.txt et Markdown tirés de vos champs.
Les moteurs de recherche et les assistants IA (ChatGPT, Claude, Perplexity, les réponses IA de Google) lisent mieux une page qui dit ce qu’elle est. Leiho le construit à partir des champs que vous avez déjà : pas d’onglet SEO pour les rédacteurs, rien de stocké deux fois.
Décrire une collection
Dans Collections → une collection → Recherche et IA, ou dans leiho.schema.json :
{
"id": "doc",
"path": "/docs/{slug}",
"seo": { "type": "TechArticle", "description": "summary", "image": "cover", "faq": "faq" },
"fields": [ … ]
}- type : le type schema.org. Pages :
WebPage(par défaut),AboutPage,ContactPage,CollectionPage,FAQPage,ProfilePage. Articles :Article,BlogPosting(par défaut pour les articles),NewsArticle,TechArticle. Sujets :Product,Service,Event,Course,SoftwareApplication,Person,Organization,LocalBusiness,Place,Recipe,CreativeWork. - title, description, image : les champs qui les portent. Sans champ de description, Leiho prend un champ texte nommé
description,summary,intro,excerpt,lead,subtitleoutagline, puis le premier texte assez long, puis la méta-description de Yoast, Rank Math, SEOPress ou All in One SEO, puis l’extrait. - faq : une liste avec des champs
questionetanswer, publiée comme une FAQ. - llms: false retire la collection de
llms.txt.
Ce que sert l’API de contenu
Chaque contenu reçoit un bloc seo, dans la langue de la requête :
"seo": {
"type": "TechArticle",
"title": "Install",
"description": "Install the plugin, connect your site, annotate your markup.",
"image": { "url": "…", "alt": "…" },
"faq": [ { "question": "…", "answer": "…" } ],
"llms": true,
"jsonld": [ { "@type": "WebPage", … }, { "@type": "TechArticle", … }, { "@type": "FAQPage", … } ]
}Le filtre leiho_seo ajoute ce que vous seul savez, comme le prix d’un produit ou le lieu d’un événement.
L’écrire dans la page
import { leihoGraph, jsonLd, seoMeta } from 'leiho/seo';
const graph = leihoGraph({
url: 'https://example.com/docs/install',
item,
site: { url: 'https://example.com', name: 'Example', locales: ['en', 'fr'] },
organization: { name: 'Example Inc.', logo: '/logo.png' },
breadcrumbs: [{ name: 'Docs', url: '/docs' }, { name: item.title }],
});
const { title, description, meta } = seoMeta(item, { url, siteName: 'Example' });
// <script type="application/ld+json">{jsonLd(graph)}</script>leihoGraph() place les nœuds du contenu sur l’adresse canonique de la page et les relie à votre site, votre organisation et au fil d’Ariane. seoMeta() renvoie la description et les balises Open Graph à écrire avec votre framework.
llms.txt et Markdown
Un site statique les tire de ses propres pages après le build : un page.md à côté de chaque page, llms.txt et llms-full.txt par langue, et un sitemap.xml avec les autres langues de chaque page et sa date.
// astro.config.mjs
import { aiReady } from 'leiho/ai-ready';
export default defineConfig({
site: 'https://example.com',
integrations: [aiReady()],
});# Tout autre build statique
npx leiho ai-ready --site https://example.com --dir outLe Markdown vient du <main> de chaque page. Navigation, boutons, svg, canvas et tout ce qui porte aria-hidden="true" ou data-md-skip sont laissés de côté.
Un front rendu à la demande peut les demander à WordPress :
| Endpoint | Renvoie |
|---|---|
GET /wp-json/leiho/v1/llms.txt |
Le llms.txt du site. ?full=1 ajoute le texte de chaque entrée, ?md=1 lie les page.md, ?locale=fr dans une langue. |
GET /wp-json/leiho/v1/markdown?path=/docs/install |
Une entrée en Markdown, avec un en-tête Link canonique. |
Répondre à Accept: text/markdown
Pour servir le Markdown à l’adresse même de la page, réécrivez côté serveur quand le client le demande. Avec nginx :
map $http_accept $wants_markdown {
default 0;
"~*text/markdown" 1;
}
location / {
if ($wants_markdown) {
rewrite ^/$ /index.md last;
rewrite "^((?:/[^./]+)+)$" $1.md last;
}
add_header Vary Accept;
try_files $uri $uri/index.html =404;
}Laisser entrer les robots IA
Être cité commence par être lu. Un robots.txt qui nomme les assistants bienvenus (GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended…) et indique votre sitemap suffit.