
Workflow-Name: WordPress Draft → Bild-Briefing
1. Kurzüberblick
Dieser Workflow holt automatisch den neuesten WordPress-Entwurf (Draft), liest den Artikel-Inhalt, lässt eine KI (OpenAI) daraus ein Bild-Briefing erstellen und speichert alles in einem Google Doc.
Merksatz: WordPress-Draft → Text bereinigen → KI erstellt Bildprompt → Google Doc speichern.
2. Was macht dieser Workflow?
In einfachen Worten
Du klickst auf „Execute workflow“. Der Workflow holt deinen neuesten WordPress-Entwurf, bereitet den Text auf, schickt ihn an OpenAI und bekommt zurück: Bildprompt (für ElevenLabs), Negative Prompt, Alt-Text, Titel, Beschreibung und Caption. All das wird in ein neues Google Doc geschrieben.
Welches Problem löst er?
Blog-Autoren brauchen oft ein Featured Image (Beitragsbild). Dafür muss man einen guten Bildprompt schreiben, Alt-Text und Caption formulieren und alles dokumentieren. Der Workflow übernimmt diese Arbeit automatisch.
Für wen ist er nützlich?
- Blog-Autoren mit WordPress
- Content-Teams, die Bild-Briefings brauchen
- SEO-Leute, die Alt-Texte brauchen
- Alle, die Bildprompts für ElevenLabs Image Creation nutzen
3. Ablauf als einfache Prozesskette
Manueller Start
↓
WordPress: Neuesten Draft holen (1 Stück)
↓
Code: HTML entfernen, sauberen Text extrahieren
↓
OpenAI: Bild-Briefing als JSON erstellen
↓
Code: JSON auslesen, Dokument-Text formatieren
↓
Google Docs: Leeres Dokument anlegen
↓
Google Docs: Inhalt einfügen
↓
Fertig: Google Doc mit Bild-Briefing
Es gibt keine Verzweigungen. Alle 7 Nodes laufen nacheinander in einer geraden Linie.
4. Analyse der einzelnen Nodes
Node 1: When clicking ‘Execute workflow’
| Eigenschaft | Wert |
|---|---|
| Typ | Manual Trigger |
| Zweck | Startet den Workflow per Klick |
Daten rein: Keine. Daten raus: Start-Signal.
Wenn weggelassen: Der Workflow startet nicht (außer du ersetzt ihn durch einen anderen Trigger).
Node 2: Get many posts
| Eigenschaft | Wert |
|---|---|
| Typ | WordPress |
| Zweck | Holt WordPress-Beiträge über die REST-API |
Wichtige Einstellungen:
Operation: getAll
Limit: 1
Order: desc
Order By: date
Status: draft
Credentials: WordPress API (WordPress account).
Daten raus (Beispiel):
{
"id": 123,
"title": { "rendered": "Mein Artikel-Titel" },
"content": { "rendered": "<p>HTML-Inhalt...</p>" },
"excerpt": { "rendered": "<p>Kurztext...</p>" },
"slug": "mein-artikel-titel",
"link": "https://deine-site.de/?p=123"
}
Wenn falsch eingestellt: Kein Draft gefunden, falsche Posts, oder zu hohe OpenAI-Kosten.
Node 3: Code in JavaScript
| Eigenschaft | Wert |
|---|---|
| Typ | Code (JavaScript) |
| Zweck | WordPress-HTML in lesbaren Text umwandeln |
Vollständiger Code:
const html = $json.content?.rendered || '';
const cleanText = html
.replace(/<script[\s\S]*?<\/script>/gi, '')
.replace(/<style[\s\S]*?<\/style>/gi, '')
.replace(/<[^>]+>/g, ' ')
.replace(/\s+/g, ' ')
.trim();
return [
{
json: {
post_id: $json.id,
title: $json.title?.rendered || '',
slug: $json.slug || '',
excerpt: ($json.excerpt?.rendered || '').replace(/<[^>]+>/g, ' ').trim(),
article_text: cleanText,
link: $json.link || '',
},
},
];
Daten raus (Beispiel):
{
"post_id": 123,
"title": "Mein Artikel-Titel",
"slug": "mein-artikel-titel",
"excerpt": "Kurztext ohne HTML",
"article_text": "Volltext ohne HTML und ohne Scripts",
"link": "https://deine-site.de/?p=123"
}
Warum hier? KI versteht Plain Text besser als HTML.
Node 4: Message a model
| Eigenschaft | Wert |
|---|---|
| Typ | OpenAI (LangChain) |
| Modell | gpt-4.1-mini |
| Zweck | KI erstellt Bild-Briefing aus Artikel-Inhalt |
System Message:
Du antwortest immer ausschließlich mit gültigem JSON. Kein Markdown, keine Erklärung, kein Text außerhalb des JSON.
User Message (Expression-Modus mit = aktivieren):
Du bist ein SEO- und Creative-Assistant für WordPress-Blogartikel.
Analysiere den folgenden WordPress-Draft und erstelle ein Bildkonzept für ein Featured Image.
Erstelle:
- einen Bildprompt für ElevenLabs Image Creation auf Englisch
- einen Negative Prompt auf Englisch
- einen Alt Text auf Deutsch
- einen Bildtitel auf Deutsch
- eine Bildbeschreibung auf Deutsch
- eine Caption auf Deutsch
Regeln:
- Das Bild soll professionell, modern und hochwertig wirken.
- Es soll als Blog-Featured-Image funktionieren.
- Kein lesbarer Text im Bild.
- Keine Logos.
- Keine Wasserzeichen.
- Keine echten Markenoberflächen, wenn nicht nötig.
- Alt Text maximal 125 Zeichen.
- Antworte ausschließlich als gültiges JSON.
Artikel-Titel:
{{ $json.title }}
Artikel-Auszug:
{{ $json.excerpt }}
Artikel-Inhalt:
{{ $json.article_text }}
JSON-Format:
{
"image_prompt": "",
"negative_prompt": "",
"alt_text": "",
"image_title": "",
"image_description": "",
"caption": "",
"recommended_style": "",
"recommended_aspect_ratio": "16:9"
}
Erwartete KI-Antwort (Beispiel):
{
"image_prompt": "Modern minimalist home office with laptop, soft natural light, professional blog header style",
"negative_prompt": "text, logo, watermark, blurry, low quality",
"alt_text": "Modernes Homeoffice mit Laptop und Tageslicht",
"image_title": "Homeoffice Featured Image",
"image_description": "Ein professionelles Bild für einen Blogartikel über Homeoffice.",
"caption": "Produktives Arbeiten von zu Hause aus.",
"recommended_style": "modern, clean, professional",
"recommended_aspect_ratio": "16:9"
}
Node 5: Code in JavaScript1
| Eigenschaft | Wert |
|---|---|
| Typ | Code (JavaScript) |
| Zweck | OpenAI-Antwort parsen und für Google Docs formatieren |
Vollständiger Code:
const raw =
$json.output?.[0]?.content?.[0]?.text ||
$json["0"]?.content?.[0]?.text ||
$json.text ||
$json.message ||
$json.content ||
'';
if (!raw) {
throw new Error('Kein OpenAI Text Output gefunden.');
}
let parsed;
try {
parsed = JSON.parse(raw);
} catch (error) {
throw new Error('AI output is not valid JSON: ' + raw);
}
const safeTitle =
parsed.image_title ||
'WordPress Bild-Briefing';
const documentText = `
Bild-Briefing für WordPress Featured Image
========================================
Bildtitel:
${parsed.image_title || ''}
========================================
ElevenLabs Image Prompt:
${parsed.image_prompt || ''}
========================================
Negative Prompt:
${parsed.negative_prompt || ''}
========================================
Alt Text:
${parsed.alt_text || ''}
========================================
Bildbeschreibung:
${parsed.image_description || ''}
========================================
Caption:
${parsed.caption || ''}
========================================
Empfohlener Stil:
${parsed.recommended_style || ''}
========================================
Empfohlenes Seitenverhältnis:
${parsed.recommended_aspect_ratio || '16:9'}
`;
return [
{
json: {
...parsed,
document_title: `Bild-Briefing - ${safeTitle}`,
document_text: documentText.trim(),
},
},
];
Daten raus (Beispiel):
{
"image_prompt": "...",
"negative_prompt": "...",
"alt_text": "...",
"image_title": "...",
"image_description": "...",
"caption": "...",
"recommended_style": "...",
"recommended_aspect_ratio": "16:9",
"document_title": "Bild-Briefing - Homeoffice Featured Image",
"document_text": "Bild-Briefing für WordPress Featured Image\n\n..."
}
Node 6: Create a document
| Eigenschaft | Wert |
|---|---|
| Typ | Google Docs |
| Zweck | Leeres Google Doc anlegen |
Wichtige Einstellungen:
Drive ID: myDrive
Folder ID: (leer = Root-Ordner)
Title: ={{ $json.document_title }}
Daten raus (Beispiel):
{
"id": "1a2b3c4d5e6f7g8h9i0j",
"title": "Bild-Briefing - Homeoffice Featured Image"
}
Node 7: Update a document
| Eigenschaft | Wert |
|---|---|
| Typ | Google Docs |
| Zweck | Text in das gerade erstellte Dokument einfügen |
Wichtige Einstellungen:
Operation: update
Document URL: ={{ $('Create a document').item.json.id }}
Action: insert
Text: ={{ $('Code in JavaScript1').item.json.document_text }}
Warum $('Node-Name')? Die Update-Node braucht die Doc-ID aus „Create a document“ und den Text aus „Code in JavaScript1“ – nicht nur die direkt vorherige Node.
5. Schritt-für-Schritt-Anleitung zum Nachbauen
Schritt 1: Trigger erstellen
- + klicken → Manual Trigger hinzufügen
- Name:
When clicking 'Execute workflow' - Mit der nächsten Node verbinden
Schritt 2: WordPress-Post abrufen
- + → WordPress hinzufügen
- Name:
Get many posts - WordPress-Credentials einrichten
- Diese Werte eintragen:
Resource: Post
Operation: Get Many
Limit: 1
Status: draft
Order By: date
Order: desc
- Mit Schritt 3 verbinden
Schritt 3: HTML bereinigen
- + → Code → JavaScript
- Name:
Code in JavaScript - Mode: Run Once for All Items
- Den Code aus Abschnitt 4 (Node 3) einfügen
- Mit Schritt 4 verbinden
Schritt 4: OpenAI – Bild-Briefing erstellen
- + → OpenAI → Message a model
- Name:
Message a model - OpenAI-Credentials einrichten
- Modell:
gpt-4.1-mini - System Message und User Message aus Abschnitt 4 (Node 4) einfügen
- Mit Schritt 5 verbinden
Schritt 5: OpenAI-Antwort verarbeiten
- + → Code → JavaScript
- Name:
Code in JavaScript1 - Den Code aus Abschnitt 4 (Node 5) einfügen
- Mit Schritt 6 verbinden
Schritt 6: Google Doc anlegen
- + → Google Docs
- Name:
Create a document - Google OAuth verbinden
- Title-Feld als Expression setzen:
={{ $json.document_title }}
- Mit Schritt 7 verbinden
Schritt 7: Google Doc befüllen
- + → Google Docs
- Name:
Update a document - Operation: Update
- Diese Expressions eintragen:
Document URL:
={{ $('Create a document').item.json.id }}
Text:
={{ $('Code in JavaScript1').item.json.document_text }}
Schritt 8: Testen
- Mindestens einen WordPress-Entwurf anlegen
- Execute workflow klicken
- Alle Nodes müssen grün werden
- Google Doc prüfen
6. Erklärung der Expressions und Variablen
Artikel-Daten im OpenAI-Prompt
{{ $json.title }}
{{ $json.excerpt }}
{{ $json.article_text }}
| Expression | Woher | Wofür |
|---|---|---|
{{ $json.title }} | Code Node 1 | Artikel-Titel an die KI |
{{ $json.excerpt }} | Code Node 1 | Kurztext an die KI |
{{ $json.article_text }} | Code Node 1 | Volltext an die KI |
Einfach gesagt: Nimm Titel, Auszug und Text aus dem aktuellen Datensatz.
Beispiel-Eingabe:
{
"title": "10 Tipps für besseres SEO",
"excerpt": "So verbesserst du dein Ranking...",
"article_text": "SEO ist wichtig, weil..."
}
Dokument-Titel in Google Docs
={{ $json.document_title }}
Einfach gesagt: Benenne das Google Doc wie der Code es vorgibt.
Beispiel-Ausgabe:
Bild-Briefing - Modernes Homeoffice mit Laptop
Doc-ID aus der Create-Node
={{ $('Create a document').item.json.id }}
Einfach gesagt: Greife auf die ID des gerade erstellten Google Docs zu.
Beispiel:
1a2b3c4d5e6f7g8h9i0j
Dokument-Text aus der zweiten Code-Node
={{ $('Code in JavaScript1').item.json.document_text }}
Einfach gesagt: Füge den formatierten Briefing-Text ein, den Code in JavaScript1 gebaut hat.
WordPress HTML im ersten Code-Block
$json.content?.rendered
Einfach gesagt: Nimm den HTML-Inhalt des WordPress-Posts – aber nur, wenn er existiert.
OpenAI-Antwort im zweiten Code-Block
$json.output?.[0]?.content?.[0]?.text
Einfach gesagt: Suche den KI-Text an verschiedenen möglichen Stellen in der n8n-Antwort.
7. Warum wurde der Workflow so aufgebaut?
Datenfluss von Schritt zu Schritt
Trigger: (leer)
WordPress: id, title, content, excerpt, slug, link
Code 1: post_id, title, slug, excerpt, article_text, link
OpenAI: JSON-String mit Bild-Feldern
Code 2: parsed Felder + document_title + document_text
Create Doc: Google Doc id + Metadaten
Update Doc: Befülltes Dokument
Die Idee hinter der Reihenfolge
- Trigger – kontrollierter Start
- WordPress – nur 1 Draft = fokussiert und günstig
- Code 1 – Datenvorbereitung für die KI
- OpenAI – intelligente Bild-Idee
- Code 2 – Antwort strukturieren
- Google Create + Update – Dokument anlegen und befüllen
Mögliche Fehler und Vermeidung
| Risiko | Vermeidung |
|---|---|
| Kein Draft | Vor dem Test Entwurf anlegen |
| Kein gültiges JSON von OpenAI | System-Prompt verschärfen |
| Google OAuth abgelaufen | Credentials neu verbinden |
| Sehr langer Artikel | article_text ggf. kürzen |
8. Typische Fehler und Lösungen
| Fehler | Ursache | Lösung |
|---|---|---|
| Workflow startet nicht | Kein Trigger | Manual Trigger setzen |
| Keine WordPress-Daten | Kein Draft | Entwurf anlegen, status: draft prüfen |
| WordPress 401/403 | Falsche Credentials | Application Password neu erstellen |
Kein OpenAI Text Output gefunden | Andere Antwort-Struktur | Code in JavaScript1 prüfen |
AI output is not valid JSON | KI antwortet mit Text/Markdown | System-Prompt verschärfen |
| Google Doc leer | Update-Node fehlt | Expressions prüfen |
| Expression-Fehler | Node-Name geändert | Namen exakt übernehmen |
| Google Auth fehlgeschlagen | OAuth abgelaufen | Credential neu autorisieren |
