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 :

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, subtitle ou tagline, 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 question et answer, 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 :

json
"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

ts
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.

js
// astro.config.mjs
import { aiReady } from 'leiho/ai-ready';

export default defineConfig({
  site: 'https://example.com',
  integrations: [aiReady()],
});
bash
# Tout autre build statique
npx leiho ai-ready --site https://example.com --dir out

Le 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 :

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.

Un point pas clair sur cette page ? Dites-le-nous →