AutomationFlowsGeneral › Post to WordPress via XML-RPC

Post to WordPress via XML-RPC

Original n8n title: Use Xmlrpc via Httprequest-node to Post on Wordpress.com

Use XMLRPC via HttpRequest-node to post on Wordpress.com. Uses manualTrigger, stickyNote, noOp, httpRequest. Event-driven trigger; 11 nodes.

Event trigger★★★★☆ complexity11 nodesHTTP RequestXML
General Trigger: Event Nodes: 11 Complexity: ★★★★☆ Added:

This workflow follows the HTTP Request → XML recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "yPIST7l13huQEjY5",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Use XMLRPC via HttpRequest-node to post on Wordpress.com",
  "tags": [
    {
      "id": "uumvgGHY5e6zEL7V",
      "name": "Published Template",
      "createdAt": "2025-02-10T11:18:10.923Z",
      "updatedAt": "2025-02-10T11:18:10.923Z"
    }
  ],
  "nodes": [
    {
      "id": "8a64ffca-804a-4793-a721-3cb670aec22f",
      "name": "Settings",
      "type": "n8n-nodes-base.set",
      "position": [
        -380,
        -700
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1be018c7-51fe-4ea2-967d-ce47a2e8795c",
              "name": "wordpressUrl",
              "type": "string",
              "value": "YOURBLOG.wordpress.com"
            },
            {
              "id": "95377f4f-184b-46a7-94c7-b2313c314cb2",
              "name": "wordpressUsername",
              "type": "string",
              "value": "YourUserName"
            },
            {
              "id": "fdc99dc6-d9b0-4d2f-b770-1d8b6b360cad",
              "name": "wordpressApplicationPassword",
              "type": "string",
              "value": "your 4app pass word"
            },
            {
              "id": "5aee5eef-9ad2-4dfb-a63f-1b5228c47e31",
              "name": "contentTitle",
              "type": "string",
              "value": "This is a demo title"
            },
            {
              "id": "2abf516c-2910-4cd0-89fe-119cd0e616c8",
              "name": "contentText",
              "type": "string",
              "value": "This is the main text."
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "157b9656-5d90-44f4-aa3c-1285cda698d8",
      "name": "ManualTrigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -580,
        -700
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "1d2f6916-e5bd-497b-9843-8bb5a48e9866",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -420,
        -820
      ],
      "parameters": {
        "width": 180,
        "height": 360,
        "content": "## Settings"
      },
      "typeVersion": 1
    },
    {
      "id": "1306446a-f628-44ba-9ca5-751b634bd5dd",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        140,
        -820
      ],
      "parameters": {
        "color": 5,
        "width": 720,
        "height": 360,
        "content": "## Response Handling"
      },
      "typeVersion": 1
    },
    {
      "id": "ec3006aa-34c8-4522-8c37-980f68f168b5",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -220,
        -820
      ],
      "parameters": {
        "color": 3,
        "width": 340,
        "height": 360,
        "content": "## Request Sending"
      },
      "typeVersion": 1
    },
    {
      "id": "bc918075-bea5-4a27-90d9-874b0917a958",
      "name": "Success",
      "type": "n8n-nodes-base.noOp",
      "position": [
        660,
        -780
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "3ea541b7-080e-4694-b865-d7d04f69ea0c",
      "name": "Error",
      "type": "n8n-nodes-base.noOp",
      "position": [
        660,
        -620
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "457c0687-ac1d-49e2-b434-6e1de9acb3a3",
      "name": "PrepareXML",
      "type": "n8n-nodes-base.code",
      "notes": "(request payload, escaping)",
      "position": [
        -180,
        -700
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const input = $json; // If other nodes are in between: $('Settings').item.json;\n\nconst username = input.wordpressUsername;\nconst password = input.wordpressApplicationPassword;\nconst title = input.contentTitle;\nconst text = input.contentText;\n\nconst blogId = 0;\nconst published = 1; // 0 = draft, 1 = published\n\n\n// Helper function to escape XML special characters\nfunction escapeXml(unsafe) {\n  return unsafe.replace(/[<>&'\"]/g, (c) => {\n    switch (c) {\n      case '<': return '&lt;';\n      case '>': return '&gt;';\n      case '&': return '&amp;';\n      case '\\'': return '&apos;';\n      case '\"': return '&quot;';\n      default: return c;\n    }\n  });\n}\n\n// Your actual post text, which may contain characters needing escaping\nconst titleEscaped = escapeXml(title);\nconst textEscaped = escapeXml(text);\n\n// Build the XML payload\nconst xmlData = `<?xml version=\"1.0\"?>\n<methodCall>\n  <methodName>wp.newPost</methodName>\n  <params>\n    <param>\n      <value><string>${blogId}</string></value>\n    </param>\n    <param>\n      <value><string>${username}</string></value>\n    </param>\n    <param>\n      <value><string>${password}</string></value>\n    </param>\n    <param>\n      <value>\n        <struct>\n          <member>\n            <name>post_title</name>\n            <value><string>${titleEscaped}</string></value>\n          </member>\n          <member>\n            <name>post_content</name>\n            <value><string>${textEscaped}</string></value>\n          </member>\n        </struct>\n      </value>\n    </param>\n    <param>\n      <value><boolean>${published}</boolean></value>\n    </param>\n  </params>\n</methodCall>`;\n\n\n// Add a new field called 'myNewField' to the JSON of the item\n$input.item.json.xmlRequestBody = xmlData;\n\nreturn $input.item;"
      },
      "notesInFlow": true,
      "typeVersion": 2
    },
    {
      "id": "3f29f3ed-f7ae-475b-bce3-04d3eeeacee9",
      "name": "PostRequest",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -20,
        -700
      ],
      "parameters": {
        "url": "=https://{{ $('Settings').item.json.wordpressUrl }}/xmlrpc.php",
        "body": "={{ $json.xmlRequestBody }}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "raw",
        "sendHeaders": true,
        "rawContentType": "text/xml",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "text/xml"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "5f320d9b-8aa9-4d13-83db-86acaf444e92",
      "name": "IsSuccessful",
      "type": "n8n-nodes-base.if",
      "position": [
        420,
        -700
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "815d85a1-8f91-4338-977f-503f02c53ea2",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.methodResponse.params.param.value }}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "3a37d19a-12d3-474b-840f-c09342eecca9",
      "name": "HandleResponse",
      "type": "n8n-nodes-base.xml",
      "position": [
        220,
        -700
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "78f90dc5-6209-4db0-b6c6-9f2324488605",
  "connections": {
    "Settings": {
      "main": [
        [
          {
            "node": "PrepareXML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PrepareXML": {
      "main": [
        [
          {
            "node": "PostRequest",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PostRequest": {
      "main": [
        [
          {
            "node": "HandleResponse",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IsSuccessful": {
      "main": [
        [
          {
            "node": "Success",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ManualTrigger": {
      "main": [
        [
          {
            "node": "Settings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HandleResponse": {
      "main": [
        [
          {
            "node": "IsSuccessful",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow enables you to publish blog posts directly to your WordPress.com site using XML-RPC calls through n8n's HttpRequest node, saving time on manual content uploads and ensuring seamless integration with your automation setup. It's ideal for content creators, marketers, or developers who need to automate posting from external sources like spreadsheets or other apps without relying on WordPress's official API. The key step involves the PrepareXML node, which formats your post data into the required XML structure before sending it via HttpRequest to WordPress.com.

Use this workflow when you want a lightweight, event-driven way to post articles triggered by manual input or external events, especially if you're avoiding WordPress.com's REST API limitations. Avoid it for high-volume posting or sites requiring complex authentication, as XML-RPC can be less secure and slower than modern alternatives. Common variations include adapting it to pull content from Google Sheets before posting or adding error handling for failed uploads.

About this workflow

Use XMLRPC via HttpRequest-node to post on Wordpress.com. Uses manualTrigger, stickyNote, noOp, httpRequest. Event-driven trigger; 11 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

💡🌐 Essential Multipage Website Scraper with Jina.ai. Uses stickyNote, manualTrigger, splitInBatches, limit. Event-driven trigger; 16 nodes.

HTTP Request, XML, Google Drive
General

Stopanderror Wait. Uses manualTrigger, scheduleTrigger, splitInBatches, httpRequest. Event-driven trigger; 12 nodes.

HTTP Request, XML, Stop And Error
General

Convert the JSON data received from the CocktailDB API in XML. Uses manualTrigger, httpRequest, xml. Event-driven trigger; 3 nodes.

HTTP Request, XML
General

Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest, stickyNote, manualTrigger. Event-driven trigger; 51 nodes.

HTTP Request
General

Generate Leads with Google Maps - AlexK1919. Uses manualTrigger, scheduleTrigger, executeWorkflowTrigger, stopAndError. Event-driven trigger; 42 nodes.

Execute Workflow Trigger, Stop And Error, HTTP Request +1