3 juli 2026

llms.txt handmatig in WordPress: dynamisch genereren zonder plugin

6 minuten lezen
LLMS logo

Sinds een paar maanden duikt er een nieuw bestand op in vrijwel elke discussie over AI en zoekmachines: llms.txt. “Hiermee word je genoemd door ChatGPT of Claude”, “dit is de nieuwe sitemap voor AI”, “zonder dit bestand besta je straks niet meer in AI-zoekresultaten”. Als developer die is overgestapt naar SEO, kreeg ik bij het lezen van die claims dezelfde kriebel als bij elke nieuwe SEO-hype: klinkt mooi, maar klopt het ook?

In deze blog neem ik je mee in wat llms.txt nu echt is, wat het in 2026 wel en niet doet, en waarom je het ondanks de nodige twijfel toch zou kunnen implementeren. En omdat ik vanuit mijn achtergrond als webdeveloper geen genoegen neem met “upload even een tekstbestandje”, laat ik je zien hoe je het in WordPress volledig dynamisch genereert. Geen plugin, geen handwerk, en altijd in sync met je content. Let op: test het bestand wel goed of laat dit door een specialist uitvoeren.

llms.txt is een bestand wat je op je domein plaatst, op https jouwdomein.nl/llms.txt. Het idee komt van Jeremy Howard, medeoprichter van Answer.AI en fast.ai, die de conventie in september 2024 voorstelde. De specificatie staat op llmstxt.org.

Het bestand geeft AI-systemen een opgeschoonde kaart van je belangrijkste content. In plaats van dat een taalmodel honderden HTML-pagina’s vol navigatie, cookiebanners en footers moet doorspitten om te begrijpen waar je site over gaat, lever je een nette index aan: wie je bent, wat je site behandelt en welke pagina’s de meeste waarde hebben.

Belangrijk, en dit is waar veel artikelen de plank misslaan: llms.txt is géén robots.txt. Het blokkeert niets en regelt geen toegang. Waar robots.txt bots vertelt waar ze niet mogen komen, doet llms.txt het tegenovergestelde: het wijst naar waar het goud ligt.

Naast je content kun je in llms.txt ook feiten over je bedrijf kwijt. Als een taalmodel nu iets over jouw organisatie moet vertellen, gokt het op basis van verouderde pagina’s en externe websites. In je llms.txt zet je het zelf recht: wat je doet, sinds wanneer, waar je gevestigd bent, in welke branches je actief bent en welke awards of certificeringen je hebt. Voeg dit toe als vast blok onder een kopje als “Over SDIM”, direct na de tagline. Blijf wel bij feiten die je kunt onderbouwen en die ook op je site staan, want “de beste van Nederland” is geen feit maar een claim.

Klinkt dit als een reden om het links te laten liggen? Niet helemaal. Er zijn drie redenen waarom ik het toch op de meeste sites zou neerzetten.

  1. De kosten zijn vrijwel nul. Zeker als je het dynamisch genereert, zoals ik straks laat zien, is het eenmalig instellen en daarna onderhoudsvrij.
  2. Je hebt niets te verliezen, maar wel iets te winnen. Het web beweegt richting inference-gedreven AI, waarbij een model op het moment van een vraag bepaalt welke content het ophaalt. Mocht llms.txt over een jaar wél een signaal worden, dan ben je klaar. Niet voor niets is het bestand bewust opgenomen in de HTTP Archive-analyse: niet als aanbeveling, maar als erkenning dat de adoptie iets zegt over waar het web heen kan bewegen.
  3. Het dwingt je tot een schone content-inventaris. Om een goede llms.txt te schrijven, moet je nadenken over welke pagina’s je echt wilt laten zien. Dat is een nuttige oefening op zich, los van AI.

Kortom: verwacht er geen wonderen van, maar als de moeite minimaal is en de optie reëel, waarom niet.

Voordat we gaan bouwen, even de structuur die llmstxt.org voorschrijft. Het is bewust simpel, want Markdown is de “moedertaal” van taalmodellen.

  • Een H1 met de naam van je site of project. Dit is het enige verplichte onderdeel.
  • Een blockquote met een korte samenvatting in één alinea. Optioneel, maar sterk aanbevolen.
  • Een of meer H2-secties met daaronder een lijst van Markdown-links naar je belangrijke pagina’s, eventueel met een korte beschrijving achter een dubbele punt.
  • Een speciale H2-sectie met de naam Optional voor secundaire bronnen die een model mag overslaan als het kort moet zijn.

Een minimaal voorbeeld:

# SDIM

> Digital marketing kenniscentrum sinds 2006, gespecialiseerd in SEO, SEA, CRO en analytics.

## Belangrijke pagina's

- [SEO uitbesteden](<https://www.sdim.nl/digital-marketing/seo/>): Onze aanpak en diensten voor organische groei.
- [Artikelen](<https://www.sdim.nl/artikelen/>): Ons volledige kennisarchief.

## Optional

- [Over SDIM](<https://www.sdim.nl/over-ons/>)

We gebruiken een must-use plugin (mu-plugin). Die laadt automatisch, kan niet per ongeluk worden uitgeschakeld en hoort thuis in wp-content/mu-plugins/. Maak daar een bestand aan, bijvoorbeeld llms-txt.php.

We haken in op init en controleren of het verzoek naar /llms.txt gaat. Zo ja, dan zetten we de juiste header en geven we de gegenereerde inhoud terug.

<?php
/**
 * Plugin Name: SDIM llms.txt Generator
 * Description: Genereert /llms.txt dynamisch op basis van de content van de site.
 * Version:     1.0.0
 */

add_action( 'init', 'sdim_serve_llms_txt' );

function sdim_serve_llms_txt() {
    $path = trim( parse_url( $_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH ), '/' );

    if ( 'llms.txt' !== $path ) {
        return;
    }

    header( 'Content-Type: text/plain; charset=utf-8' );
    header( 'X-Robots-Tag: noindex' );

    echo sdim_build_llms_txt();
    exit;
}

Let op één ding: als er een fysiek bestand llms.txt in je root staat, pakt je webserver dat eerst en komt WordPress nooit aan zet. Zorg dus dat dat bestand er niet is, zodat het verzoek netjes via index.php bij WordPress en dus bij deze hook terechtkomt.

Nu het leuke werk. We bouwen de Markdown op uit je sitenaam, je tagline, je belangrijkste pagina’s en je recente artikelen. Ik voeg meteen caching toe met een transient, zodat we niet bij elk verzoek de database bevragen.

function sdim_build_llms_txt() {
    $cached = get_transient( 'sdim_llms_txt' );
    if ( false !== $cached ) {
        return $cached;
    }

    $output = '# ' . get_bloginfo( 'name' ) . "\n\n";

    $tagline = get_bloginfo( 'description' );
    if ( $tagline ) {
        $output .= '> ' . $tagline . "\n\n";
    }

    // Belangrijkste pagina's, op menuvolgorde
    $pages = get_pages( array(
        'sort_column' => 'menu_order',
        'number'      => 10,
    ) );

    if ( $pages ) {
        $output .= "## Belangrijke pagina's\n\n";
        foreach ( $pages as $page ) {
            $output .= sdim_llms_line( $page );
        }
        $output .= "\n";
    }

    // Recente artikelen
    $posts = get_posts( array(
        'numberposts' => 20,
        'post_status' => 'publish',
        'orderby'     => 'date',
        'order'       => 'DESC',
    ) );

    if ( $posts ) {
        $output .= "## Recente artikelen\n\n";
        foreach ( $posts as $post ) {
            $output .= sdim_llms_line( $post );
        }
    }

    set_transient( 'sdim_llms_txt', $output, DAY_IN_SECONDS );

    return $output;
}

De helper hieronder bouwt één nette regel per pagina of bericht, met een korte beschrijving als er een handmatige samenvatting is ingevuld:

function sdim_llms_line( $post ) {
    $title = get_the_title( $post );
    $url   = get_permalink( $post );

    $summary = has_excerpt( $post ) ? get_the_excerpt( $post ) : '';
    $summary = trim( preg_replace( '/\s+/', ' ', wp_strip_all_tags( $summary ) ) );

    if ( $summary ) {
        return sprintf( "- [%s](%s): %s\n", $title, $url, $summary );
    }

    return sprintf( "- [%s](%s)\n", $title, $url );
}

En om te zorgen dat het bestand vers blijft, gooien we de cache leeg zodra je iets publiceert of bijwerkt:

add_action( 'save_post', function () {
    delete_transient( 'sdim_llms_txt' );
} );

Dat is alles. Ga naar https://jouwdomein.nl/llms.txt en je ziet een keurig opgebouwd bestand dat zichzelf onderhoudt. Wil je meer controle, dan kun je in plaats van automatisch je laatste artikelen op te halen ook werken met een lijst van handmatig gekozen cornerstone-pagina’s, bijvoorbeeld via een custom field of een categorie. Zo houd jij de regie over wat je laat zien.

llms.txt is in 2026 vooral een belofte, nog geen bewezen rankingfactor. Wie je het tegendeel vertelt, verkoopt je lucht. Tegelijk zijn de kosten om het goed te doen zo laag dat het zonde is om de optie te laten liggen, zeker als je het dynamisch genereert zodat je er nooit meer naar hoeft om te kijken. Je bouwt een nette index van je belangrijkste content, je bent klaar mocht het signaal alsnog relevant worden, en je voorkomt de duplicate-content-valkuil waar anderen instappen.

Wil je sparren over hoe je jouw WordPress-site klaarmaakt voor AI-zoekmachines, of loop je tegen een technisch SEO-vraagstuk aan? Neem gerust contact op met de specialisten van SDIM. Of kom langs voor een kop koffie.

Webanalytics

Hulp van een specialist?

Contact

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *