WordPress Meetup Köln #116 – So automatisiert man WordPress mit n8n

Das Setup für n8n:

Docker-Image heruntergeladen: n8n Docker Hub (https://hub.docker.com/r/n8nio/n8n)


Umgebungsvariable angepasst (N8N_SECURE_COOKIE=false) für lokale Tests ohne HTTPS

Workflow gefunden: n8n Workflow für SEO-Blogs (https://n8n.io/workflows/11762-generate-e-e-a-t-seo-blog-drafts-for-wordpress-with-openai/)


Prompt und Workflow angepasst, getestet – und fertig.

Die bearbeitet Version des Workflows als JSON

{
  "name": "Generate E-E-A-T SEO blog drafts for WordPress with OpenAI",
  "nodes": [
    {
      "parameters": {
        "path": "plots-eeat-blog",
        "formTitle": "Create E-E-A-T WordPress Blog (Example)",
        "formDescription": "Fill this form to generate an SEO + E-E-A-T optimized blog post for example.com.",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Topic / Working Title",
              "requiredField": true
            },
            {
              "fieldLabel": "Primary (Focus) Keyword",
              "requiredField": true
            },
            {
              "fieldLabel": "Secondary Keywords (comma-separated)"
            },
            {
              "fieldLabel": "Target Audience (who is this for?)",
              "requiredField": true
            },
            {
              "fieldLabel": "Search Intent",
              "fieldType": "dropdown",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Informational"
                  },
                  {
                    "option": "Commercial"
                  },
                  {
                    "option": "Transactional"
                  },
                  {
                    "option": "Local"
                  }
                ]
              },
              "requiredField": true
            },
            {
              "fieldLabel": "Tone of Voice",
              "fieldType": "dropdown",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Friendly expert"
                  },
                  {
                    "option": "Professional"
                  },
                  {
                    "option": "Investor focused"
                  },
                  {
                    "option": "Sales-driven"
                  }
                ]
              },
              "requiredField": true
            },
            {
              "fieldLabel": "Preferred Word Count (e.g. 1500)",
              "fieldType": "number",
              "requiredField": true
            },
            {
              "fieldLabel": "Author / Brand Name",
              "requiredField": true
            },
            {
              "fieldLabel": "Author Credentials / Experience (for E-E-A-T)",
              "fieldType": "textarea",
              "requiredField": true
            },
            {
              "fieldLabel": "Real Experience / Project Notes (bullet style)",
              "fieldType": "textarea"
            }
          ]
        },
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "45607d74-1a8a-41ab-9186-2432311c15e9",
      "name": "Form",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        944,
        512
      ],
      "webhookId": "5f177de8-2e23-42e5-8b76-9ea2097eaa83",
      "typeVersion": 2
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "name": "WP_URL",
              "type": "string",
              "value": "https://update-heroes.de/",
              "id": "bc2699ee-7ba0-4275-9922-0587e0f42645"
            },
            {
              "name": "topic",
              "type": "string",
              "value": "={{ $json['Topic / Working Title'] }}",
              "id": "79089615-13aa-4b75-9cc3-d8f94449277b"
            },
            {
              "name": "focus_keyword",
              "type": "string",
              "value": "={{ $json['Primary (Focus) Keyword'] }}",
              "id": "dd5b8dee-8455-4f16-a283-bfda10f6cb65"
            },
            {
              "name": "secondary_keywords",
              "type": "string",
              "value": "={{ $json['Secondary Keywords (comma-separated)'] }}",
              "id": "24700192-de5c-4ee0-98c1-00af205422d8"
            },
            {
              "name": "target_audience",
              "type": "string",
              "value": "={{ $json['Target Audience (who is this for?)'] }}",
              "id": "b8860bee-011b-41b0-aaf9-90d945ccc39a"
            },
            {
              "name": "search_intent",
              "type": "string",
              "value": "={{ $json['Search Intent'] }}",
              "id": "456de7de-3e4a-4298-abd5-f099ff956a6a"
            },
            {
              "name": "tone",
              "type": "string",
              "value": "={{ $json['Tone of Voice'] }}",
              "id": "5e404836-32a1-4e24-9c48-fce13a906054"
            },
            {
              "name": "word_count",
              "type": "number",
              "value": "={{ $json['Preferred Word Count (e.g. 1500)'] }}",
              "id": "dd5a60dc-5d62-4268-8bda-504656a91c95"
            },
            {
              "name": "author_name",
              "type": "string",
              "value": "={{ $json['Author / Brand Name'] }}",
              "id": "578d965e-fe3d-421f-88b4-c28cc157bf98"
            },
            {
              "name": "author_experience",
              "type": "string",
              "value": "={{ $json['Author Credentials / Experience (for E-E-A-T)'] }}",
              "id": "ada9e5cd-1b7e-4602-be59-4e7cf1930463"
            },
            {
              "name": "experience_notes",
              "type": "string",
              "value": "={{ $json['Real Experience / Project Notes (bullet style)'] }}",
              "id": "0b15c8ea-244b-410d-9108-8098332e7f99"
            }
          ]
        },
        "options": {}
      },
      "id": "4b11a1e4-defe-4ccb-8b8b-c6c0303a7c55",
      "name": "Store Values",
      "type": "n8n-nodes-base.set",
      "position": [
        1232,
        512
      ],
      "typeVersion": 3.3
    },
    {
      "parameters": {
        "modelId": "gpt-4o-mini",
        "messages": {
          "values": [
            {
              "content": "=Sie sind SEO- und WordPress-Sicherheits-Content-Stratege.\nSie MÜSSEN AUSSCHLIESSLICH gültige JSON-Daten zurückgeben. Keine Markdown-Tags, keine Erklärungen.\nWenn etwas fehlt, verwenden Sie eine leere Zeichenfolge oder ein leeres Array.\n\nGehen Sie davon aus, dass der Artikel auf update-heroes.de veröffentlicht wird, einer Website, die von Update Heroes – Ihre Plattform für WordPress-Updates und -Optimierungen erstellt wurde.\n\nINPUT DATA (from form):\n{\n  \"topic\": \"{{ $json.topic }}\",\n  \"focus_keyword\": \"{{ $json.focus_keyword }}\",\n  \"secondary_keywords_raw\": \"{{ $json.secondary_keywords }}\",\n  \"target_audience\": \"{{ $json.target_audience }}\",\n  \"search_intent\": \"{{ $json.search_intent }}\",\n  \"tone\": \"{{ $json.tone }}\",\n  \"word_count\": {{ $json.word_count }},\n  \"author_name\": \"{{ $json.author_name }}\",\n  \"author_experience\": \"{{ $json.author_experience }}\",\n  \"experience_notes\": \"{{ $json.experience_notes }}\"\n}\n\nReturn JSON with this exact structure:\n{\n  \"metaTitle\": \"\",          // <= 60 characters, include focus keyword, clicky but natural\n  \"metaDescription\": \"\",    // <= 160 characters, include focus keyword once, natural\n  \"focusKeyword\": \"\",       // cleaned primary keyword\n  \"secondaryKeywords\": [],   // cleaned array, max 6\n  \"h1\": \"\",                 // main page H1\n  \"slug\": \"\",               // SEO slug, lowercase, hyphenated\n  \"outline\": [\n    {\n      \"id\": \"intro\",        // string id\n      \"heading\": \"\",        // H2 heading\n      \"purpose\": \"\",        // what this section does for reader\n      \"estimatedWordCount\": 0\n    }\n  ],\n  \"faqQuestions\": [],        // 3-7 long-tail questions\n  \"eeatNotes\": {\n    \"authorBio\": \"\",        // 1–2 sentence bio\n    \"trustSignals\": [],      // 3–6 short strings (e.g., years of experience, project count)\n    \"experienceToHighlight\": [] // 3–6 bullet-style points from notes\n  }\n}\n\nGuidelines:\n– Der Entwurf sollte in etwa der Gesamtwortzahl entsprechen.\n– Konzentrieren Sie sich auf Update Heroes – Ihre Plattform für WordPress-Updates und -Optimierungen und WordPress Wartung für eine sichere und leistungsstarke Website.\n– Die JSON-Datei MUSS direkt parsbar sein."
            }
          ]
        },
        "jsonOutput": true,
        "options": {
          "maxTokens": 2048
        }
      },
      "id": "256ee1bd-caba-4d42-bf77-ceefb5e99243",
      "name": "AI: Create Metadata + Outline",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1520,
        512
      ],
      "typeVersion": 1,
      "credentials": {
        "openAiApi": {
          "id": "niU9h36RbxUyRfXF",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c1",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.message.content.metaTitle }}",
              "rightValue": ""
            },
            {
              "id": "c2",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.message.content.metaDescription }}",
              "rightValue": ""
            },
            {
              "id": "c3",
              "operator": {
                "type": "array",
                "operation": "lengthGte",
                "rightType": "number"
              },
              "leftValue": "={{ $json.message.content.outline }}",
              "rightValue": "={{ 1 }}"
            }
          ]
        },
        "options": {}
      },
      "id": "038597a2-cfe1-46f2-8d72-00975c1d4ab3",
      "name": "Validate Output",
      "type": "n8n-nodes-base.if",
      "position": [
        1872,
        512
      ],
      "typeVersion": 2
    },
    {
      "parameters": {
        "modelId": "gpt-4o",
        "messages": {
          "values": [
            {
              "content": "=You are a senior SEO content writer specialized in Bangalore real estate.\nWrite the full blog post body in clean HTML only (no <html>, <head>, <body> tags).\n\nUse this metadata JSON:\n{{ $json.message.content | json }}\n\nContext:\n- Website: update-heroes.de (Update Heroes – Ihre Plattform für WordPress-Updates und -Optimierungen)\n- Target audience: {{ $('Store Values').first().json.target_audience }}\n- Search intent: {{ $('Store Values').first().json.search_intent }}\n- Tone: {{ $('Store Values').first().json.tone }}\n- Desired word count: {{ $('Store Values').first().json.word_count }}\n- Author: {{ $('Store Values').first().json.author_name }} with experience: {{ $('Store Values').first().json.author_experience }}\n- Real notes: {{ $('Store Values').first().json.experience_notes }}\nArticle Structure Requirements\n\nTitle Format:\nKeyword + Power Word + Zahl\n\nMeta Description:\nDas Haupt-Keyword muss direkt nach dem Titel enthalten sein\n\nOutline Requirements:\n- Mindestens 15 Überschriften/Sub-Überschriften\n- Hierarchische Struktur H1–H6\n- Nur ein H1 pro Artikel\n- Umfassende Abdeckung des WordPress-Themas\n- Natürliche Integration von LSI-Keywords\n\nContent Specifications:\n- Mindestlänge: 2500 Wörter\n- Lesbarkeit: Schulniveau 7\n- Tonfall: Formal, informativ, optimistisch\n- Keyword-Dichte: ca. 1,3%\n\nKeyword Placement:\n- Innerhalb der ersten 10 % des Textes\n- Mindestens einmal in einer Subüberschrift\n- 2–3 Mal im gesamten Artikeltext\n\nWriting Style Requirements:\n- Verwenden Sie Kontraktionen, wo sinnvoll\n- Übergangsphrasen einfügen\n- Satzstruktur variieren\n- Umgangssprachliche Wendungen dezent einbinden\n- Prinzipien von E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) beachten\n\nRequired Elements:\n- Umfassende Outline in Tabellenform\n- Mindestens 6 FAQs mit Antworten, **vor dem Fazit**\n- Mindestens ein relevanter externer Link\n- 700–800 Wörter pro Hauptüberschrift\n- Markdown-Formatierung für alle Überschriften\n- Mischung aus Absätzen, Listen und Tabellen\n- 100 % Originalinhalt\n\nExecution Instructions:\n- Zeigen Sie die Einleitungsnachricht\n- Generieren Sie die umfassende Outline\n- Schreiben Sie den kompletten Artikel gemäß den Vorgaben\n- Fügen Sie die Abschlussnachricht an\n- For each item in outline[], create an <h2> with that heading and detailed paragraphs underneath.\n- You may use <h3> subheadings where helpful.\n- At the end, add a section \"FAQ\" with each faqQuestions[] item as an <h3> question and a helpful answer.\n- Use only <p>, <h2>, <h3>, <ul>, <li>, <strong>, <em> tags.\n- Do NOT include meta title/description or JSON in the output.\n- Return ONLY the HTML body."
            }
          ]
        },
        "options": {
          "maxTokens": 4096
        }
      },
      "id": "54668a31-ed14-4f77-a107-0ef0792c3091",
      "name": "AI: Write Full Article",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        2432,
        112
      ],
      "typeVersion": 1,
      "credentials": {
        "openAiApi": {
          "id": "niU9h36RbxUyRfXF",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const meta = $('AI: Create Metadata + Outline').first().json.message.content;\nconst body = $('AI: Write Full Article').first().json.message.content;\n\nreturn [\n  {\n    title: meta.metaTitle,\n    h1: meta.h1 || meta.metaTitle,\n    slug: meta.slug,\n    metaDescription: meta.metaDescription,\n    focusKeyword: meta.focusKeyword,\n    secondaryKeywords: meta.secondaryKeywords,\n    imagePrompt: meta.imagePrompt,\n    bodyHtml: body\n  }\n];"
      },
      "id": "5dbdcfcf-e41f-4aae-ad9a-8827afe095f3",
      "name": "Compile Post",
      "type": "n8n-nodes-base.code",
      "position": [
        2272,
        320
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "title": "={{ $json.h1 }}",
        "additionalFields": {
          "content": "={{ $json.bodyHtml }}",
          "slug": "={{ $json.slug }}",
          "status": "draft"
        }
      },
      "id": "6d663829-0954-4f94-a2e8-6ef2f5fb9a26",
      "name": "Create WP Draft",
      "type": "n8n-nodes-base.wordpress",
      "position": [
        2528,
        320
      ],
      "typeVersion": 1,
      "credentials": {
        "wordpressApi": {
          "id": "LKuyAmHH18VmrEM7",
          "name": "Wordpress account"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={ \"message\": \"✅ Draft created on example.com with AI content and featured image.\" }",
        "options": {}
      },
      "id": "2903269e-5180-4e1a-80b0-0149074b5884",
      "name": "Respond: Success",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        2768,
        320
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={ \"message\": \"❌ There was a problem generating metadata / outline. Please tweak the inputs and try again.\" }",
        "options": {}
      },
      "id": "f9fa7511-d20d-40aa-b233-e401bfd8ffe3",
      "name": "Respond: Error",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        2240,
        960
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "## About the Workflow\n\nThis workflow automatically creates a complete, SEO-ready WordPress blog post using AI  from idea to published draft.\n\nYou fill out a simple form with your topic, keywords, audience, tone, word count, and author details. The workflow then plans the article, generates SEO metadata, writes the content in clean HTML, creates a featured image, and publishes everything as a WordPress draft.\n\nIts goal is to save time while maintaining high standards for SEO quality, structure, and E-E-A-T. The result is a fully packaged blog post ready for review and publishing.\n\nIdeal for:\n• SEO teams  \n• Content writers and agencies  \n• Real estate and local business websites  \n• Website owners scaling content production  \n\nBefore running the workflow, generate a WordPress Application Password for an administrator user and store it in the WordPress credentials in n8n. Once set up, the process runs end-to-end with no manual publishing steps.\n",
        "height": 512,
        "width": 480
      },
      "id": "7498fee1-eafb-4f88-9920-7174c892170c",
      "name": "📝 Blog Form",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        368,
        240
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "## 1.Form & Input Handling\n\nThe workflow starts with a form that collects the topic, keywords, audience, tone, and author experience. The Store Values node standardises this data so every following step receives clean and predictable input.\n",
        "height": 368,
        "width": 512,
        "color": 7
      },
      "id": "c4b99eae-df38-4e05-8a5d-c8ac4a7599ef",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        304
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "## 2.SEO Planning & Structure\n\nThis section builds the SEO foundation: metadata, headings, article outline, trust signals, and validation checks. The workflow stops early if essential SEO elements are missing.\n",
        "height": 368,
        "width": 576,
        "color": 7
      },
      "id": "6945c8a2-453b-4444-901e-7032a23501fb",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1472,
        304
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "## 3.Write → Package → Create Draft → Generate Image\n\nUsing the approved structure, the workflow writes the full article, packages all post data, creates a WordPress draft, and generates a featured image so the post is content-complete.\n\n## IMPORTANT\n\nGenerate an Application Password in WordPress for an administrator user.\n\nName your application: n8n-auto-blog  \nClick Generate.\n\nYou will receive a password like:\nABCD EFGH IJKL MNOP\n\nSave this password and add it to the WordPress credentials in n8n for this workflow to function correctly.\n",
        "height": 736,
        "width": 832,
        "color": 7
      },
      "id": "63d0a0ec-51a9-4430-8fbf-246018596c91",
      "name": "Sticky Note18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2144,
        -288
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Final Response\n\nA clear success or error response is returned so the user always knows the final result.\n",
        "height": 640,
        "width": 864,
        "color": 7
      },
      "id": "48fef7d4-1f5c-43da-88ad-fac14c97675f",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2128,
        528
      ],
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "Form": {
      "main": [
        [
          {
            "node": "Store Values",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compile Post": {
      "main": [
        [
          {
            "node": "Create WP Draft",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store Values": {
      "main": [
        [
          {
            "node": "AI: Create Metadata + Outline",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create WP Draft": {
      "main": [
        [
          {
            "node": "Respond: Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate Output": {
      "main": [
        [
          {
            "node": "AI: Write Full Article",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond: Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Write Full Article": {
      "main": [
        [
          {
            "node": "Compile Post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Create Metadata + Outline": {
      "main": [
        [
          {
            "node": "Validate Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false
  },
  "versionId": "97d9ca5c-63ed-4eef-b2ad-0dcc6bf5964b",
  "meta": {
    "templateId": "11762",
    "templateCredsSetupCompleted": true,
    "instanceId": "8b48860cd2f249c6b1cc30d678a5f1a3688eaf8f3357ef531dd99ca7eea0e0f4"
  },
  "id": "-8EkBBYy6vQDiYq16F3z8",
  "tags": []
}



Kommentare

Ein Kommentar zu „WordPress Meetup Köln #116 – So automatisiert man WordPress mit n8n“

  1. Lieber Silvio,

    vielen Dank für Deine Präsentation. Wieder mal wieder dazugelernt.

    Gruß J.T.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert