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 →
{
"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 '<';\n case '>': return '>';\n case '&': return '&';\n case '\\'': return ''';\n case '\"': return '"';\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
}
]
]
}
}
}
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
💡🌐 Essential Multipage Website Scraper with Jina.ai. Uses stickyNote, manualTrigger, splitInBatches, limit. Event-driven trigger; 16 nodes.
Stopanderror Wait. Uses manualTrigger, scheduleTrigger, splitInBatches, httpRequest. Event-driven trigger; 12 nodes.
Convert the JSON data received from the CocktailDB API in XML. Uses manualTrigger, httpRequest, xml. Event-driven trigger; 3 nodes.
Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest, stickyNote, manualTrigger. Event-driven trigger; 51 nodes.
Generate Leads with Google Maps - AlexK1919. Uses manualTrigger, scheduleTrigger, executeWorkflowTrigger, stopAndError. Event-driven trigger; 42 nodes.