Handleidingen · n8n

Automatisch blog publiceren vanuit Notion naar WordPress met n8n en Claude

Publiceer automatisch van Notion naar WordPress via n8n, met Claude voor herschrijven en SEO. Handleiding voor contentteams in het MKB.

🟡 Gevorderd — beetje technisch ⏱ 75 minuten
Tools: Notionn8nWordPressClaude
Goud-op-zwart illustratie: een AI-pen verbonden met artikel, socialpost, nieuwsbrief en megafoon

Content schrijven kost moeite. Publiceren zou dat niet moeten doen. Toch gaat er bij veel MKB'ers elke week kostbare tijd verloren aan het kopiëren van tekst van Notion naar WordPress, het handmatig invullen van SEO-velden, het uploaden van afbeeldingen en het aanmaken van slugs.

Met n8n als orkestrator en Claude als SEO-brein automatiseer je dit volledig. Je schrijft in Notion zoals je gewend bent, en zodra je de status op 'Publiceer' zet, wordt de post automatisch klaargezet en gepubliceerd in WordPress. Dit is hoe je het opzet.

Stap 1: Notion database opzetten met Publiceer-status

Maak een nieuwe database aan in Notion voor je blogposts. Dit is je redactionele werkplek. Voeg de volgende velden toe: Titel (Title), Status (Select: Concept / Review / Publiceer / Gepubliceerd), Auteur (Person), Categorie (Select), Tags (Multi-select), Afbeelding-URL (URL) en WordPress-ID (Number -- wordt achteraf ingevuld).

Het veld 'Status' is je trigger. Zodra je een post op 'Publiceer' zet, detecteert n8n dit en start de workflow. Het veld 'WordPress-ID' wordt teruggeschreven nadat WordPress de post heeft aangemaakt, zodat je altijd weet welke Notion-post bij welke WordPress-post hoort.

Notion database velden (minimaal):

- Titel         | Title
- Status        | Select: Concept / Review / Publiceer / Gepubliceerd
- Auteur        | Person
- Categorie     | Select: Nieuws / Handleidingen / Kennisbank / Tools
- Tags          | Multi-select
- Afbeelding    | URL (voor featured image)
- WordPress-ID  | Number (teruggeschreven door n8n)
- Gepubliceerd  | Date (automatisch ingevuld)

Stap 2: n8n Notion-trigger configureren

Maak een nieuw n8n-workflow aan. Voeg als eerste node de 'Notion Trigger' toe. Authenticeer met je Notion API-key (maak een integratie aan via notion.so/my-integrations en geef toegang tot je blogdatabase).

Stel de trigger in op 'Page Updated' en filter op de database-ID van je blogposts-database. n8n controleert standaard elke minuut op wijzigingen. Voeg een IF-node toe die alleen doorgaat als het veld 'Status' gelijk is aan 'Publiceer'. Zo voorkom je dat elke kleine aanpassing de workflow triggert.

{
  "trigger": "Notion - Page Updated",
  "database_id": "jouw-notion-database-id",
  "polling_interval": "1 minuut",
  "filter_node": {
    "type": "IF",
    "condition": "Status == 'Publiceer'"
  }
}

Stap 3: Content extraheren uit Notion blocks

Een Notion-pagina bestaat uit 'blocks': paragrafen, koppen, lijsten, code, afbeeldingen. De Notion API geeft deze terug als JSON. Voeg een 'Notion - Get Page Blocks' node toe die alle blocks van de getriggerde pagina ophaalt.

Gebruik een Code-node (JavaScript) om de Notion-blocks om te zetten naar HTML die WordPress begrijpt. Dit is het meest technische onderdeel van de workflow. Notion gebruikt een eigen formaat; WordPress verwacht HTML of Gutenberg-blocks.

// n8n Code node: Notion blocks naar HTML
const blocks = $input.all()[0].json.results;
let html = '';

for (const block of blocks) {
  const type = block.type;
  
  if (type === 'paragraph') {
    const text = block.paragraph.rich_text
      .map(t => t.plain_text).join('');
    html += `<p>${text}</p>\n`;
  }
  
  if (type === 'heading_2') {
    const text = block.heading_2.rich_text
      .map(t => t.plain_text).join('');
    html += `<h2>${text}</h2>\n`;
  }
  
  if (type === 'heading_3') {
    const text = block.heading_3.rich_text
      .map(t => t.plain_text).join('');
    html += `<h3>${text}</h3>\n`;
  }
  
  if (type === 'bulleted_list_item') {
    const text = block.bulleted_list_item.rich_text
      .map(t => t.plain_text).join('');
    html += `<li>${text}</li>\n`;
  }
  
  if (type === 'code') {
    const code = block.code.rich_text
      .map(t => t.plain_text).join('');
    const lang = block.code.language;
    html += `<pre><code class="language-${lang}">${code}</code></pre>\n`;
  }
  
  if (type === 'image') {
    const url = block.image.type === 'external' 
      ? block.image.external.url 
      : block.image.file.url;
    html += `<img src="${url}" alt="" />\n`;
  }
}

return [{ json: { html_content: html } }];

Stap 4: Claude SEO-titel, meta en slug laten genereren

Geef de HTML-content door aan Claude via de Anthropic API node in n8n. Vraag Claude drie dingen te genereren: een SEO-geoptimaliseerde paginatitel (max. 60 tekens), een meta-omschrijving (max. 155 tekens) en een URL-slug. Geef Claude ook de ruwe Notion-titel mee als context.

Claude systeem-prompt voor SEO-generatie:

Je bent een Nederlandse SEO-specialist. 
Op basis van de meegestuurde blogtekst genereer je:
1. SEO-titel: max. 60 tekens, pakkend, bevat het hoofdzoekwoord
2. Meta-omschrijving: max. 155 tekens, overtuigend, bevat het zoekwoord
3. URL-slug: lowercase, koppeltekens, geen stopwoorden, max. 5-7 woorden

Geef je antwoord als JSON:
{
  "seo_titel": "...",
  "meta_omschrijving": "...",
  "slug": "..."
}

Blogtitel: [NOTION_TITEL]
Blogtekst:
[HTML_CONTENT]

Voeg een JSON Parse-node toe om de Claude-output te verwerken. Valideer dat alle drie velden aanwezig zijn en dat ze de lengtelimieten respecteren. Voeg een fallback toe die de Notion-titel gebruikt als Claude onverwacht geen output geeft.

Stap 5: Afbeeldingen uploaden naar WordPress media

Als de blogpost afbeeldingen bevat die extern gehost zijn (bijv. Notion file-upload of Unsplash), moeten deze worden gedownload en geupload naar WordPress. Gebruik een HTTP Request-node om de afbeelding te downloaden en de WordPress Media API om ze te uploaden.

// n8n HTTP Request: afbeelding uploaden naar WordPress
// Node configuratie:
// - Method: POST
// - URL: https://jouwsite.nl/wp-json/wp/v2/media
// - Authentication: Basic Auth (WordPress gebruikersnaam + Application Password)
// - Body type: Form Data

const formData = {
  file: $binary.data,
  title: 'Blogpost afbeelding',
  alt_text: $json.alt_tekst,
  caption: $json.bijschrift
};

// Response bevat:
// {
//   "id": 1234,
//   "source_url": "https://jouwsite.nl/wp-content/uploads/..."
// }

Sla het media-ID op dat WordPress teruggeeft. Dit gebruik je straks als featured image ID bij het aanmaken van de post. Vervang tegelijk alle afbeelding-URLs in de HTML-content door de nieuwe WordPress-URLs, zodat er geen verwijzingen naar externe bronnen overblijven.

Stap 6: WordPress REST API post aanmaken

Nu alle onderdelen klaar zijn, maak je de WordPress-post aan via de REST API. Stuur een POST-verzoek naar /wp-json/wp/v2/posts met alle data samengevoegd.

{
  "title": "{{ $json.seo_titel }}",
  "content": "{{ $json.html_content }}",
  "status": "publish",
  "slug": "{{ $json.slug }}",
  "excerpt": "{{ $json.meta_omschrijving }}",
  "featured_media": "{{ $json.media_id }}",
  "categories": [2],
  "tags": [],
  "meta": {
    "_yoast_wpseo_title": "{{ $json.seo_titel }}",
    "_yoast_wpseo_metadesc": "{{ $json.meta_omschrijving }}"
  }
}

Authenticeer via een WordPress Application Password (maak aan via Gebruikers > Profiel > Application Passwords in je WordPress-beheer). Gebruik Basic Auth in n8n met je WordPress-gebruikersnaam en het Application Password als wachtwoord.

Stap 7: Status terugschrijven naar Notion

Na succesvolle publicatie in WordPress schrijft n8n twee velden terug naar Notion: het veld 'Status' wordt bijgewerkt naar 'Gepubliceerd' en het veld 'WordPress-ID' krijgt het ID van de nieuw aangemaakte post.

{
  "notion_node": "Update Page",
  "page_id": "{{ $json.notion_page_id }}",
  "properties": {
    "Status": {
      "select": { "name": "Gepubliceerd" }
    },
    "WordPress-ID": {
      "number": "{{ $json.wordpress_post_id }}"
    },
    "Gepubliceerd": {
      "date": { "start": "{{ new Date().toISOString().split('T')[0] }}" }
    }
  }
}

Voeg ook een foutafhandeling toe: als een stap mislukt, zet de status terug op 'Review' en stuur een Slack-notificatie met de foutmelding. Zo weet je altijd wanneer de automatisering aandacht nodig heeft.

Stap 8: Plannen en testen van de workflow

Test de workflow voor je hem in productie neemt. Maak een testpost in Notion met de status 'Publiceer'. Voer de n8n-workflow handmatig uit (druk op 'Test workflow') en volg elke stap door de logs te controleren.

Controleer in WordPress of de post correct is aangemaakt: juiste titel, content, featured image, SEO-velden en slug. Controleer in Notion of de status is bijgewerkt naar 'Gepubliceerd' en het WordPress-ID is ingevuld.

Wanneer de test slaagt, activeer de workflow. n8n controleert nu automatisch elke minuut of er nieuwe posts op 'Publiceer' staan. De gemiddelde doorlooptijd van trigger tot publicatie is 2-3 minuten.

Troubleshooting: meestgemaakte problemen

Notion trigger detecteert wijziging niet: controleer of de Notion-integratie toegang heeft tot de database. Ga in Notion naar de database, klik op de drie puntjes rechtsboven en kies 'Add connections'. Voeg je n8n-integratie toe.

Claude geeft geen valide JSON terug: voeg aan je prompt toe: 'Geef uitsluitend raw JSON terug, geen uitleg, geen markdown-opmaak, geen codeblokken.' Voeg ook een response_format parameter toe als je de Anthropic API direct aanspreekt.

WordPress geeft 401 Unauthorized: controleer of je Application Password correct is ingevoerd. Application Passwords in WordPress bevatten spaties (bijv. 'AbCd EfGh IjKl MnOp') -- zorg dat je ze precies zo invult in n8n.

Afbeeldingen worden niet gevonden na publicatie: Notion-afbeeldingen die zijn geupload als bestand hebben tijdelijk geldige URLs die verlopen. Verwerk afbeeldingen direct nadat de trigger is afgegaan, niet later in de workflow.

De workflow is klaar. Van nu af aan is publiceren zo simpel als een status wijzigen. Je schrijft beter omdat je workflow geen belemmering meer is. En je publiceert consistenter omdat de drempel zo laag is.

Gerelateerd

Nieuwsbrief

Meer handleidingen en tips?

Elke week de beste agentic AI inzichten en nieuwe handleidingen in je inbox.

Gratis aanmelden →