Septembre 2024 : c’est la date d’apparition du standard llms.txt, une proposition encore jeune qui vise à donner aux modèles de langage un résumé structuré et lisible du contenu d’un site, en complément du sitemap XML classique pensé pour les moteurs de recherche traditionnels. Sur un thème que je maintiens pour un client éditeur de contenus techniques, la question s’est posée rapidement : fallait-il installer une extension dédiée pour générer ce fichier, ou pouvait-on s’appuyer sur ce que le thème savait déjà de sa propre structure de contenu ?
La seconde option l’a emporté. Le thème connaît déjà l’ensemble de ses types de contenu déclarés, leurs libellés et leurs URL : autant s’en servir directement plutôt que de dupliquer cette connaissance dans une extension tierce à maintenir en plus.
Ce que contient un fichier llms.txt
Contrairement au sitemap XML, structuré et pensé pour l’indexation, llms.txt privilégie un format Markdown simple : un titre, une courte description du site, puis des sections qui listent les contenus principaux avec leur URL et un résumé bref. L’objectif n’est pas l’exhaustivité mais la lisibilité pour un système qui traite du texte plutôt que du balisage.
# Nom du site
> Description courte du site en une ou deux phrases.
## Articles principaux
- [Titre de l'article](https://exemple.fr/article-1/): résumé bref
- [Titre d'un autre article](https://exemple.fr/article-2/): résumé bref

Générer le contenu depuis les types de contenu du thème
Le thème déclare plusieurs types de contenu (articles techniques, études de cas, glossaire). Plutôt que de coder en dur la structure du fichier, la génération parcourt dynamiquement ces types de contenu, avec une requête WP_Query limitée aux contenus publiés les plus récents pour chaque catégorie.
function generer_contenu_llms_txt() {
$sortie = "# " . get_bloginfo( 'name' ) . "\n\n";
$sortie .= "> " . get_bloginfo( 'description' ) . "\n\n";
$types = array(
'post' => 'Articles principaux',
'etude_de_cas' => 'Études de cas',
);
foreach ( $types as $type => $titre_section ) {
$requete = new WP_Query( array(
'post_type' => $type,
'posts_per_page' => 30,
'post_status' => 'publish',
) );
if ( ! $requete->have_posts() ) {
continue;
}
$sortie .= "## {$titre_section}\n\n";
while ( $requete->have_posts() ) {
$requete->the_post();
$sortie .= sprintf(
"- [%s](%s): %s\n",
get_the_title(),
get_permalink(),
wp_trim_words( get_the_excerpt(), 20 )
);
}
wp_reset_postdata();
}
return $sortie;
}
Servir le fichier via un point de terminaison, pas un fichier statique
Écrire un fichier statique à la racine du site poserait un problème d’actualisation : chaque nouvelle publication nécessiterait une régénération manuelle. À la place, une règle de réécriture intercepte la requête /llms.txt et sert le contenu généré à la volée, avec un cache transitoire pour éviter de reconstruire la chaîne à chaque visite du fichier.
add_action( 'init', function () {
add_rewrite_rule( '^llms\.txt$', 'index.php?llms_txt=1', 'top' );
} );
add_filter( 'query_vars', function ( $vars ) {
$vars[] = 'llms_txt';
return $vars;
} );
add_action( 'template_redirect', function () {
if ( ! get_query_var( 'llms_txt' ) ) {
return;
}
$contenu = get_transient( 'llms_txt_cache' );
if ( false === $contenu ) {
$contenu = generer_contenu_llms_txt();
set_transient( 'llms_txt_cache', $contenu, HOUR_IN_SECONDS );
}
header( 'Content-Type: text/plain; charset=utf-8' );
echo $contenu;
exit;
} );
Invalider le cache à chaque publication
Le transitoire mis en place à l’étape précédente évite de régénérer le fichier à chaque requête, mais il faut aussi s’assurer qu’il ne reste pas périmé trop longtemps après une nouvelle publication. Un hook sur save_post supprime le transitoire dès qu’un contenu concerné est publié ou mis à jour.
delete_transient( 'llms_txt_cache' )déclenché sursave_postpour les types de contenu concernés.- Un rafraîchissement des règles de réécriture nécessaire une seule fois, via
flush_rewrite_rules()à l’activation du thème. - Aucune dépendance à une extension tierce, aucun fichier à régénérer manuellement après publication.
Un fichier comme llms.txt gagne à être généré dynamiquement plutôt qu’écrit une fois pour toutes : le contenu d’un site change en continu, et un fichier statique oublié devient vite une source d’information obsolète plus nuisible qu’utile.
En résumé
Ce standard encore jeune ne nécessite ni extension ni service tiers pour être mis en place correctement : un thème qui connaît déjà sa propre structure de contenu peut générer ce fichier en quelques dizaines de lignes de functions.php, avec une invalidation de cache alignée sur le rythme réel de publication du site.